From 8f500638f0d5fbb56a33c2b58593a2824a33164d Mon Sep 17 00:00:00 2001 From: Aparna Ullas Date: Sun, 4 Dec 2022 01:55:54 +0530 Subject: [PATCH 1/8] Fork Resolution --- .../rubix/TokenTransfer/ForkResolution.java | 87 + .../rubix/TokenTransfer/TokenReceiver.java | 134 +- src/com/rubix/TokenTransfer/TokenSender.java | 3263 +++++++++-------- 3 files changed, 1800 insertions(+), 1684 deletions(-) create mode 100644 src/com/rubix/TokenTransfer/ForkResolution.java diff --git a/src/com/rubix/TokenTransfer/ForkResolution.java b/src/com/rubix/TokenTransfer/ForkResolution.java new file mode 100644 index 0000000..8235dd3 --- /dev/null +++ b/src/com/rubix/TokenTransfer/ForkResolution.java @@ -0,0 +1,87 @@ +package com.rubix.TokenTransfer; + +import com.rubix.Resources.IPFSNetwork; +import org.apache.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.IOException; +import java.util.ArrayList; + +public class ForkResolution { + public static Logger ForkResolutionLogger = Logger.getLogger(TokenReceiver.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 { + boolean resolution = true; + /** + * 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 + */ + + 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"); + + + boolean tokenOwners = true; + + try { + ForkResolutionLogger.debug("Checking owners for " + token + " Please wait..."); + pinOwnersArrayTransferToken = IPFSNetwork.dhtOwnerCheck(token); + + if (pinOwnersArrayTransferToken.size() > 2) { + + 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())) + tokenOwners = false; + } + } + else + ForkResolutionLogger.debug("Token " + token + " has not multiple pins. Passed !!!"); + } catch (IOException | InterruptedException e) { + ForkResolutionLogger.debug("Ipfs dht find did not execute"); + } + + if (!tokenOwners) { + JSONObject lastObject = tokenChain.getJSONObject(tokenChain.length() - 1); + ForkResolutionLogger.debug("Last Object of token " + token + ": " + lastObject); + if(lastObject.has("pledgeToken")){ + String pledgeToken = lastObject.getString("pledgeToken"); + ForkResolutionLogger.debug("Checking owners for pledgeToken" + pledgeToken + " Please wait..."); + pinOwnersArrayPledgedToken = IPFSNetwork.dhtOwnerCheck(pledgeToken); + if (pinOwnersArrayPledgedToken.size() != 1) { + resolution = false; + resolutionMessage = "Pledge token has more than one owner"; + }else + ForkResolutionLogger.debug("Pledged Token " + pledgeToken + " has not multiple pins. Passed !!!"); + } + else { + resolution = false; + resolutionMessage = "Transfer token has more owner and no token pledged for"; + } + } + + return resolution; + } +} diff --git a/src/com/rubix/TokenTransfer/TokenReceiver.java b/src/com/rubix/TokenTransfer/TokenReceiver.java index c3ec9d5..87e75a6 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; @@ -224,60 +218,32 @@ public static String receive() { 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"); - } - - 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) { + Double decimalPart = formatAmount(amount - intPart); - TokenReceiverLogger.debug("Ipfs dht find did not execute"); + boolean forkResolution = true; + JSONArray forkedTokens = new JSONArray(); + for (int i = 0; i < wholeTokens.length(); ++i) { + TokenReceiverLogger.debug("Fork Checking for token: " + wholeTokens.getString(i)); + JSONObject forkObject = new JSONObject(); + forkObject.put("token", wholeTokens.getString(i)); + forkObject.put("tokenChain", wholeTokenChains.getJSONArray(i)); + forkObject.put("previousSendersArray", previousSendersArray); + 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 (!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()); + 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", "Multiple Owners for " + doubleSpentToken + " " + owners); + APIResponse.put("message", "Fork not resolved"); IPFSNetwork.executeIPFSCommands(" ipfs p2p close -t /p2p/" + senderPeerID); output.close(); input.close(); @@ -285,7 +251,67 @@ public static String receive() { ss.close(); return APIResponse.toString(); } - // ? multiple pin check ends + + +// ? 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); diff --git a/src/com/rubix/TokenTransfer/TokenSender.java b/src/com/rubix/TokenTransfer/TokenSender.java index 519a040..a502973 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,671 +25,672 @@ 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.*; public class TokenSender { - private static final Logger TokenSenderLogger = Logger.getLogger(TokenSender.class); - private static final Logger eventLogger = Logger.getLogger("eventLogger"); - public static BufferedReader serverInput; - private static JSONObject detailsObject = new JSONObject(); - private static JSONArray quorumArray = new JSONArray(); - private 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(); - private static JSONArray allTokens = new JSONArray(); - private static boolean newPart = false, oldNew = false; - private static Double decimalAmount = -1.00; - private static String PART_TOKEN_CHAIN_PATH = TOKENCHAIN_PATH.concat("PARTS/"); - private static String PART_TOKEN_PATH = TOKENS_PATH.concat("PARTS/"); - private static String senderPayloadHash = null; - private static int intPart = -1; - private static int wholeAmount = -1; - private static PrintStream output; - private static BufferedReader input; - private static Socket senderSocket; - private static boolean senderMutex = false; - public static String authSenderByRecHash; - - public static void resetVariables() { - 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(); - partTokenChainHash = new JSONArray(); - lastObJsonArray = new JSONArray(); - partTokenChainsPrevState = new JSONObject(); - tokenChainPath = ""; - tokenPath = ""; - amountLedger = new JSONObject(); - allTokens = new JSONArray(); - newPart = false; - oldNew = false; - decimalAmount = -1.00; - PART_TOKEN_CHAIN_PATH = TOKENCHAIN_PATH.concat("PARTS/"); - PART_TOKEN_PATH = TOKENS_PATH.concat("PARTS/"); - senderPayloadHash = null; - intPart = -1; - wholeAmount = -1; - senderMutex = false; - authSenderByRecHash = ""; - TokenSenderLogger.debug("Cleanup completed"); - } - - /** - * A sender node to transfer tokens - * - * @param data Details required for tokenTransfer - * @param ipfs IPFS instance - * @param port Sender port for communication - * @return Transaction Details (JSONObject) - * @throws IOException handles IO Exceptions - * @throws JSONException handles JSON Exceptions - * @throws NoSuchAlgorithmException handles No Such Algorithm Exceptions - */ - public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exception { - repo(ipfs); - resetVariables(); - JSONObject APIResponse = new JSONObject(); - PropertyConfigurator.configure(LOGGER_PATH + "log4jWallet.properties"); - - JSONObject challengeObject = new JSONObject(); - - detailsObject = new JSONObject(data); - String receiverDidIpfsHash = detailsObject.getString("receiverDidIpfsHash"); - syncDataTableByDID(receiverDidIpfsHash); - String pvt = detailsObject.getString("pvt"); - double requestedAmount = detailsObject.getDouble("amount"); - int type = detailsObject.getInt("type"); - String comment = detailsObject.getString("comment"); - String keyPass = detailsObject.getString("pvtKeyPass"); - PrivateKey pvtKey = null; - pvtKey = getPvtKey(keyPass, 1); - - // If user enters wrong pvt key password - if (pvtKey == null) { - APIResponse.put("message", - "Incorrect password entered for Private Key, cannot proceed with the transaction"); - TokenSenderLogger.warn("Incorrect Private Key password entered"); - return APIResponse; - } - - // detailsObject.remove("pvtKeyPass"); - - APIResponse = new JSONObject(); - - intPart = (int) requestedAmount; - String senderPeerID = getPeerID(DATA_PATH + "DID.json"); - TokenSenderLogger.debug("sender peer id" + senderPeerID); - String senderDidIpfsHash = getValues(DATA_PATH + "DataTable.json", "didHash", "peerid", senderPeerID); - TokenSenderLogger.debug("sender did ipfs hash" + senderDidIpfsHash); - - if (senderMutex) { - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Sender busy. Try again later"); - TokenSenderLogger.warn("Sender busy"); - return APIResponse; - } - - senderMutex = true; - - File partFolder = new File(PART_TOKEN_PATH); - if (!partFolder.exists()) - partFolder.mkdir(); - partFolder = new File(PART_TOKEN_CHAIN_PATH); - if (!partFolder.exists()) - partFolder.mkdir(); - File partTokensFile = new File(PAYMENTS_PATH.concat("PartsToken.json")); - if (!partTokensFile.exists()) { - partTokensFile.createNewFile(); - writeToFile(partTokensFile.toString(), "[]", false); - } - - 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 ; - if (intPart <= bankArray.length()) - wholeAmount = intPart; - else - wholeAmount = bankArray.length(); - - TokenSenderLogger.debug("wholeAmount is "+wholeAmount); - - for (int i = 0; i < wholeAmount; i++) { - 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 - String tokenRemove = wholeTokens.getString(i); - for (int j = 0; j < bankArray.length(); j++) { - if (bankArray.getJSONObject(j).getString("tokenHash").equals(tokenRemove)) - bankArray.remove(j); - } - } - - for (int i = 0; i < wholeTokens.length(); i++) { - File token = new File(TOKENS_PATH + wholeTokens.get(i)); - File tokenchain = new File(TOKENCHAIN_PATH + wholeTokens.get(i) + ".json"); - if (!(token.exists() && tokenchain.exists())) { - TokenSenderLogger.info("Tokens Not Verified"); - senderMutex = false; - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Invalid token(s)"); - return APIResponse; - - } - String wholeTokenHash = add(TOKENS_PATH + wholeTokens.get(i), ipfs); - pin(wholeTokenHash, ipfs); - String tokenChainHash = add(TOKENCHAIN_PATH + wholeTokens.get(i) + ".json", ipfs); - wholeTokenChainHash.put(tokenChainHash); - - String tokenChainFileContent = readFile(TOKENCHAIN_PATH + wholeTokens.get(i) + ".json"); - JSONArray tokenChainFileArray = new JSONArray(tokenChainFileContent); - JSONArray previousSenderArray = new JSONArray(); - - if (tokenChainFileArray.length() > 0) { - // JSONObject lastObject = - // tokenChainFileArray.getJSONObject(tokenChainFileArray.length() - 1); - - TokenSenderLogger.debug("Reading TokenChain file : " + TOKENCHAIN_PATH + wholeTokens.get(i) + ".json"); - for (int j = 0; j < tokenChainFileArray.length(); j++) { + 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(); + private 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(); + private static JSONObject partTokenChainsPrevState = new JSONObject(); + private static String tokenChainPath = "", tokenPath = ""; + private static JSONObject amountLedger = new JSONObject(); + private static JSONArray allTokens = new JSONArray(); + private static boolean newPart = false, oldNew = false; + private static Double decimalAmount = -1.00; + private static String PART_TOKEN_CHAIN_PATH = TOKENCHAIN_PATH.concat("PARTS/"); + private static String PART_TOKEN_PATH = TOKENS_PATH.concat("PARTS/"); + private static String senderPayloadHash = null; + private static int intPart = -1; + private static int wholeAmount = -1; + private static PrintStream output; + private static BufferedReader input; + private static Socket senderSocket; + private static boolean senderMutex = false; + + public static void resetVariables() { + 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(); + partTokenChainHash = new JSONArray(); + lastObJsonArray = new JSONArray(); + partTokenChainsPrevState = new JSONObject(); + tokenChainPath = ""; + tokenPath = ""; + amountLedger = new JSONObject(); + allTokens = new JSONArray(); + newPart = false; + oldNew = false; + decimalAmount = -1.00; + PART_TOKEN_CHAIN_PATH = TOKENCHAIN_PATH.concat("PARTS/"); + PART_TOKEN_PATH = TOKENS_PATH.concat("PARTS/"); + senderPayloadHash = null; + intPart = -1; + wholeAmount = -1; + senderMutex = false; + authSenderByRecHash = ""; + TokenSenderLogger.debug("Cleanup completed"); + } + + /** + * A sender node to transfer tokens + * + * @param data Details required for tokenTransfer + * @param ipfs IPFS instance + * @param port Sender port for communication + * @return Transaction Details (JSONObject) + * @throws IOException handles IO Exceptions + * @throws JSONException handles JSON Exceptions + * @throws NoSuchAlgorithmException handles No Such Algorithm Exceptions + */ + public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exception { + repo(ipfs); + resetVariables(); + JSONObject APIResponse = new JSONObject(); + PropertyConfigurator.configure(LOGGER_PATH + "log4jWallet.properties"); + + JSONObject challengeObject = new JSONObject(); + + detailsObject = new JSONObject(data); + String receiverDidIpfsHash = detailsObject.getString("receiverDidIpfsHash"); + syncDataTableByDID(receiverDidIpfsHash); + String pvt = detailsObject.getString("pvt"); + double requestedAmount = detailsObject.getDouble("amount"); + int type = detailsObject.getInt("type"); + String comment = detailsObject.getString("comment"); + String keyPass = detailsObject.getString("pvtKeyPass"); + PrivateKey pvtKey = null; + pvtKey = getPvtKey(keyPass, 1); + + // If user enters wrong pvt key password + if (pvtKey == null) { + APIResponse.put("message", + "Incorrect password entered for Private Key, cannot proceed with the transaction"); + TokenSenderLogger.warn("Incorrect Private Key password entered"); + return APIResponse; + } + + // detailsObject.remove("pvtKeyPass"); + + APIResponse = new JSONObject(); + + intPart = (int) requestedAmount; + String senderPeerID = getPeerID(DATA_PATH + "DID.json"); + TokenSenderLogger.debug("sender peer id" + senderPeerID); + String senderDidIpfsHash = getValues(DATA_PATH + "DataTable.json", "didHash", "peerid", senderPeerID); + TokenSenderLogger.debug("sender did ipfs hash" + senderDidIpfsHash); + + if (senderMutex) { + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Sender busy. Try again later"); + TokenSenderLogger.warn("Sender busy"); + return APIResponse; + } + + senderMutex = true; + + File partFolder = new File(PART_TOKEN_PATH); + if (!partFolder.exists()) + partFolder.mkdir(); + partFolder = new File(PART_TOKEN_CHAIN_PATH); + if (!partFolder.exists()) + partFolder.mkdir(); + File partTokensFile = new File(PAYMENTS_PATH.concat("PartsToken.json")); + if (!partTokensFile.exists()) { + partTokensFile.createNewFile(); + writeToFile(partTokensFile.toString(), "[]", false); + } + + 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 ; + if (intPart <= bankArray.length()) + wholeAmount = intPart; + else + wholeAmount = bankArray.length(); + + TokenSenderLogger.debug("wholeAmount is " + wholeAmount); + + for (int i = 0; i < wholeAmount; i++) { + 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 + String tokenRemove = wholeTokens.getString(i); + for (int j = 0; j < bankArray.length(); j++) { + if (bankArray.getJSONObject(j).getString("tokenHash").equals(tokenRemove)) + bankArray.remove(j); + } + } + + for (int i = 0; i < wholeTokens.length(); i++) { + File token = new File(TOKENS_PATH + wholeTokens.get(i)); + File tokenchain = new File(TOKENCHAIN_PATH + wholeTokens.get(i) + ".json"); + if (!(token.exists() && tokenchain.exists())) { + TokenSenderLogger.info("Tokens Not Verified"); + senderMutex = false; + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Invalid token(s)"); + return APIResponse; + + } + String wholeTokenHash = add(TOKENS_PATH + wholeTokens.get(i), ipfs); + pin(wholeTokenHash, ipfs); + String tokenChainHash = add(TOKENCHAIN_PATH + wholeTokens.get(i) + ".json", ipfs); + wholeTokenChainHash.put(tokenChainHash); + + String tokenChainFileContent = readFile(TOKENCHAIN_PATH + wholeTokens.get(i) + ".json"); + JSONArray tokenChainFileArray = new JSONArray(tokenChainFileContent); + JSONArray previousSenderArray = new JSONArray(); + + if (tokenChainFileArray.length() > 0) { + // JSONObject lastObject = + // tokenChainFileArray.getJSONObject(tokenChainFileArray.length() - 1); + + 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); - String peerID = getValues(DATA_PATH + "DataTable.json", "peerid", "didHash", - tokenChainFileArray.getJSONObject(j).getString("sender")); - previousSenderArray.put(peerID); - } - } - - JSONObject previousSenderObject = new JSONObject(); - previousSenderObject.put("token", wholeTokenHash); - previousSenderObject.put("sender", previousSenderArray); - tokenPreviousSender.put(previousSenderObject); - - } - - decimalAmount = requestedAmount - wholeAmount; - decimalAmount = formatAmount(decimalAmount); - - TokenSenderLogger.debug("Decimal Part: " + decimalAmount); - if (decimalAmount > 0.000D) { - TokenSenderLogger.debug("Decimal Amount > 0.000D"); - String partFileContent = readFile(partTokensFile.toString()); - JSONArray partContentArray = new JSONArray(partFileContent); - - if (partContentArray.length() == 0) { - newPart = true; - TokenSenderLogger.debug("New token for parts"); - String chosenToken = bankArray.getJSONObject(0).getString("tokenHash"); - partTokens.put(chosenToken); - amountLedger.put(chosenToken, formatAmount(decimalAmount)); - - } else { - Double counter = decimalAmount; - JSONArray selectParts = new JSONArray(partFileContent); - while (counter > 0.000D) { - counter = formatAmount(counter); - TokenSenderLogger.debug("Counter: " + formatAmount(counter)); - if (!(selectParts.length() == 0)) { - TokenSenderLogger.debug("Old Parts"); - String currentPartToken = selectParts.getJSONObject(0).getString("tokenHash"); - Double currentPartBalance = partTokenBalance(currentPartToken); - currentPartBalance = formatAmount(currentPartBalance); - if (counter >= currentPartBalance) - amountLedger.put(currentPartToken, formatAmount(currentPartBalance)); - else - amountLedger.put(currentPartToken, formatAmount(counter)); - - partTokens.put(currentPartToken); - counter -= currentPartBalance; - selectParts.remove(0); - } else { - oldNew = true; - TokenSenderLogger.debug("Old Parts then new parts"); - String chosenToken = bankArray.getJSONObject(0).getString("tokenHash"); - partTokens.put(chosenToken); - amountLedger.put(chosenToken, formatAmount(counter)); - File tokenFile = new File(TOKENS_PATH.concat(chosenToken)); - tokenFile.renameTo(new File(PART_TOKEN_PATH.concat(chosenToken))); - File chainFile = new File(TOKENCHAIN_PATH.concat(chosenToken).concat(".json")); - chainFile.renameTo(new File(PART_TOKEN_CHAIN_PATH.concat(chosenToken).concat(".json"))); - - File shiftedFile = new File(PAYMENTS_PATH.concat("ShiftedTokens.json")); - if (!shiftedFile.exists()) { - shiftedFile.createNewFile(); - JSONArray shiftedTokensArray = new JSONArray(); - shiftedTokensArray.put(chosenToken); - writeToFile(PAYMENTS_PATH.concat("ShiftedTokens.json"), shiftedTokensArray.toString(), - false); - } else { - String shiftedContent = readFile(PAYMENTS_PATH.concat("ShiftedTokens.json")); - JSONArray shiftedArray = new JSONArray(shiftedContent); - shiftedArray.put(chosenToken); - writeToFile(PAYMENTS_PATH.concat("ShiftedTokens.json"), shiftedArray.toString(), false); - } - counter = 0.000D; - } - } - } - } - - if (newPart) { - tokenChainPath = TOKENCHAIN_PATH; - tokenPath = TOKENS_PATH; - } else { - tokenChainPath = TOKENCHAIN_PATH.concat("PARTS/"); - tokenPath = TOKENS_PATH.concat("PARTS/"); - } - - TokenSenderLogger.debug("Tokenchain path: " + tokenChainPath); - TokenSenderLogger.debug("Token path: " + tokenPath); - for (int i = 0; i < partTokens.length(); i++) { - File token = new File(tokenPath.concat(partTokens.getString(i))); - File tokenchain = new File(tokenChainPath.concat(partTokens.getString(i)) + ".json"); - if (!(token.exists() && tokenchain.exists())) { - if (!token.exists()) - TokenSenderLogger.debug("Token File for parts not avail"); - if (!tokenchain.exists()) - TokenSenderLogger.debug("Token Chain File for parts not avail"); - - TokenSenderLogger.info("Tokens Not Verified"); - senderMutex = false; - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Invalid part token(s)"); - return APIResponse; - - } - String hash = add(tokenPath + partTokens.getString(i), ipfs); - pin(hash, ipfs); - - String chainContent = readFile(tokenChainPath.concat(partTokens.getString(i)).concat(".json")); - - JSONArray chainArray = new JSONArray(); - JSONArray finalChainArray = new JSONArray(chainContent); - for (int j = 0; j < finalChainArray.length(); j++) { - JSONObject object = finalChainArray.getJSONObject(j); - /* - * if (finalChainArray.length() == 1) { object.put("previousHash", ""); - * object.put("nextHash", ""); } else if (finalChainArray.length() > 1) { if (j - * == 0) { object.put("previousHash", ""); object.put("nextHash", - * calculateHash(finalChainArray.getJSONObject(j + 1).getString("tid"), - * "SHA3-256")); } else if (j == finalChainArray.length() - 1) { - * object.put("previousHash", calculateHash(finalChainArray.getJSONObject(j - - * 1).getString("tid"), "SHA3-256")); object.put("nextHash", ""); } else { - * object.put("previousHash", calculateHash(finalChainArray.getJSONObject(j - - * 1).getString("tid"), "SHA3-256")); object.put("nextHash", - * calculateHash(finalChainArray.getJSONObject(j + 1).getString("tid"), - * "SHA3-256")); } } - */ - - if (object.has("nextHash") && object.has("previousHash")) { - object.remove("nextHash"); - object.remove("previousHash"); - } - - chainArray.put(object); - - } - - partTokenChainsPrevState.put(partTokens.getString(i), chainArray); - // TokenSenderLogger.debug("Part token chain to be sent for verification: - // "+prevStateChainContent); - - writeToFile(tokenChainPath.concat(partTokens.getString(i)).concat(".json"), chainArray.toString(), false); - - partTokenChainHash.put(add(tokenChainPath.concat(partTokens.getString(i)).concat(".json"), ipfs)); - } - TokenSenderLogger.debug("Completed tokens selection"); - - authSenderByRecHash = calculateHash( - wholeTokens.toString() + wholeTokenChainHash.toString() + partTokens.toString() - + partTokenChainHash.toString() + receiverDidIpfsHash + senderDidIpfsHash + comment, - "SHA3-256"); - 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); - - challengeObject.put("authSenderByRecHash", authSenderByRecHash); - - for (int i = 0; i < wholeTokens.length(); i++) - allTokens.put(wholeTokens.getString(i)); - for (int i = 0; i < partTokens.length(); i++) - 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 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"); - 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; - - } - } - - String errMessage = null; - for (int i = 0; i < quorumArray.length(); i++) { - - if (quorumArray.get(i).equals(senderDidIpfsHash)) { - TokenSenderLogger.error("SenderDID " + senderDidIpfsHash + " cannot be a Quorum"); - errMessage = "SenderDID " + senderDidIpfsHash; - } - if (quorumArray.get(i).equals(receiverDidIpfsHash)) { - TokenSenderLogger.error("ReceiverDID " + receiverDidIpfsHash + " cannot be a Quorum"); - if (errMessage != null) { - errMessage = errMessage + " and "; - } - errMessage = "ReceiverDID " + receiverDidIpfsHash; - } - if (errMessage != null) { - APIResponse.put("status", "Failed"); - APIResponse.put("message", errMessage + " cannot be a Quorum "); - return APIResponse; - } - - } - - TokenSenderLogger.debug("Updated quorumlist is " + quorumArray.toString()); + String peerID = getValues(DATA_PATH + "DataTable.json", "peerid", "didHash", + tokenChainFileArray.getJSONObject(j).getString("sender")); + previousSenderArray.put(peerID); + } + } + + JSONObject previousSenderObject = new JSONObject(); + previousSenderObject.put("token", wholeTokenHash); + previousSenderObject.put("sender", previousSenderArray); + tokenPreviousSender.put(previousSenderObject); + + } + + decimalAmount = requestedAmount - wholeAmount; + decimalAmount = formatAmount(decimalAmount); + + TokenSenderLogger.debug("Decimal Part: " + decimalAmount); + if (decimalAmount > 0.000D) { + TokenSenderLogger.debug("Decimal Amount > 0.000D"); + String partFileContent = readFile(partTokensFile.toString()); + JSONArray partContentArray = new JSONArray(partFileContent); + + if (partContentArray.length() == 0) { + newPart = true; + TokenSenderLogger.debug("New token for parts"); + String chosenToken = bankArray.getJSONObject(0).getString("tokenHash"); + partTokens.put(chosenToken); + amountLedger.put(chosenToken, formatAmount(decimalAmount)); + + } else { + Double counter = decimalAmount; + JSONArray selectParts = new JSONArray(partFileContent); + while (counter > 0.000D) { + counter = formatAmount(counter); + TokenSenderLogger.debug("Counter: " + formatAmount(counter)); + if (!(selectParts.length() == 0)) { + TokenSenderLogger.debug("Old Parts"); + String currentPartToken = selectParts.getJSONObject(0).getString("tokenHash"); + Double currentPartBalance = partTokenBalance(currentPartToken); + currentPartBalance = formatAmount(currentPartBalance); + if (counter >= currentPartBalance) + amountLedger.put(currentPartToken, formatAmount(currentPartBalance)); + else + amountLedger.put(currentPartToken, formatAmount(counter)); + + partTokens.put(currentPartToken); + counter -= currentPartBalance; + selectParts.remove(0); + } else { + oldNew = true; + TokenSenderLogger.debug("Old Parts then new parts"); + String chosenToken = bankArray.getJSONObject(0).getString("tokenHash"); + partTokens.put(chosenToken); + amountLedger.put(chosenToken, formatAmount(counter)); + File tokenFile = new File(TOKENS_PATH.concat(chosenToken)); + tokenFile.renameTo(new File(PART_TOKEN_PATH.concat(chosenToken))); + File chainFile = new File(TOKENCHAIN_PATH.concat(chosenToken).concat(".json")); + chainFile.renameTo(new File(PART_TOKEN_CHAIN_PATH.concat(chosenToken).concat(".json"))); + + File shiftedFile = new File(PAYMENTS_PATH.concat("ShiftedTokens.json")); + if (!shiftedFile.exists()) { + shiftedFile.createNewFile(); + JSONArray shiftedTokensArray = new JSONArray(); + shiftedTokensArray.put(chosenToken); + writeToFile(PAYMENTS_PATH.concat("ShiftedTokens.json"), shiftedTokensArray.toString(), + false); + } else { + String shiftedContent = readFile(PAYMENTS_PATH.concat("ShiftedTokens.json")); + JSONArray shiftedArray = new JSONArray(shiftedContent); + shiftedArray.put(chosenToken); + writeToFile(PAYMENTS_PATH.concat("ShiftedTokens.json"), shiftedArray.toString(), false); + } + counter = 0.000D; + } + } + } + } + + if (newPart) { + tokenChainPath = TOKENCHAIN_PATH; + tokenPath = TOKENS_PATH; + } else { + tokenChainPath = TOKENCHAIN_PATH.concat("PARTS/"); + tokenPath = TOKENS_PATH.concat("PARTS/"); + } + + TokenSenderLogger.debug("Tokenchain path: " + tokenChainPath); + TokenSenderLogger.debug("Token path: " + tokenPath); + for (int i = 0; i < partTokens.length(); i++) { + File token = new File(tokenPath.concat(partTokens.getString(i))); + File tokenchain = new File(tokenChainPath.concat(partTokens.getString(i)) + ".json"); + if (!(token.exists() && tokenchain.exists())) { + if (!token.exists()) + TokenSenderLogger.debug("Token File for parts not avail"); + if (!tokenchain.exists()) + TokenSenderLogger.debug("Token Chain File for parts not avail"); + + TokenSenderLogger.info("Tokens Not Verified"); + senderMutex = false; + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Invalid part token(s)"); + return APIResponse; + + } + String hash = add(tokenPath + partTokens.getString(i), ipfs); + pin(hash, ipfs); + + String chainContent = readFile(tokenChainPath.concat(partTokens.getString(i)).concat(".json")); + + JSONArray chainArray = new JSONArray(); + JSONArray finalChainArray = new JSONArray(chainContent); + for (int j = 0; j < finalChainArray.length(); j++) { + JSONObject object = finalChainArray.getJSONObject(j); + /* + * if (finalChainArray.length() == 1) { object.put("previousHash", ""); + * object.put("nextHash", ""); } else if (finalChainArray.length() > 1) { if (j + * == 0) { object.put("previousHash", ""); object.put("nextHash", + * calculateHash(finalChainArray.getJSONObject(j + 1).getString("tid"), + * "SHA3-256")); } else if (j == finalChainArray.length() - 1) { + * object.put("previousHash", calculateHash(finalChainArray.getJSONObject(j - + * 1).getString("tid"), "SHA3-256")); object.put("nextHash", ""); } else { + * object.put("previousHash", calculateHash(finalChainArray.getJSONObject(j - + * 1).getString("tid"), "SHA3-256")); object.put("nextHash", + * calculateHash(finalChainArray.getJSONObject(j + 1).getString("tid"), + * "SHA3-256")); } } + */ + + if (object.has("nextHash") && object.has("previousHash")) { + object.remove("nextHash"); + object.remove("previousHash"); + } + + chainArray.put(object); + + } + + partTokenChainsPrevState.put(partTokens.getString(i), chainArray); + // TokenSenderLogger.debug("Part token chain to be sent for verification: + // "+prevStateChainContent); + + writeToFile(tokenChainPath.concat(partTokens.getString(i)).concat(".json"), chainArray.toString(), false); + + partTokenChainHash.put(add(tokenChainPath.concat(partTokens.getString(i)).concat(".json"), ipfs)); + } + TokenSenderLogger.debug("Completed tokens selection"); + + authSenderByRecHash = calculateHash( + wholeTokens.toString() + wholeTokenChainHash.toString() + partTokens.toString() + + partTokenChainHash.toString() + receiverDidIpfsHash + senderDidIpfsHash + comment, + "SHA3-256"); + 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); + + challengeObject.put("authSenderByRecHash", authSenderByRecHash); + + for (int i = 0; i < wholeTokens.length(); i++) + allTokens.put(wholeTokens.getString(i)); + for (int i = 0; i < partTokens.length(); i++) + 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 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"); + 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; + + } + } + + String errMessage = null; + for (int i = 0; i < quorumArray.length(); i++) { + + if (quorumArray.get(i).equals(senderDidIpfsHash)) { + TokenSenderLogger.error("SenderDID " + senderDidIpfsHash + " cannot be a Quorum"); + errMessage = "SenderDID " + senderDidIpfsHash; + } + if (quorumArray.get(i).equals(receiverDidIpfsHash)) { + TokenSenderLogger.error("ReceiverDID " + receiverDidIpfsHash + " cannot be a Quorum"); + if (errMessage != null) { + errMessage = errMessage + " and "; + } + errMessage = "ReceiverDID " + receiverDidIpfsHash; + } + if (errMessage != null) { + APIResponse.put("status", "Failed"); + APIResponse.put("message", errMessage + " cannot be a Quorum "); + return APIResponse; + } + + } + + TokenSenderLogger.debug("Updated quorumlist is " + quorumArray.toString()); // //sanity check for Quorum - starts - int alphaCheck = 0, betaCheck = 0, gammaCheck = 0; - JSONArray sanityFailedQuorum = new JSONArray(); - for (int i = 0; i < quorumArray.length(); i++) { - String quorumPeerID = getValues(DATA_PATH + "DataTable.json", "peerid", "didHash", - quorumArray.getString(i)); - boolean quorumSanityCheck = sanityCheck("Quorum", quorumPeerID, ipfs, port + 11); - - if (!quorumSanityCheck) { - 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) { - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - String message = "Quorum: ".concat(sanityFailedQuorum.toString()).concat(" "); - APIResponse.put("message", message.concat(sanityMessage)); - TokenSenderLogger.warn("Quorum: ".concat(message.concat(sanityMessage))); - return APIResponse; - } + int alphaCheck = 0, betaCheck = 0, gammaCheck = 0; + JSONArray sanityFailedQuorum = new JSONArray(); + for (int i = 0; i < quorumArray.length(); i++) { + String quorumPeerID = getValues(DATA_PATH + "DataTable.json", "peerid", "didHash", + quorumArray.getString(i)); + boolean quorumSanityCheck = sanityCheck("Quorum", quorumPeerID, ipfs, port + 11); + + if (!quorumSanityCheck) { + 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) { + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + String message = "Quorum: ".concat(sanityFailedQuorum.toString()).concat(" "); + APIResponse.put("message", message.concat(sanityMessage)); + TokenSenderLogger.warn("Quorum: ".concat(message.concat(sanityMessage))); + return APIResponse; + } // //sanity check for Quorum - Ends - long startTime, endTime, totalTime; - - QuorumSwarmConnect(quorumArray, ipfs); - - alphaSize = quorumArray.length() - 14; - - 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) { - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Quorum Members not available"); - TokenSenderLogger.warn("Quorum Members not available"); - senderMutex = false; - return APIResponse; - } - - TokenSenderLogger.debug("Final Selected Alpha Members: " + alphaPeersList); - JSONArray alphaList = new JSONArray(); - for (int i = 0; i < alphaPeersList.size(); i++) { - alphaList.put(alphaPeersList.get(i)); - } - - int numberOfTokensToPledge = 0; - if (wholeAmount > 0) { - numberOfTokensToPledge += wholeAmount; - if (decimalAmount > 0) - numberOfTokensToPledge += 1; - } else - numberOfTokensToPledge = 1; - - TokenSenderLogger.debug("Amount being transferred: " + requestedAmount - + " and number of tokens required to be pledged: " + numberOfTokensToPledge); - - JSONObject dataToSendToInitiator = new JSONObject(); - dataToSendToInitiator.put("alphaList", alphaList); - dataToSendToInitiator.put("tokenList", wholeTokens); - dataToSendToInitiator.put("amount", numberOfTokensToPledge); - dataToSendToInitiator.put("tid", tid); - dataToSendToInitiator.put("pvt", pvt); - dataToSendToInitiator.put("pvtKeyPass", keyPass); - dataToSendToInitiator.put("sender", senderDidIpfsHash); - dataToSendToInitiator.put("receiver", receiverDidIpfsHash); - - TokenSenderLogger.debug("Details being sent to Initiator: " + dataToSendToInitiator); - - boolean abort = Initiator.pledgeSetUp(dataToSendToInitiator.toString(), ipfs, 22143); - if (abort) { - Initiator.abort = false; - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - if (Initiator.abortReason.has("Quorum")) - APIResponse.put("message", "Alpha Node " + Initiator.abortReason.getString("Quorum") + " " - + Initiator.abortReason.getString("Reason")); - else - APIResponse.put("message", Initiator.abortReason.getString("Reason")); - TokenSenderLogger.warn("Quorum Members with insufficient Tokens/Credits"); - senderMutex = false; - Initiator.abortReason = new JSONObject(); - return APIResponse; - } else { - JSONArray array = Initiator.quorumWithHashesArray; - challengeObject.put("pledgeDetails", array); - - } - - TokenSenderLogger.debug("Nodes that pledged tokens: " + Initiator.pledgedNodes); - - /** - * Send the array without sender sign calculated - */ - JSONArray newChains = new JSONArray(); - for (int i = 0; i < intPart; i++) { - JSONObject lastObject = new JSONObject(); - // lastObject.put("senderSign", ""); - lastObject.put("sender", senderDidIpfsHash); - lastObject.put("group", allTokens); - lastObject.put("comment", comment); - lastObject.put("tid", tid); - lastObject.put("receiver", receiverDidIpfsHash); - lastObject.put("pledgeToken", ""); - lastObject.put("tokensPledgedFor", allTokens); - lastObject.put("tokensPledgedWith", Initiator.pledgedTokensArray); - - String tokenChainFileContent = readFile(TOKENCHAIN_PATH + wholeTokens.get(i) + ".json"); - JSONArray tokenChain = new JSONArray(tokenChainFileContent); - tokenChain.put(lastObject); - lastObJsonArray.put(lastObject); - - String tokenChainHash = calculateHash(tokenChain.toString(), "SHA3-256"); - JSONObject tokenObject = new JSONObject(); - tokenObject.put("token", wholeTokens.getString(i)); - tokenObject.put("hash", tokenChainHash); - newChains.put(tokenObject); - } - challengeObject.put("lastObject", newChains); - senderPayloadHash = calculateHash(allTokens.toString() + senderDidIpfsHash + comment, "SHA3-256"); - - challengeObject.put("senderPayloadSign", senderPayloadHash); - - FileWriter file = new FileWriter(WALLET_DATA_PATH.concat("/ChallengePayload").concat(tid).concat(".json")); - file.write(challengeObject.toString()); - file.close(); - - JSONArray signedChains = new JSONArray(); - JSONObject payloadSigned = new JSONObject(); - File privateShareFile = new File(DATA_PATH.concat(senderDidIpfsHash).concat("/PrivateShare.png")); - - if (privateShareFile.exists()) { - payloadSigned.put("authSenderByRecHash", getSignFromShares(pvt, authSenderByRecHash)); - payloadSigned.put("senderPayloadSign", getSignFromShares(pvt, senderPayloadHash)); - for (int i = 0; i < intPart; i++) { - JSONObject tokenObject = newChains.getJSONObject(i); - // JSONArray chainArray = tokenObject.getJSONArray("chain"); - // JSONObject lastObject = chainArray.getJSONObject(chainArray.length() - 1); - // String senderSign = getSignFromShares(pvt, authSenderByRecHash); - // lastObject.put("senderSign", senderSign); - - // chainArray.remove(chainArray.length() - 1); - // chainArray.put(lastObject); - - // String chainHash = calculateHash(chainArray.toString(), "SHA3-256"); - String chainSign = getSignFromShares(pvt, newChains.getJSONObject(i).getString("hash")); - tokenObject.put("chainSign", chainSign); - signedChains.put(tokenObject); - } - payloadSigned.put("lastObject", signedChains); - - FileWriter payloadfile = new FileWriter( - WALLET_DATA_PATH.concat("/SignPayload").concat(tid).concat(".json")); - payloadfile.write(payloadSigned.toString()); - payloadfile.close(); - - JSONArray quorumWithSignsArray = new JSONArray(); - JSONArray pledgeArray = Initiator.quorumWithHashesArray; - if (pledgeArray.length() == 0) { - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Not enough token to pledge"); - TokenSenderLogger.warn("Pledging failed"); - return APIResponse; - } - - 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()); - JSONObject pledgeSignedObject = new JSONObject(); - String key = ""; - JSONArray hashAndSignsArray = new JSONArray(); - while (keys.hasNext()) { - key = keys.next(); - TokenSenderLogger.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()); - TokenSenderLogger.debug("@@@@@ Calculating hash for: " + hashArray); - //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)); - pledgeSignedObject.put("sign", sign); - hashAndSignsArray.put(pledgeSignedObject); - } - } - } - JSONObject signObject = new JSONObject(); - signObject.put(key, hashAndSignsArray); - TokenSenderLogger.debug("signObject is " + signObject); - quorumWithSignsArray.put(signObject); - - } + long startTime, endTime, totalTime; + + QuorumSwarmConnect(quorumArray, ipfs); + + alphaSize = quorumArray.length() - 14; + + 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) { + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Quorum Members not available"); + TokenSenderLogger.warn("Quorum Members not available"); + senderMutex = false; + return APIResponse; + } + + TokenSenderLogger.debug("Final Selected Alpha Members: " + alphaPeersList); + JSONArray alphaList = new JSONArray(); + for (int i = 0; i < alphaPeersList.size(); i++) { + alphaList.put(alphaPeersList.get(i)); + } + + int numberOfTokensToPledge = 0; + if (wholeAmount > 0) { + numberOfTokensToPledge += wholeAmount; + if (decimalAmount > 0) + numberOfTokensToPledge += 1; + } else + numberOfTokensToPledge = 1; + + TokenSenderLogger.debug("Amount being transferred: " + requestedAmount + + " and number of tokens required to be pledged: " + numberOfTokensToPledge); + + JSONObject dataToSendToInitiator = new JSONObject(); + dataToSendToInitiator.put("alphaList", alphaList); + dataToSendToInitiator.put("tokenList", wholeTokens); + dataToSendToInitiator.put("amount", numberOfTokensToPledge); + dataToSendToInitiator.put("tid", tid); + dataToSendToInitiator.put("pvt", pvt); + dataToSendToInitiator.put("pvtKeyPass", keyPass); + dataToSendToInitiator.put("sender", senderDidIpfsHash); + dataToSendToInitiator.put("receiver", receiverDidIpfsHash); + + TokenSenderLogger.debug("Details being sent to Initiator: " + dataToSendToInitiator); + + boolean abort = Initiator.pledgeSetUp(dataToSendToInitiator.toString(), ipfs, 22143); + if (abort) { + Initiator.abort = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + if (Initiator.abortReason.has("Quorum")) + APIResponse.put("message", "Alpha Node " + Initiator.abortReason.getString("Quorum") + " " + + Initiator.abortReason.getString("Reason")); + else + APIResponse.put("message", Initiator.abortReason.getString("Reason")); + TokenSenderLogger.warn("Quorum Members with insufficient Tokens/Credits"); + senderMutex = false; + Initiator.abortReason = new JSONObject(); + return APIResponse; + } else { + JSONArray array = Initiator.quorumWithHashesArray; + challengeObject.put("pledgeDetails", array); + + } + + TokenSenderLogger.debug("Nodes that pledged tokens: " + Initiator.pledgedNodes); + + /** + * Send the array without sender sign calculated + */ + JSONArray newChains = new JSONArray(); + for (int i = 0; i < intPart; i++) { + JSONObject lastObject = new JSONObject(); + // lastObject.put("senderSign", ""); + lastObject.put("sender", senderDidIpfsHash); + lastObject.put("group", allTokens); + lastObject.put("comment", comment); + lastObject.put("tid", tid); + lastObject.put("receiver", receiverDidIpfsHash); + lastObject.put("pledgeToken", ""); + lastObject.put("tokensPledgedFor", allTokens); + lastObject.put("tokensPledgedWith", Initiator.pledgedTokensArray); + + String tokenChainFileContent = readFile(TOKENCHAIN_PATH + wholeTokens.get(i) + ".json"); + JSONArray tokenChain = new JSONArray(tokenChainFileContent); + tokenChain.put(lastObject); + lastObJsonArray.put(lastObject); + + String tokenChainHash = calculateHash(tokenChain.toString(), "SHA3-256"); + JSONObject tokenObject = new JSONObject(); + tokenObject.put("token", wholeTokens.getString(i)); + tokenObject.put("hash", tokenChainHash); + newChains.put(tokenObject); + } + challengeObject.put("lastObject", newChains); + senderPayloadHash = calculateHash(allTokens.toString() + senderDidIpfsHash + comment, "SHA3-256"); + + challengeObject.put("senderPayloadSign", senderPayloadHash); + + FileWriter file = new FileWriter(WALLET_DATA_PATH.concat("/ChallengePayload").concat(tid).concat(".json")); + file.write(challengeObject.toString()); + file.close(); + + JSONArray signedChains = new JSONArray(); + JSONObject payloadSigned = new JSONObject(); + File privateShareFile = new File(DATA_PATH.concat(senderDidIpfsHash).concat("/PrivateShare.png")); + + if (privateShareFile.exists()) { + payloadSigned.put("authSenderByRecHash", getSignFromShares(pvt, authSenderByRecHash)); + payloadSigned.put("senderPayloadSign", getSignFromShares(pvt, senderPayloadHash)); + for (int i = 0; i < intPart; i++) { + JSONObject tokenObject = newChains.getJSONObject(i); + // JSONArray chainArray = tokenObject.getJSONArray("chain"); + // JSONObject lastObject = chainArray.getJSONObject(chainArray.length() - 1); + // String senderSign = getSignFromShares(pvt, authSenderByRecHash); + // lastObject.put("senderSign", senderSign); + + // chainArray.remove(chainArray.length() - 1); + // chainArray.put(lastObject); + + // String chainHash = calculateHash(chainArray.toString(), "SHA3-256"); + String chainSign = getSignFromShares(pvt, newChains.getJSONObject(i).getString("hash")); + tokenObject.put("chainSign", chainSign); + signedChains.put(tokenObject); + } + payloadSigned.put("lastObject", signedChains); + + FileWriter payloadfile = new FileWriter( + WALLET_DATA_PATH.concat("/SignPayload").concat(tid).concat(".json")); + payloadfile.write(payloadSigned.toString()); + payloadfile.close(); + + JSONArray quorumWithSignsArray = new JSONArray(); + JSONArray pledgeArray = Initiator.quorumWithHashesArray; + if (pledgeArray.length() == 0) { + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Not enough token to pledge"); + TokenSenderLogger.warn("Pledging failed"); + return APIResponse; + } + + 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()); + JSONObject pledgeSignedObject = new JSONObject(); + String key = ""; + JSONArray hashAndSignsArray = new JSONArray(); + while (keys.hasNext()) { + key = keys.next(); + TokenSenderLogger.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()); + TokenSenderLogger.debug("@@@@@ Calculating hash for: " + hashArray); + //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)); + pledgeSignedObject.put("sign", sign); + hashAndSignsArray.put(pledgeSignedObject); + } + } + } + JSONObject signObject = new JSONObject(); + signObject.put(key, hashAndSignsArray); + TokenSenderLogger.debug("signObject is " + signObject); + quorumWithSignsArray.put(signObject); + + } // for (int i = 0; i < intPart; i++) { // JSONObject jsonObject = new JSONObject(Initiator.quorumWithHashesArray); @@ -725,551 +722,557 @@ public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exce // quorumWithSignsArray.put(signObject); // } - payloadSigned.put("pledgeDetails", quorumWithSignsArray); - TokenSenderLogger.debug("pledgeDetails: " + quorumWithSignsArray); - - FileWriter spfile = new FileWriter(WALLET_DATA_PATH.concat("/signedPayload").concat(tid).concat(".json")); - spfile.write(payloadSigned.toString()); - spfile.close(); - - senderMutex = false; - return SendPartB(payloadSigned, ipfs, port); - } - senderMutex = false; - return challengeObject; - } - - public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) - throws JSONException, IOException, InterruptedException, ParseException { - - TokenSenderLogger.debug("PartB - signPayload " + signPayload); - - String senderSign = signPayload.getString("authSenderByRecHash"); - JSONObject APIResponse = new JSONObject(); - String receiverDidIpfsHash = detailsObject.getString("receiverDidIpfsHash"); - String receiverPeerId = getValues(DATA_PATH + "DataTable.json", "peerid", "didHash", receiverDidIpfsHash); - String pvt = detailsObject.getString("pvt"); - double requestedAmount = detailsObject.getDouble("amount"); - int type = detailsObject.getInt("type"); - String comment = detailsObject.getString("comment"); - String keyPass = detailsObject.getString("pvtKeyPass"); - - PrivateKey pvtKey = getPvtKey(keyPass, 1); - String senderPeerID = getPeerID(DATA_PATH + "DID.json"); - String senderDidIpfsHash = getValues(DATA_PATH + "DataTable.json", "didHash", "peerid", senderPeerID); - JSONArray quorumWithSignsArray = signPayload.getJSONArray("pledgeDetails"); - JSONArray signedChains = signPayload.getJSONArray("lastObject"); - - // If user enters wrong pvt key password - if (pvtKey == null) { - APIResponse.put("message", - "Incorrect password entered for Private Key, cannot proceed with the transaction"); - TokenSenderLogger.warn("Incorrect Private Key password entered"); - return APIResponse; - } - - // detailsObject.remove("pvtKeyPass"); - if (senderMutex) { - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Sender busy. Try again later"); - TokenSenderLogger.warn("Sender busy"); - return APIResponse; - } - - senderMutex = true; - Initiator.pledge(quorumWithSignsArray, requestedAmount, port); - - boolean sanityCheck = sanityCheck("Receiver", receiverPeerId, ipfs, port + 10); - if (!sanityCheck) { - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", sanityMessage); - TokenSenderLogger.warn(sanityMessage); - senderMutex = false; - return APIResponse; - } - - syncDataTable(receiverDidIpfsHash, null); - - if (!receiverPeerId.equals("")) { - TokenSenderLogger.debug("Swarm connecting to " + receiverPeerId); - swarmConnectP2P(receiverPeerId, ipfs); - TokenSenderLogger.debug("Swarm connected"); - } else { - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Receiver Peer ID null"); - TokenSenderLogger.warn("Receiver Peer ID null"); - senderMutex = false; - return APIResponse; - } - - String receiverWidIpfsHash = getValues(DATA_PATH + "DataTable.json", "walletHash", "didHash", - receiverDidIpfsHash); - if (!receiverWidIpfsHash.equals("")) { - nodeData(receiverDidIpfsHash, receiverWidIpfsHash, ipfs); - } else { - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Receiver WID null"); - TokenSenderLogger.warn("Receiver WID null"); - senderMutex = false; - return APIResponse; - } - - TokenSenderLogger.debug("Sender IPFS forwarding to DID: " + receiverDidIpfsHash + " PeerID: " + receiverPeerId); - forward(receiverPeerId, port, receiverPeerId); - TokenSenderLogger.debug("Forwarded to " + receiverPeerId + " on " + port); - senderSocket = new Socket("127.0.0.1", port); - - input = new BufferedReader(new InputStreamReader(senderSocket.getInputStream())); - output = new PrintStream(senderSocket.getOutputStream()); - - long startTime = System.currentTimeMillis(); - - /** - * Sending Sender Peer ID to Receiver Receiver to authenticate Sender's DID - * (Identity) - */ - output.println(senderPeerID); - TokenSenderLogger.debug("Sent PeerID"); - - String peerAuth; - try { - peerAuth = input.readLine(); - } catch (SocketException e) { - TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " is unable to Respond! - Sender Auth"); - 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 + "is unable to respond! - Sender Auth"); - - return APIResponse; - } - - if (peerAuth == null) { - executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); - TokenSenderLogger.info("Receiver is unable to authenticate the sender!"); - output.close(); - input.close(); - senderSocket.close(); - senderMutex = false; - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Receiver is unable to authenticate the sender!"); - return APIResponse; - - } else if (peerAuth != null && (!peerAuth.equals("200"))) { - executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); - TokenSenderLogger.info("Sender Data Not Available"); - output.close(); - input.close(); - senderSocket.close(); - senderMutex = false; - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Sender Data Not Available"); - return APIResponse; - - } - - String pvtKeyType = privateKeyAlgorithm(1); - // String senderSignWithPvtKey = pvtKeySign(senderSign, pvtKey, pvtKeyType); - - JSONObject senderDetails2Receiver = new JSONObject(); - // senderDetails2Receiver.put("pvtKeySign", senderSignWithPvtKey); - senderDetails2Receiver.put("pvtShareBits", senderSign); - senderDetails2Receiver.put("tid", tid); - senderDetails2Receiver.put("comment", comment); - - JSONObject partTokenChainArrays = new JSONObject(); - for (int i = 0; i < partTokens.length(); i++) { - String chainContent = readFile(tokenChainPath.concat(partTokens.getString(i)).concat(".json")); - JSONArray chainArray = new JSONArray(chainContent); - 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")); - * newLastObject.put("previousHash", - * calculateHash(chainArray.getJSONObject(chainArray.length() - - * 1).getString("tid"), "SHA3-256")); } - */ - - Double amount = formatAmount(amountLedger.getDouble(partTokens.getString(i))); - - newLastObject.put("senderSign", senderSign); - newLastObject.put("sender", senderDidIpfsHash); - newLastObject.put("receiver", receiverDidIpfsHash); - newLastObject.put("comment", comment); - newLastObject.put("tid", tid); - newLastObject.put("role", "Sender"); - newLastObject.put("amount", amount); - chainArray.put(newLastObject); - partTokenChainArrays.put(partTokens.getString(i), chainArray); - - } - JSONArray proofOfWork = new JSONArray(); - for (int i = 0; i < wholeTokens.length(); i++) { - File proofFile = new File(TOKENCHAIN_PATH + "Proof/" + wholeTokens.getString(i) + ".proof"); - if (proofFile.exists()) { - String proofCID = add(TOKENCHAIN_PATH + "Proof/" + wholeTokens.getString(i) + ".proof", ipfs); - JSONObject proofObject = new JSONObject(); - proofObject.put("token", wholeTokens.getString(i)); - proofObject.put("cid", proofCID); - proofOfWork.put(proofObject); - } - } - JSONObject tokenDetails = new JSONObject(); - tokenDetails.put("whole-tokens", wholeTokens); - tokenDetails.put("whole-tokenChains", wholeTokenChainHash); - tokenDetails.put("hashSender", partTokenChainHash); - tokenDetails.put("part-tokens", partTokens); - tokenDetails.put("part-tokenChains", partTokenChainArrays); - tokenDetails.put("part-tokenChains-PrevState", partTokenChainsPrevState); - tokenDetails.put("sender", senderDidIpfsHash); - tokenDetails.put("proof", proofOfWork); - String doubleSpendString = tokenDetails.toString(); - - TokenSenderLogger.debug("tokenDetails is "+tokenDetails.toString()); - - String doubleSpend = calculateHash(doubleSpendString, "SHA3-256"); - writeToFile(LOGGER_PATH + "doubleSpend", doubleSpend, false); - TokenSenderLogger.debug("********Double Spend Hash*********: " + doubleSpend); - IPFSNetwork.addHashOnly(LOGGER_PATH + "doubleSpend", ipfs); - deleteFile(LOGGER_PATH + "doubleSpend"); - - JSONObject tokenObject = new JSONObject(); - tokenObject.put("tokenDetails", tokenDetails); - tokenObject.put("previousSender", tokenPreviousSender); - 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"); - } - - /** - * Sending Token Details to Receiver Receiver to authenticate Tokens (Double - * Spending, IPFS availability) - */ - output.println(tokenObject); - - String tokenAuth; - try { - tokenAuth = input.readLine(); - TokenSenderLogger.debug("Token Auth Code: " + tokenAuth); - } catch (SocketException e) { - TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " is unable to Respond! - Token Auth"); - 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 + "is unable to respond! - Token Auth"); - - return APIResponse; - } - if (tokenAuth == null) { - executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); - TokenSenderLogger.info("Receiver is unable to verify the tokens!"); - output.close(); - input.close(); - senderSocket.close(); - senderMutex = false; - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Receiver is unable to verify the tokens!"); - 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)); - } - 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; - - } - 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", tid); - APIResponse.put("status", "Failed"); - return APIResponse; - } - - TokenSenderLogger.debug("Token Auth Code: " + tokenAuth); - - JSONObject dataObject = new JSONObject(); - dataObject.put("tid", tid); - dataObject.put("senderPayloadHash", senderPayloadHash); - dataObject.put("senderPayloadSign", signPayload.getString("senderPayloadSign")); - dataObject.put("receiverDidIpfs", receiverDidIpfsHash); - dataObject.put("pvt", pvt); - 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))) { - TokenSenderLogger.debug("Consensus Failed"); - senderDetails2Receiver.put("status", "Consensus Failed"); - output.println(senderDetails2Receiver); - 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", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Transaction declined by Quorum"); - return APIResponse; - - } - - TokenSenderLogger.debug("Consensus Reached"); - senderDetails2Receiver.put("status", "Consensus Reached"); - senderDetails2Receiver.put("quorumsign", InitiatorConsensus.quorumSignature.toString()); - senderDetails2Receiver.put("pledgeDetails", Initiator.pledgedTokensArray); - - - - output.println(senderDetails2Receiver); - TokenSenderLogger.debug("Quorum Signatures length " + InitiatorConsensus.quorumSignature.length()); - - String signatureAuth; - try { - signatureAuth = input.readLine(); - } catch (SocketException e) { - TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " is unable to Respond! - Signature Auth"); - 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 + "is unable to respond! - Signature Auth"); - - return APIResponse; - } - TokenSenderLogger.info("signatureAuth : " + signatureAuth); - long endTime = System.currentTimeMillis(); - long totalTime = endTime - startTime; - if (signatureAuth == null) { - executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); - TokenSenderLogger.info("Receiver is unable to authenticate Sender!"); - output.close(); - input.close(); - senderSocket.close(); - senderMutex = false; - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Receiver is unable to authenticate Sender!"); - return APIResponse; - } else if (signatureAuth != null && (!signatureAuth.equals("200"))) { - executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); - TokenSenderLogger.info("Authentication Failed!"); - output.close(); - input.close(); - senderSocket.close(); - senderMutex = false; - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Sender not authenticated"); - return APIResponse; - - } - - // Sender requests for new block that is going to be added to the Token chains. - // (For Token chain auth) - output.println("Request for new blocks being added to the Token Chains"); - - String newBlocksForTokenChains; - try { - newBlocksForTokenChains = input.readLine(); - } catch (SocketException e) { - TokenSenderLogger.warn( - "Receiver " + receiverDidIpfsHash + " could'nt send 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 + "couldn't send token chain blocks for hashing and signing"); - - return APIResponse; - } - - TokenSenderLogger.debug("newBlocksForTokenChains is " + newBlocksForTokenChains); - TokenSenderLogger.debug(""); - - TokenSenderLogger.debug("lastObJsonArray is " + lastObJsonArray.toString()); - - JSONArray newTokenChainBlocks = new JSONArray(newBlocksForTokenChains); - JSONArray hashAndSigns = new JSONArray(); - - for (int i = 0; i < intPart; i++) { - JSONObject lastObject = lastObJsonArray.getJSONObject(i); - JSONObject receiverLastObject = newTokenChainBlocks.getJSONObject(i).getJSONObject("lastObject"); - - Map senderChainMap = lastObject.toMap(); - Map receiverChainMap = receiverLastObject.toMap(); - senderChainMap.remove("pledgeToken"); - receiverChainMap.remove("pledgeToken"); - - 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(senderChainMap.equals(receiverChainMap) + " is the chainmap status"); - - TokenSenderLogger.debug("signedChains is " + signedChains.toString()); - if (senderChainMap.equals(receiverChainMap)) { - - // String PvtKeySign = - // pvtKeySign(signedChains.getJSONObject(i).getString("chainSign"), pvtKey, - // privateKeyAlgorithm(1)); - - JSONObject obj = new JSONObject(); - obj.put("hash", signedChains.getJSONObject(i).getString("hash")); - obj.put("pvtShareBits", signedChains.getJSONObject(i).getString("chainSign")); - // obj.put("pvtKeySign", PvtKeySign); - - hashAndSigns.put(obj); - } else { - output.println("Token chains Not Matching"); - executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); - TokenSenderLogger.info("Token chains Not Matching"); - output.close(); - input.close(); - senderSocket.close(); - senderMutex = false; - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Token chains Not Matching"); - return APIResponse; - } - } - - output.println(hashAndSigns.toString()); - // Sender requests for new block that is going to be added to the part Token - // chains. + payloadSigned.put("pledgeDetails", quorumWithSignsArray); + TokenSenderLogger.debug("pledgeDetails: " + quorumWithSignsArray); + + FileWriter spfile = new FileWriter(WALLET_DATA_PATH.concat("/signedPayload").concat(tid).concat(".json")); + spfile.write(payloadSigned.toString()); + spfile.close(); + + senderMutex = false; + return SendPartB(payloadSigned, ipfs, port); + } + senderMutex = false; + return challengeObject; + } + + public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) + throws JSONException, IOException, InterruptedException, ParseException { + + TokenSenderLogger.debug("PartB - signPayload " + signPayload); + + String senderSign = signPayload.getString("authSenderByRecHash"); + JSONObject APIResponse = new JSONObject(); + String receiverDidIpfsHash = detailsObject.getString("receiverDidIpfsHash"); + String receiverPeerId = getValues(DATA_PATH + "DataTable.json", "peerid", "didHash", receiverDidIpfsHash); + String pvt = detailsObject.getString("pvt"); + double requestedAmount = detailsObject.getDouble("amount"); + int type = detailsObject.getInt("type"); + String comment = detailsObject.getString("comment"); + String keyPass = detailsObject.getString("pvtKeyPass"); + + PrivateKey pvtKey = getPvtKey(keyPass, 1); + String senderPeerID = getPeerID(DATA_PATH + "DID.json"); + String senderDidIpfsHash = getValues(DATA_PATH + "DataTable.json", "didHash", "peerid", senderPeerID); + JSONArray quorumWithSignsArray = signPayload.getJSONArray("pledgeDetails"); + JSONArray signedChains = signPayload.getJSONArray("lastObject"); + + // If user enters wrong pvt key password + if (pvtKey == null) { + APIResponse.put("message", + "Incorrect password entered for Private Key, cannot proceed with the transaction"); + TokenSenderLogger.warn("Incorrect Private Key password entered"); + return APIResponse; + } + + // detailsObject.remove("pvtKeyPass"); + if (senderMutex) { + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Sender busy. Try again later"); + TokenSenderLogger.warn("Sender busy"); + return APIResponse; + } + + senderMutex = true; + Initiator.pledge(quorumWithSignsArray, requestedAmount, port); + + boolean sanityCheck = sanityCheck("Receiver", receiverPeerId, ipfs, port + 10); + if (!sanityCheck) { + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", sanityMessage); + TokenSenderLogger.warn(sanityMessage); + senderMutex = false; + return APIResponse; + } + + syncDataTable(receiverDidIpfsHash, null); + + if (!receiverPeerId.equals("")) { + TokenSenderLogger.debug("Swarm connecting to " + receiverPeerId); + swarmConnectP2P(receiverPeerId, ipfs); + TokenSenderLogger.debug("Swarm connected"); + } else { + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Receiver Peer ID null"); + TokenSenderLogger.warn("Receiver Peer ID null"); + senderMutex = false; + return APIResponse; + } + + String receiverWidIpfsHash = getValues(DATA_PATH + "DataTable.json", "walletHash", "didHash", + receiverDidIpfsHash); + if (!receiverWidIpfsHash.equals("")) { + nodeData(receiverDidIpfsHash, receiverWidIpfsHash, ipfs); + } else { + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Receiver WID null"); + TokenSenderLogger.warn("Receiver WID null"); + senderMutex = false; + return APIResponse; + } + + TokenSenderLogger.debug("Sender IPFS forwarding to DID: " + receiverDidIpfsHash + " PeerID: " + receiverPeerId); + forward(receiverPeerId, port, receiverPeerId); + TokenSenderLogger.debug("Forwarded to " + receiverPeerId + " on " + port); + senderSocket = new Socket("127.0.0.1", port); + + input = new BufferedReader(new InputStreamReader(senderSocket.getInputStream())); + output = new PrintStream(senderSocket.getOutputStream()); + + long startTime = System.currentTimeMillis(); + + /** + * Sending Sender Peer ID to Receiver Receiver to authenticate Sender's DID + * (Identity) + */ + output.println(senderPeerID); + TokenSenderLogger.debug("Sent PeerID"); + + String peerAuth; + try { + peerAuth = input.readLine(); + } catch (SocketException e) { + TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " is unable to Respond! - Sender Auth"); + 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 + "is unable to respond! - Sender Auth"); + + return APIResponse; + } + + if (peerAuth == null) { + executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); + TokenSenderLogger.info("Receiver is unable to authenticate the sender!"); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Receiver is unable to authenticate the sender!"); + return APIResponse; + + } else if (peerAuth != null && (!peerAuth.equals("200"))) { + executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); + TokenSenderLogger.info("Sender Data Not Available"); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Sender Data Not Available"); + return APIResponse; + + } + + String pvtKeyType = privateKeyAlgorithm(1); + // String senderSignWithPvtKey = pvtKeySign(senderSign, pvtKey, pvtKeyType); + + JSONObject senderDetails2Receiver = new JSONObject(); + // senderDetails2Receiver.put("pvtKeySign", senderSignWithPvtKey); + senderDetails2Receiver.put("pvtShareBits", senderSign); + senderDetails2Receiver.put("tid", tid); + senderDetails2Receiver.put("comment", comment); + + JSONObject partTokenChainArrays = new JSONObject(); + for (int i = 0; i < partTokens.length(); i++) { + String chainContent = readFile(tokenChainPath.concat(partTokens.getString(i)).concat(".json")); + JSONArray chainArray = new JSONArray(chainContent); + 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")); + * newLastObject.put("previousHash", + * calculateHash(chainArray.getJSONObject(chainArray.length() - + * 1).getString("tid"), "SHA3-256")); } + */ + + Double amount = formatAmount(amountLedger.getDouble(partTokens.getString(i))); + + newLastObject.put("senderSign", senderSign); + newLastObject.put("sender", senderDidIpfsHash); + newLastObject.put("receiver", receiverDidIpfsHash); + newLastObject.put("comment", comment); + newLastObject.put("tid", tid); + newLastObject.put("role", "Sender"); + newLastObject.put("amount", amount); + chainArray.put(newLastObject); + partTokenChainArrays.put(partTokens.getString(i), chainArray); + + } + JSONArray proofOfWork = new JSONArray(); + for (int i = 0; i < wholeTokens.length(); i++) { + File proofFile = new File(TOKENCHAIN_PATH + "Proof/" + wholeTokens.getString(i) + ".proof"); + if (proofFile.exists()) { + String proofCID = add(TOKENCHAIN_PATH + "Proof/" + wholeTokens.getString(i) + ".proof", ipfs); + JSONObject proofObject = new JSONObject(); + proofObject.put("token", wholeTokens.getString(i)); + proofObject.put("cid", proofCID); + proofOfWork.put(proofObject); + } + } + JSONObject tokenDetails = new JSONObject(); + tokenDetails.put("whole-tokens", wholeTokens); + tokenDetails.put("whole-tokenChains", wholeTokenChainHash); + tokenDetails.put("hashSender", partTokenChainHash); + tokenDetails.put("part-tokens", partTokens); + tokenDetails.put("part-tokenChains", partTokenChainArrays); + tokenDetails.put("part-tokenChains-PrevState", partTokenChainsPrevState); + tokenDetails.put("sender", senderDidIpfsHash); + tokenDetails.put("proof", proofOfWork); + String doubleSpendString = tokenDetails.toString(); + + TokenSenderLogger.debug("tokenDetails is " + tokenDetails.toString()); + + String doubleSpend = calculateHash(doubleSpendString, "SHA3-256"); + writeToFile(LOGGER_PATH + "doubleSpend", doubleSpend, false); + TokenSenderLogger.debug("********Double Spend Hash*********: " + doubleSpend); + IPFSNetwork.addHashOnly(LOGGER_PATH + "doubleSpend", ipfs); + deleteFile(LOGGER_PATH + "doubleSpend"); + + JSONObject tokenObject = new JSONObject(); + tokenObject.put("tokenDetails", tokenDetails); + tokenObject.put("previousSender", tokenPreviousSender); + 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"); + } + + /** + * Sending Token Details to Receiver Receiver to authenticate Tokens (Double + * Spending, IPFS availability) + */ + output.println(tokenObject); + + String tokenAuth; + try { + tokenAuth = input.readLine(); + TokenSenderLogger.debug("Token Auth Code: " + tokenAuth); + } catch (SocketException e) { + TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " is unable to Respond! - Token Auth"); + 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 + "is unable to respond! - Token Auth"); + + return APIResponse; + } + if (tokenAuth == null) { + executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); + TokenSenderLogger.info("Receiver is unable to verify the tokens!"); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Receiver is unable to verify the tokens!"); + return APIResponse; + } else if (tokenAuth != null && (tokenAuth.startsWith("4"))) { + switch (tokenAuth) { + 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); + } + 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); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", tid); + APIResponse.put("status", "Failed"); + return APIResponse; + } + + TokenSenderLogger.debug("Token Auth Code: " + tokenAuth); + + JSONObject dataObject = new JSONObject(); + dataObject.put("tid", tid); + dataObject.put("senderPayloadHash", senderPayloadHash); + dataObject.put("senderPayloadSign", signPayload.getString("senderPayloadSign")); + dataObject.put("receiverDidIpfs", receiverDidIpfsHash); + dataObject.put("pvt", pvt); + 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))) { + TokenSenderLogger.debug("Consensus Failed"); + senderDetails2Receiver.put("status", "Consensus Failed"); + output.println(senderDetails2Receiver); + 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", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Transaction declined by Quorum"); + return APIResponse; + + } + + TokenSenderLogger.debug("Consensus Reached"); + senderDetails2Receiver.put("status", "Consensus Reached"); + senderDetails2Receiver.put("quorumsign", InitiatorConsensus.quorumSignature.toString()); + senderDetails2Receiver.put("pledgeDetails", Initiator.pledgedTokensArray); + + + output.println(senderDetails2Receiver); + TokenSenderLogger.debug("Quorum Signatures length " + InitiatorConsensus.quorumSignature.length()); + + String signatureAuth; + try { + signatureAuth = input.readLine(); + } catch (SocketException e) { + TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " is unable to Respond! - Signature Auth"); + 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 + "is unable to respond! - Signature Auth"); + + return APIResponse; + } + TokenSenderLogger.info("signatureAuth : " + signatureAuth); + long endTime = System.currentTimeMillis(); + long totalTime = endTime - startTime; + if (signatureAuth == null) { + executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); + TokenSenderLogger.info("Receiver is unable to authenticate Sender!"); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Receiver is unable to authenticate Sender!"); + return APIResponse; + } else if (signatureAuth != null && (!signatureAuth.equals("200"))) { + executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); + TokenSenderLogger.info("Authentication Failed!"); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Sender not authenticated"); + return APIResponse; + + } + + // Sender requests for new block that is going to be added to the Token chains. + // (For Token chain auth) + output.println("Request for new blocks being added to the Token Chains"); + + String newBlocksForTokenChains; + try { + newBlocksForTokenChains = input.readLine(); + } catch (SocketException e) { + TokenSenderLogger.warn( + "Receiver " + receiverDidIpfsHash + " could'nt send 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 + "couldn't send token chain blocks for hashing and signing"); + + return APIResponse; + } + + TokenSenderLogger.debug("newBlocksForTokenChains is " + newBlocksForTokenChains); + TokenSenderLogger.debug(""); + + TokenSenderLogger.debug("lastObJsonArray is " + lastObJsonArray.toString()); + + JSONArray newTokenChainBlocks = new JSONArray(newBlocksForTokenChains); + JSONArray hashAndSigns = new JSONArray(); + + for (int i = 0; i < intPart; i++) { + JSONObject lastObject = lastObJsonArray.getJSONObject(i); + JSONObject receiverLastObject = newTokenChainBlocks.getJSONObject(i).getJSONObject("lastObject"); + + Map senderChainMap = lastObject.toMap(); + Map receiverChainMap = receiverLastObject.toMap(); + senderChainMap.remove("pledgeToken"); + receiverChainMap.remove("pledgeToken"); + + 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(senderChainMap.equals(receiverChainMap) + " is the chainmap status"); + + TokenSenderLogger.debug("signedChains is " + signedChains.toString()); + if (senderChainMap.equals(receiverChainMap)) { + + // String PvtKeySign = + // pvtKeySign(signedChains.getJSONObject(i).getString("chainSign"), pvtKey, + // privateKeyAlgorithm(1)); + + JSONObject obj = new JSONObject(); + obj.put("hash", signedChains.getJSONObject(i).getString("hash")); + obj.put("pvtShareBits", signedChains.getJSONObject(i).getString("chainSign")); + // obj.put("pvtKeySign", PvtKeySign); + + hashAndSigns.put(obj); + } else { + output.println("Token chains Not Matching"); + executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); + TokenSenderLogger.info("Token chains Not Matching"); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Token chains Not Matching"); + return APIResponse; + } + } + + 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; @@ -1297,429 +1300,429 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) // 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"); - - String confirmation; - try { - confirmation = input.readLine(); - } catch (SocketException e) { - TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " is unable to Respond! - Pinning Auth"); - 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 + "is unable to respond! - Pinning Auth"); - - return APIResponse; - } - if (confirmation == null) { - executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); - TokenSenderLogger.info("Receiver is unable to Pin the tokens!"); - output.close(); - input.close(); - senderSocket.close(); - senderMutex = false; - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Receiver is unable to Pin the tokens!"); - return APIResponse; - - } else if (confirmation != null && (!confirmation.equals("Successfully Pinned"))) { - TokenSenderLogger.warn("Multiple Owners for the token"); - executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); - TokenSenderLogger.info("Tokens with multiple pins"); - output.close(); - input.close(); - senderSocket.close(); - senderMutex = false; - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Tokens with multiple pins"); - return APIResponse; - - } - - TokenSenderLogger.debug("3"); - TokenSenderLogger.debug("Whole tokens: " + wholeTokens); - TokenSenderLogger.debug("Part tokens: " + partTokens); - output.println(InitiatorProcedure.essential); - - String respAuth; - try { - respAuth = input.readLine(); - } catch (SocketException e) { - TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " is unable to Respond! - Share Confirmation"); - 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 + "is unable to respond! - Share Confirmation"); - - return APIResponse; - } - if (respAuth == null) { - executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); - TokenSenderLogger.info("Receiver is unable to complete the transaction!"); - output.close(); - input.close(); - senderSocket.close(); - senderMutex = false; - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Receiver is unable to complete the transaction!"); - return APIResponse; - - } else if (respAuth != null && (!respAuth.equals("Send Response"))) { - 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", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Receiver process not over"); - TokenSenderLogger.info("Incomplete Transaction"); - return APIResponse; - } - - TokenSenderLogger.debug("Operation over"); - - for (int i = 0; i < wholeTokens.length(); i++) - unpin(String.valueOf(wholeTokens.get(i)), ipfs); - repo(ipfs); - - /* - * Iterator keys = InitiatorConsensus.quorumSignature.keys(); JSONArray - * signedQuorumList = new JSONArray(); while (keys.hasNext()) - * signedQuorumList.put(keys.next()); - */ - - JSONArray QuorumSignatures = new JSONArray(InitiatorConsensus.quorumSignature.toString()); - JSONArray signedQuorumList = new JSONArray(); - JSONObject temp = new JSONObject(); - - for (int i = 0; i < QuorumSignatures.length(); i++) { - - temp = QuorumSignatures.getJSONObject(i); - signedQuorumList.put(temp.getString("quorum_did")); - } - - APIResponse.put("tid", tid); - APIResponse.put("status", "Success"); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("message", "Tokens transferred successfully!"); - APIResponse.put("quorumlist", signedQuorumList); - APIResponse.put("receiver", receiverDidIpfsHash); - APIResponse.put("totaltime", totalTime); - - JSONObject transactionRecord = new JSONObject(); - transactionRecord.put("role", "Sender"); - transactionRecord.put("tokens", allTokens); - transactionRecord.put("txn", tid); - transactionRecord.put("quorumList", signedQuorumList); - transactionRecord.put("senderDID", senderDidIpfsHash); - transactionRecord.put("receiverDID", receiverDidIpfsHash); - transactionRecord.put("Date", getCurrentUtcTime()); - transactionRecord.put("totalTime", totalTime); - transactionRecord.put("comment", comment); - transactionRecord.put("essentialShare", InitiatorProcedure.essential); - requestedAmount = formatAmount(requestedAmount); - transactionRecord.put("amount-spent", requestedAmount); - - JSONArray transactionHistoryEntry = new JSONArray(); - transactionHistoryEntry.put(transactionRecord); - - updateJSON("add", WALLET_DATA_PATH + "TransactionHistory.json", transactionHistoryEntry.toString()); - - for (int i = 0; i < wholeTokens.length(); i++) { - deleteFile(TOKENS_PATH.concat(wholeTokens.getString(i))); - Functions.updateJSON("remove", PAYMENTS_PATH.concat("BNK00.json"), wholeTokens.getString(i)); - } - if (decimalAmount != 0.0) { - - if (newPart) { - TokenSenderLogger.debug("Updating files for new parts"); - JSONObject newPartTokenObject = new JSONObject(); - newPartTokenObject.put("tokenHash", partTokens.getString(0)); - JSONArray newPartArray = new JSONArray(); - newPartArray.put(newPartTokenObject); - writeToFile(PAYMENTS_PATH.concat("PartsToken.json"), newPartArray.toString(), false); - - String bankNew = readFile(PAYMENTS_PATH.concat("BNK00.json")); - JSONArray bankNewArray = new JSONArray(bankNew); - bankNewArray.remove(0); - writeToFile(PAYMENTS_PATH.concat("BNK00.json"), bankNewArray.toString(), false); - - String newTokenChain = readFile(TOKENCHAIN_PATH + partTokens.getString(0) + ".json"); - JSONArray chainArray = new JSONArray(newTokenChain); - - 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")); - * newLastObject.put("previousHash", - * calculateHash(chainArray.getJSONObject(chainArray.length() - - * 1).getString("tid"), "SHA3-256")); } - */ - - Double amount = formatAmount(decimalAmount); - - newLastObject.put("senderSign", senderSign); - newLastObject.put("sender", senderDidIpfsHash); - newLastObject.put("receiver", receiverDidIpfsHash); - newLastObject.put("comment", comment); - newLastObject.put("tid", tid); - // newLastObject.put("nextHash", ""); - newLastObject.put("role", "Sender"); - newLastObject.put("amount", amount); - chainArray.put(newLastObject); - - output.println("New part token chain to be hashed"); - output.println(chainArray.toString()); - - TokenSenderLogger.debug("!@#$% 1: " + chainArray); - - String finalPartTokenChain_string; - try { - finalPartTokenChain_string = input.readLine(); - } catch (SocketException e) { - TokenSenderLogger.warn( - "Receiver " + receiverDidIpfsHash + " could'nt send hahsed and signed token chain blocks."); - 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 hahsed and signed token chain blocks."); - - return APIResponse; - } - TokenSenderLogger.debug("!@#$% 2: " + finalPartTokenChain_string); - - JSONArray newPartTokenChain = new JSONArray(finalPartTokenChain_string); - writeToFile(TOKENCHAIN_PATH + partTokens.getString(0) + ".json", newPartTokenChain.toString(), false); - - File tokenFile = new File(TOKENS_PATH.concat(partTokens.getString(0))); - tokenFile.renameTo(new File(PART_TOKEN_PATH.concat(partTokens.getString(0)))); - File chainFile = new File(TOKENCHAIN_PATH.concat(partTokens.getString(0)).concat(".json")); - chainFile.renameTo(new File(PART_TOKEN_CHAIN_PATH.concat(partTokens.getString(0)).concat(".json"))); - - File shiftedFile = new File(PAYMENTS_PATH.concat("ShiftedTokens.json")); - if (!shiftedFile.exists()) { - shiftedFile.createNewFile(); - JSONArray shiftedTokensArray = new JSONArray(); - shiftedTokensArray.put(partTokens.getString(0)); - writeToFile(PAYMENTS_PATH.concat("ShiftedTokens.json"), shiftedTokensArray.toString(), false); - } else { - String shiftedContent = readFile(PAYMENTS_PATH.concat("ShiftedTokens.json")); - JSONArray shiftedArray = new JSONArray(shiftedContent); - shiftedArray.put(partTokens.getString(0)); - writeToFile(PAYMENTS_PATH.concat("ShiftedTokens.json"), shiftedArray.toString(), false); - } - } else { - - JSONObject partTokenChainsToBeSentForHashing = new JSONObject(); - - TokenSenderLogger.debug("Updating files for old parts"); - for (int i = 0; i < partTokens.length(); i++) { - String newTokenChain = readFile( - TOKENCHAIN_PATH.concat("PARTS/") + partTokens.getString(i) + ".json"); - JSONArray chainArray = new JSONArray(newTokenChain); - - 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")); - * newLastObject.put("previousHash", calculateHash( - * chainArray.getJSONObject(chainArray.length() - 1).getString("tid"), - * "SHA3-256")); } - */ - - TokenSenderLogger.debug( - "Amount from ledger: " + formatAmount(amountLedger.getDouble(partTokens.getString(i)))); - Double amount = formatAmount(amountLedger.getDouble(partTokens.getString(i))); - - newLastObject.put("senderSign", senderSign); - newLastObject.put("sender", senderDidIpfsHash); - newLastObject.put("receiver", receiverDidIpfsHash); - newLastObject.put("comment", comment); - newLastObject.put("tid", tid); - // newLastObject.put("nextHash", ""); - newLastObject.put("role", "Sender"); - newLastObject.put("amount", amount); - chainArray.put(newLastObject); - - partTokenChainsToBeSentForHashing.put(partTokens.getString(i), chainArray); - - TokenSenderLogger.debug("Checking Parts Token Balance ..."); - Double availableParts = partTokenBalance(partTokens.getString(i)); - TokenSenderLogger.debug("Available: " + availableParts); - if (availableParts >= 1.000 || availableParts <= 0.000) { - TokenSenderLogger.debug("Wholly Spent, Removing token from parts"); - String partFileContent2 = readFile(PAYMENTS_PATH.concat("PartsToken.json")); - JSONArray partContentArray2 = new JSONArray(partFileContent2); - for (int j = 0; j < partContentArray2.length(); j++) { - if (partContentArray2.getJSONObject(j).getString("tokenHash") - .equals(partTokens.getString(i))) - partContentArray2.remove(j); - writeToFile(PAYMENTS_PATH.concat("PartsToken.json"), partContentArray2.toString(), false); - } - deleteFile(PART_TOKEN_PATH.concat(partTokens.getString(i))); - } - } - output.println("Old part token chains to be hashed"); - output.println(partTokenChainsToBeSentForHashing.toString()); - TokenSenderLogger.debug("!@#$% 3: " + partTokenChainsToBeSentForHashing); - - String hashedPartTokenChains_string; - try { - hashedPartTokenChains_string = input.readLine(); - } catch (SocketException e) { - TokenSenderLogger.warn( - "Receiver " + receiverDidIpfsHash + " could'nt send hahsed and signed token chain blocks."); - 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 hahsed and signed token chain blocks."); - - return APIResponse; - } - - TokenSenderLogger.debug("!@#$% 4: " + hashedPartTokenChains_string); - - JSONObject finalPartTokenChains = new JSONObject(hashedPartTokenChains_string); - for (int i = 0; i < partTokens.length(); i++) { - - JSONArray chainArray = finalPartTokenChains.getJSONArray(partTokens.getString(i)); - writeToFile(TOKENCHAIN_PATH.concat("PARTS/").concat(partTokens.getString(i)).concat(".json"), - chainArray.toString(), false); - } - - if (oldNew) { - String token = partTokens.getString(partTokens.length() - 1); - String bnk = readFile(PAYMENTS_PATH.concat("BNK00.json")); - JSONArray bnkArray = new JSONArray(bnk); - for (int i = 0; i < bnkArray.length(); i++) { - if (bnkArray.getJSONObject(i).getString("tokenHash").equals(token)) - bnkArray.remove(i); - } - writeToFile(PAYMENTS_PATH.concat("BNK00.json"), bnkArray.toString(), false); - - JSONArray pArray = new JSONArray(); - JSONObject pObject = new JSONObject(); - pObject.put("tokenHash", token); - pArray.put(pObject); - writeToFile(PAYMENTS_PATH.concat("PartsToken.json"), pArray.toString(), false); - - } - } - } - TokenSenderLogger.info("Transaction Successful"); - executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); - updateQuorum(quorumArray, signedQuorumList, true, type); - output.close(); - input.close(); - senderSocket.close(); - senderMutex = false; - - // Populating data to explorer - if (!EXPLORER_IP.contains("127.0.0.1")) { - - List tokenList = new ArrayList<>(); - for (int i = 0; i < allTokens.length(); i++) - tokenList.add(allTokens.getString(i)); - String url = EXPLORER_IP + "/CreateOrUpdateRubixTransaction"; - URL obj = new URL(url); - HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); - - // Setting basic post request - con.setRequestMethod("POST"); - con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); - con.setRequestProperty("Accept", "application/json"); - con.setRequestProperty("Content-Type", "application/json"); - con.setRequestProperty("Authorization", "null"); - - // Serialization - JSONObject dataToSend = new JSONObject(); - dataToSend.put("transaction_id", tid); - dataToSend.put("sender_did", senderDidIpfsHash); - dataToSend.put("receiver_did", receiverDidIpfsHash); - dataToSend.put("token_id", tokenList); - dataToSend.put("token_time", (int) totalTime); - dataToSend.put("amount", requestedAmount); - String populate = dataToSend.toString(); - - JSONObject jsonObject = new JSONObject(); - jsonObject.put("inputString", populate); - String postJsonData = jsonObject.toString(); - - // Send post request - con.setDoOutput(true); - DataOutputStream wr = new DataOutputStream(con.getOutputStream()); - wr.writeBytes(postJsonData); - wr.flush(); - wr.close(); - - int responseCode = con.getResponseCode(); - TokenSenderLogger.debug("Sending 'POST' request to URL : " + url); - TokenSenderLogger.debug("Post Data : " + postJsonData); - TokenSenderLogger.debug("Response Code : " + responseCode); - - BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); - String output; - StringBuffer response = new StringBuffer(); - - while ((output = in.readLine()) != null) { - response.append(output); - } - in.close(); - - TokenSenderLogger.debug(response.toString()); - } - - senderMutex = false; - resetVariables(); - return APIResponse; - - } + TokenSenderLogger.debug("Unpinned Tokens"); + output.println("Unpinned"); + + String confirmation; + try { + confirmation = input.readLine(); + } catch (SocketException e) { + TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " is unable to Respond! - Pinning Auth"); + 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 + "is unable to respond! - Pinning Auth"); + + return APIResponse; + } + if (confirmation == null) { + executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); + TokenSenderLogger.info("Receiver is unable to Pin the tokens!"); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Receiver is unable to Pin the tokens!"); + return APIResponse; + + } else if (confirmation != null && (!confirmation.equals("Successfully Pinned"))) { + TokenSenderLogger.warn("Multiple Owners for the token"); + executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); + TokenSenderLogger.info("Tokens with multiple pins"); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Tokens with multiple pins"); + return APIResponse; + + } + + TokenSenderLogger.debug("3"); + TokenSenderLogger.debug("Whole tokens: " + wholeTokens); + TokenSenderLogger.debug("Part tokens: " + partTokens); + output.println(InitiatorProcedure.essential); + + String respAuth; + try { + respAuth = input.readLine(); + } catch (SocketException e) { + TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " is unable to Respond! - Share Confirmation"); + 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 + "is unable to respond! - Share Confirmation"); + + return APIResponse; + } + if (respAuth == null) { + executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); + TokenSenderLogger.info("Receiver is unable to complete the transaction!"); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Receiver is unable to complete the transaction!"); + return APIResponse; + + } else if (respAuth != null && (!respAuth.equals("Send Response"))) { + 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", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Receiver process not over"); + TokenSenderLogger.info("Incomplete Transaction"); + return APIResponse; + } + + TokenSenderLogger.debug("Operation over"); + + for (int i = 0; i < wholeTokens.length(); i++) + unpin(String.valueOf(wholeTokens.get(i)), ipfs); + repo(ipfs); + + /* + * Iterator keys = InitiatorConsensus.quorumSignature.keys(); JSONArray + * signedQuorumList = new JSONArray(); while (keys.hasNext()) + * signedQuorumList.put(keys.next()); + */ + + JSONArray QuorumSignatures = new JSONArray(InitiatorConsensus.quorumSignature.toString()); + JSONArray signedQuorumList = new JSONArray(); + JSONObject temp = new JSONObject(); + + for (int i = 0; i < QuorumSignatures.length(); i++) { + + temp = QuorumSignatures.getJSONObject(i); + signedQuorumList.put(temp.getString("quorum_did")); + } + + APIResponse.put("tid", tid); + APIResponse.put("status", "Success"); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("message", "Tokens transferred successfully!"); + APIResponse.put("quorumlist", signedQuorumList); + APIResponse.put("receiver", receiverDidIpfsHash); + APIResponse.put("totaltime", totalTime); + + JSONObject transactionRecord = new JSONObject(); + transactionRecord.put("role", "Sender"); + transactionRecord.put("tokens", allTokens); + transactionRecord.put("txn", tid); + transactionRecord.put("quorumList", signedQuorumList); + transactionRecord.put("senderDID", senderDidIpfsHash); + transactionRecord.put("receiverDID", receiverDidIpfsHash); + transactionRecord.put("Date", getCurrentUtcTime()); + transactionRecord.put("totalTime", totalTime); + transactionRecord.put("comment", comment); + transactionRecord.put("essentialShare", InitiatorProcedure.essential); + requestedAmount = formatAmount(requestedAmount); + transactionRecord.put("amount-spent", requestedAmount); + + JSONArray transactionHistoryEntry = new JSONArray(); + transactionHistoryEntry.put(transactionRecord); + + updateJSON("add", WALLET_DATA_PATH + "TransactionHistory.json", transactionHistoryEntry.toString()); + + for (int i = 0; i < wholeTokens.length(); i++) { + deleteFile(TOKENS_PATH.concat(wholeTokens.getString(i))); + Functions.updateJSON("remove", PAYMENTS_PATH.concat("BNK00.json"), wholeTokens.getString(i)); + } + if (decimalAmount != 0.0) { + + if (newPart) { + TokenSenderLogger.debug("Updating files for new parts"); + JSONObject newPartTokenObject = new JSONObject(); + newPartTokenObject.put("tokenHash", partTokens.getString(0)); + JSONArray newPartArray = new JSONArray(); + newPartArray.put(newPartTokenObject); + writeToFile(PAYMENTS_PATH.concat("PartsToken.json"), newPartArray.toString(), false); + + String bankNew = readFile(PAYMENTS_PATH.concat("BNK00.json")); + JSONArray bankNewArray = new JSONArray(bankNew); + bankNewArray.remove(0); + writeToFile(PAYMENTS_PATH.concat("BNK00.json"), bankNewArray.toString(), false); + + String newTokenChain = readFile(TOKENCHAIN_PATH + partTokens.getString(0) + ".json"); + JSONArray chainArray = new JSONArray(newTokenChain); + + 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")); + * newLastObject.put("previousHash", + * calculateHash(chainArray.getJSONObject(chainArray.length() - + * 1).getString("tid"), "SHA3-256")); } + */ + + Double amount = formatAmount(decimalAmount); + + newLastObject.put("senderSign", senderSign); + newLastObject.put("sender", senderDidIpfsHash); + newLastObject.put("receiver", receiverDidIpfsHash); + newLastObject.put("comment", comment); + newLastObject.put("tid", tid); + // newLastObject.put("nextHash", ""); + newLastObject.put("role", "Sender"); + newLastObject.put("amount", amount); + chainArray.put(newLastObject); + + output.println("New part token chain to be hashed"); + output.println(chainArray.toString()); + + TokenSenderLogger.debug("!@#$% 1: " + chainArray); + + String finalPartTokenChain_string; + try { + finalPartTokenChain_string = input.readLine(); + } catch (SocketException e) { + TokenSenderLogger.warn( + "Receiver " + receiverDidIpfsHash + " could'nt send hahsed and signed token chain blocks."); + 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 hahsed and signed token chain blocks."); + + return APIResponse; + } + TokenSenderLogger.debug("!@#$% 2: " + finalPartTokenChain_string); + + JSONArray newPartTokenChain = new JSONArray(finalPartTokenChain_string); + writeToFile(TOKENCHAIN_PATH + partTokens.getString(0) + ".json", newPartTokenChain.toString(), false); + + File tokenFile = new File(TOKENS_PATH.concat(partTokens.getString(0))); + tokenFile.renameTo(new File(PART_TOKEN_PATH.concat(partTokens.getString(0)))); + File chainFile = new File(TOKENCHAIN_PATH.concat(partTokens.getString(0)).concat(".json")); + chainFile.renameTo(new File(PART_TOKEN_CHAIN_PATH.concat(partTokens.getString(0)).concat(".json"))); + + File shiftedFile = new File(PAYMENTS_PATH.concat("ShiftedTokens.json")); + if (!shiftedFile.exists()) { + shiftedFile.createNewFile(); + JSONArray shiftedTokensArray = new JSONArray(); + shiftedTokensArray.put(partTokens.getString(0)); + writeToFile(PAYMENTS_PATH.concat("ShiftedTokens.json"), shiftedTokensArray.toString(), false); + } else { + String shiftedContent = readFile(PAYMENTS_PATH.concat("ShiftedTokens.json")); + JSONArray shiftedArray = new JSONArray(shiftedContent); + shiftedArray.put(partTokens.getString(0)); + writeToFile(PAYMENTS_PATH.concat("ShiftedTokens.json"), shiftedArray.toString(), false); + } + } else { + + JSONObject partTokenChainsToBeSentForHashing = new JSONObject(); + + TokenSenderLogger.debug("Updating files for old parts"); + for (int i = 0; i < partTokens.length(); i++) { + String newTokenChain = readFile( + TOKENCHAIN_PATH.concat("PARTS/") + partTokens.getString(i) + ".json"); + JSONArray chainArray = new JSONArray(newTokenChain); + + 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")); + * newLastObject.put("previousHash", calculateHash( + * chainArray.getJSONObject(chainArray.length() - 1).getString("tid"), + * "SHA3-256")); } + */ + + TokenSenderLogger.debug( + "Amount from ledger: " + formatAmount(amountLedger.getDouble(partTokens.getString(i)))); + Double amount = formatAmount(amountLedger.getDouble(partTokens.getString(i))); + + newLastObject.put("senderSign", senderSign); + newLastObject.put("sender", senderDidIpfsHash); + newLastObject.put("receiver", receiverDidIpfsHash); + newLastObject.put("comment", comment); + newLastObject.put("tid", tid); + // newLastObject.put("nextHash", ""); + newLastObject.put("role", "Sender"); + newLastObject.put("amount", amount); + chainArray.put(newLastObject); + + partTokenChainsToBeSentForHashing.put(partTokens.getString(i), chainArray); + + TokenSenderLogger.debug("Checking Parts Token Balance ..."); + Double availableParts = partTokenBalance(partTokens.getString(i)); + TokenSenderLogger.debug("Available: " + availableParts); + if (availableParts >= 1.000 || availableParts <= 0.000) { + TokenSenderLogger.debug("Wholly Spent, Removing token from parts"); + String partFileContent2 = readFile(PAYMENTS_PATH.concat("PartsToken.json")); + JSONArray partContentArray2 = new JSONArray(partFileContent2); + for (int j = 0; j < partContentArray2.length(); j++) { + if (partContentArray2.getJSONObject(j).getString("tokenHash") + .equals(partTokens.getString(i))) + partContentArray2.remove(j); + writeToFile(PAYMENTS_PATH.concat("PartsToken.json"), partContentArray2.toString(), false); + } + deleteFile(PART_TOKEN_PATH.concat(partTokens.getString(i))); + } + } + output.println("Old part token chains to be hashed"); + output.println(partTokenChainsToBeSentForHashing.toString()); + TokenSenderLogger.debug("!@#$% 3: " + partTokenChainsToBeSentForHashing); + + String hashedPartTokenChains_string; + try { + hashedPartTokenChains_string = input.readLine(); + } catch (SocketException e) { + TokenSenderLogger.warn( + "Receiver " + receiverDidIpfsHash + " could'nt send hahsed and signed token chain blocks."); + 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 hahsed and signed token chain blocks."); + + return APIResponse; + } + + TokenSenderLogger.debug("!@#$% 4: " + hashedPartTokenChains_string); + + JSONObject finalPartTokenChains = new JSONObject(hashedPartTokenChains_string); + for (int i = 0; i < partTokens.length(); i++) { + + JSONArray chainArray = finalPartTokenChains.getJSONArray(partTokens.getString(i)); + writeToFile(TOKENCHAIN_PATH.concat("PARTS/").concat(partTokens.getString(i)).concat(".json"), + chainArray.toString(), false); + } + + if (oldNew) { + String token = partTokens.getString(partTokens.length() - 1); + String bnk = readFile(PAYMENTS_PATH.concat("BNK00.json")); + JSONArray bnkArray = new JSONArray(bnk); + for (int i = 0; i < bnkArray.length(); i++) { + if (bnkArray.getJSONObject(i).getString("tokenHash").equals(token)) + bnkArray.remove(i); + } + writeToFile(PAYMENTS_PATH.concat("BNK00.json"), bnkArray.toString(), false); + + JSONArray pArray = new JSONArray(); + JSONObject pObject = new JSONObject(); + pObject.put("tokenHash", token); + pArray.put(pObject); + writeToFile(PAYMENTS_PATH.concat("PartsToken.json"), pArray.toString(), false); + + } + } + } + TokenSenderLogger.info("Transaction Successful"); + executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); + updateQuorum(quorumArray, signedQuorumList, true, type); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + + // Populating data to explorer + if (!EXPLORER_IP.contains("127.0.0.1")) { + + List tokenList = new ArrayList<>(); + for (int i = 0; i < allTokens.length(); i++) + tokenList.add(allTokens.getString(i)); + String url = EXPLORER_IP + "/CreateOrUpdateRubixTransaction"; + URL obj = new URL(url); + HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); + + // Setting basic post request + con.setRequestMethod("POST"); + con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); + con.setRequestProperty("Accept", "application/json"); + con.setRequestProperty("Content-Type", "application/json"); + con.setRequestProperty("Authorization", "null"); + + // Serialization + JSONObject dataToSend = new JSONObject(); + dataToSend.put("transaction_id", tid); + dataToSend.put("sender_did", senderDidIpfsHash); + dataToSend.put("receiver_did", receiverDidIpfsHash); + dataToSend.put("token_id", tokenList); + dataToSend.put("token_time", (int) totalTime); + dataToSend.put("amount", requestedAmount); + String populate = dataToSend.toString(); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("inputString", populate); + String postJsonData = jsonObject.toString(); + + // Send post request + con.setDoOutput(true); + DataOutputStream wr = new DataOutputStream(con.getOutputStream()); + wr.writeBytes(postJsonData); + wr.flush(); + wr.close(); + + int responseCode = con.getResponseCode(); + TokenSenderLogger.debug("Sending 'POST' request to URL : " + url); + TokenSenderLogger.debug("Post Data : " + postJsonData); + TokenSenderLogger.debug("Response Code : " + responseCode); + + BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); + String output; + StringBuffer response = new StringBuffer(); + + while ((output = in.readLine()) != null) { + response.append(output); + } + in.close(); + + TokenSenderLogger.debug(response.toString()); + } + + senderMutex = false; + resetVariables(); + return APIResponse; + + } } \ No newline at end of file From bcd2e0429d1b5d8707f91f2e8d2fdeac573b38ea Mon Sep 17 00:00:00 2001 From: Aparna Ullas Date: Sun, 4 Dec 2022 17:19:24 +0530 Subject: [PATCH 2/8] Fork Resolution --- .../rubix/TokenTransfer/ForkResolution.java | 29 +++++---- .../rubix/TokenTransfer/TokenReceiver.java | 64 ++++++++++--------- 2 files changed, 52 insertions(+), 41 deletions(-) diff --git a/src/com/rubix/TokenTransfer/ForkResolution.java b/src/com/rubix/TokenTransfer/ForkResolution.java index 8235dd3..1c2f302 100644 --- a/src/com/rubix/TokenTransfer/ForkResolution.java +++ b/src/com/rubix/TokenTransfer/ForkResolution.java @@ -3,17 +3,18 @@ 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; public class ForkResolution { - public static Logger ForkResolutionLogger = Logger.getLogger(TokenReceiver.class); + 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 { + public static boolean check(JSONObject tokenDetails) throws IOException, InterruptedException, JSONException { boolean resolution = true; /** * 1. Check number of pins on the token @@ -66,15 +67,21 @@ public static boolean check(JSONObject tokenDetails) throws IOException, Interru if (!tokenOwners) { JSONObject lastObject = tokenChain.getJSONObject(tokenChain.length() - 1); ForkResolutionLogger.debug("Last Object of token " + token + ": " + lastObject); - if(lastObject.has("pledgeToken")){ - String pledgeToken = lastObject.getString("pledgeToken"); - ForkResolutionLogger.debug("Checking owners for pledgeToken" + pledgeToken + " Please wait..."); - pinOwnersArrayPledgedToken = IPFSNetwork.dhtOwnerCheck(pledgeToken); - if (pinOwnersArrayPledgedToken.size() != 1) { - resolution = false; - resolutionMessage = "Pledge token has more than one owner"; - }else - ForkResolutionLogger.debug("Pledged Token " + pledgeToken + " has not multiple pins. Passed !!!"); + 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; diff --git a/src/com/rubix/TokenTransfer/TokenReceiver.java b/src/com/rubix/TokenTransfer/TokenReceiver.java index 87e75a6..1de3aba 100644 --- a/src/com/rubix/TokenTransfer/TokenReceiver.java +++ b/src/com/rubix/TokenTransfer/TokenReceiver.java @@ -221,36 +221,7 @@ public static String receive() { Double decimalPart = formatAmount(amount - intPart); - boolean forkResolution = true; - JSONArray forkedTokens = new JSONArray(); - for (int i = 0; i < wholeTokens.length(); ++i) { - TokenReceiverLogger.debug("Fork Checking for token: " + wholeTokens.getString(i)); - JSONObject forkObject = new JSONObject(); - forkObject.put("token", wholeTokens.getString(i)); - forkObject.put("tokenChain", wholeTokenChains.getJSONArray(i)); - forkObject.put("previousSendersArray", previousSendersArray); - 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(); - } + // ? multiple pin check starts @@ -359,6 +330,39 @@ public static String receive() { tokenDetailMap.put(tokenNumberHash, -1); } + 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)); + JSONObject forkObject = new JSONObject(); + forkObject.put("token", wholeTokens.getString(i)); + forkObject.put("tokenChain", new JSONArray(wholeTokenChainContent.get(i))); + forkObject.put("previousSendersArray", previousSendersArray); + 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 From 03364c09a8c2c7f4c228582ccf7517b0fc177c1a Mon Sep 17 00:00:00 2001 From: Gokul P S Date: Mon, 5 Dec 2022 16:46:43 +0530 Subject: [PATCH 3/8] 5on& --- .gitignore | 31 +++++++++++++++ .../rubix/Consensus/InitiatorProcedure.java | 20 +--------- src/com/rubix/TokenTransfer/TokenSender.java | 38 ++++++++----------- 3 files changed, 47 insertions(+), 42 deletions(-) diff --git a/.gitignore b/.gitignore index ed976ac..3ebd1e1 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/InitiatorProcedure.java b/src/com/rubix/Consensus/InitiatorProcedure.java index cdbb05f..910482b 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,29 +168,11 @@ 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))))) { diff --git a/src/com/rubix/TokenTransfer/TokenSender.java b/src/com/rubix/TokenTransfer/TokenSender.java index a502973..1629004 100644 --- a/src/com/rubix/TokenTransfer/TokenSender.java +++ b/src/com/rubix/TokenTransfer/TokenSender.java @@ -42,8 +42,6 @@ public class TokenSender { 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(); @@ -71,8 +69,6 @@ public static void resetVariables() { partTokens = new JSONArray(); wholeTokens = new JSONArray(); alphaPeersList = new ArrayList<>(); - betaPeersList = new ArrayList<>(); - gammaPeersList = new ArrayList<>(); alphaSize = -1; tokenPreviousSender = new JSONArray(); wholeTokenChainHash = new JSONArray(); @@ -391,8 +387,6 @@ 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: { @@ -432,6 +426,14 @@ public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exce } case 3: { quorumArray = detailsObject.getJSONArray("quorum"); + JSONArray finArray = new JSONArray(); + if(quorumArray.length()>7) { + for(int i=0;i<7;i++) { + finArray.put(quorumArray.get(i)); + + } + quorumArray = finArray; + } break; } default: { @@ -468,7 +470,7 @@ 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; + int alphaCheck = 0; JSONArray sanityFailedQuorum = new JSONArray(); for (int i = 0; i < quorumArray.length(); i++) { String quorumPeerID = getValues(DATA_PATH + "DataTable.json", "peerid", "didHash", @@ -479,14 +481,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"); @@ -505,21 +504,16 @@ public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exce 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"); @@ -1102,14 +1096,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); From 5c600ec7c920458f7f00982de42b03e337623f8f Mon Sep 17 00:00:00 2001 From: Gokul P S Date: Mon, 5 Dec 2022 16:56:27 +0530 Subject: [PATCH 4/8] 5on7 --- src/com/rubix/Consensus/InitiatorConsensus.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/com/rubix/Consensus/InitiatorConsensus.java b/src/com/rubix/Consensus/InitiatorConsensus.java index f661334..0a839b7 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) { From ffaf6979b61464ac2e248d78fe2300fba159b32a Mon Sep 17 00:00:00 2001 From: Gokul P S Date: Mon, 5 Dec 2022 18:26:59 +0530 Subject: [PATCH 5/8] Fixes --- src/com/rubix/TokenTransfer/TokenSender.java | 3235 +++++++++--------- 1 file changed, 1612 insertions(+), 1623 deletions(-) diff --git a/src/com/rubix/TokenTransfer/TokenSender.java b/src/com/rubix/TokenTransfer/TokenSender.java index 1629004..c597fd7 100644 --- a/src/com/rubix/TokenTransfer/TokenSender.java +++ b/src/com/rubix/TokenTransfer/TokenSender.java @@ -31,660 +31,650 @@ import static com.rubix.Resources.IPFSNetwork.*; 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(); - private static String tid = null; - private static JSONArray partTokens = new JSONArray(); - private static JSONArray wholeTokens = new JSONArray(); - private static ArrayList alphaPeersList; - private static int alphaSize = -1; - private static JSONArray tokenPreviousSender = new JSONArray(); - private static JSONArray wholeTokenChainHash = new JSONArray(); - private static JSONArray partTokenChainHash = new JSONArray(); - private static JSONObject partTokenChainsPrevState = new JSONObject(); - private static String tokenChainPath = "", tokenPath = ""; - private static JSONObject amountLedger = new JSONObject(); - private static JSONArray allTokens = new JSONArray(); - private static boolean newPart = false, oldNew = false; - private static Double decimalAmount = -1.00; - private static String PART_TOKEN_CHAIN_PATH = TOKENCHAIN_PATH.concat("PARTS/"); - private static String PART_TOKEN_PATH = TOKENS_PATH.concat("PARTS/"); - private static String senderPayloadHash = null; - private static int intPart = -1; - private static int wholeAmount = -1; - private static PrintStream output; - private static BufferedReader input; - private static Socket senderSocket; - private static boolean senderMutex = false; - - public static void resetVariables() { - detailsObject = new JSONObject(); - quorumArray = new JSONArray(); - tid = null; - partTokens = new JSONArray(); - wholeTokens = new JSONArray(); - alphaPeersList = new ArrayList<>(); - alphaSize = -1; - tokenPreviousSender = new JSONArray(); - wholeTokenChainHash = new JSONArray(); - partTokenChainHash = new JSONArray(); - lastObJsonArray = new JSONArray(); - partTokenChainsPrevState = new JSONObject(); - tokenChainPath = ""; - tokenPath = ""; - amountLedger = new JSONObject(); - allTokens = new JSONArray(); - newPart = false; - oldNew = false; - decimalAmount = -1.00; - PART_TOKEN_CHAIN_PATH = TOKENCHAIN_PATH.concat("PARTS/"); - PART_TOKEN_PATH = TOKENS_PATH.concat("PARTS/"); - senderPayloadHash = null; - intPart = -1; - wholeAmount = -1; - senderMutex = false; - authSenderByRecHash = ""; - TokenSenderLogger.debug("Cleanup completed"); - } - - /** - * A sender node to transfer tokens - * - * @param data Details required for tokenTransfer - * @param ipfs IPFS instance - * @param port Sender port for communication - * @return Transaction Details (JSONObject) - * @throws IOException handles IO Exceptions - * @throws JSONException handles JSON Exceptions - * @throws NoSuchAlgorithmException handles No Such Algorithm Exceptions - */ - public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exception { - repo(ipfs); - resetVariables(); - JSONObject APIResponse = new JSONObject(); - PropertyConfigurator.configure(LOGGER_PATH + "log4jWallet.properties"); - - JSONObject challengeObject = new JSONObject(); - - detailsObject = new JSONObject(data); - String receiverDidIpfsHash = detailsObject.getString("receiverDidIpfsHash"); - syncDataTableByDID(receiverDidIpfsHash); - String pvt = detailsObject.getString("pvt"); - double requestedAmount = detailsObject.getDouble("amount"); - int type = detailsObject.getInt("type"); - String comment = detailsObject.getString("comment"); - String keyPass = detailsObject.getString("pvtKeyPass"); - PrivateKey pvtKey = null; - pvtKey = getPvtKey(keyPass, 1); - - // If user enters wrong pvt key password - if (pvtKey == null) { - APIResponse.put("message", - "Incorrect password entered for Private Key, cannot proceed with the transaction"); - TokenSenderLogger.warn("Incorrect Private Key password entered"); - return APIResponse; - } - - // detailsObject.remove("pvtKeyPass"); - - APIResponse = new JSONObject(); - - intPart = (int) requestedAmount; - String senderPeerID = getPeerID(DATA_PATH + "DID.json"); - TokenSenderLogger.debug("sender peer id" + senderPeerID); - String senderDidIpfsHash = getValues(DATA_PATH + "DataTable.json", "didHash", "peerid", senderPeerID); - TokenSenderLogger.debug("sender did ipfs hash" + senderDidIpfsHash); - - if (senderMutex) { - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Sender busy. Try again later"); - TokenSenderLogger.warn("Sender busy"); - return APIResponse; - } - - senderMutex = true; - - File partFolder = new File(PART_TOKEN_PATH); - if (!partFolder.exists()) - partFolder.mkdir(); - partFolder = new File(PART_TOKEN_CHAIN_PATH); - if (!partFolder.exists()) - partFolder.mkdir(); - File partTokensFile = new File(PAYMENTS_PATH.concat("PartsToken.json")); - if (!partTokensFile.exists()) { - partTokensFile.createNewFile(); - writeToFile(partTokensFile.toString(), "[]", false); - } - - 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 ; - if (intPart <= bankArray.length()) - wholeAmount = intPart; - else - wholeAmount = bankArray.length(); - - TokenSenderLogger.debug("wholeAmount is " + wholeAmount); - - for (int i = 0; i < wholeAmount; i++) { - 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 - String tokenRemove = wholeTokens.getString(i); - for (int j = 0; j < bankArray.length(); j++) { - if (bankArray.getJSONObject(j).getString("tokenHash").equals(tokenRemove)) - bankArray.remove(j); - } - } - - for (int i = 0; i < wholeTokens.length(); i++) { - File token = new File(TOKENS_PATH + wholeTokens.get(i)); - File tokenchain = new File(TOKENCHAIN_PATH + wholeTokens.get(i) + ".json"); - if (!(token.exists() && tokenchain.exists())) { - TokenSenderLogger.info("Tokens Not Verified"); - senderMutex = false; - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Invalid token(s)"); - return APIResponse; - - } - String wholeTokenHash = add(TOKENS_PATH + wholeTokens.get(i), ipfs); - pin(wholeTokenHash, ipfs); - String tokenChainHash = add(TOKENCHAIN_PATH + wholeTokens.get(i) + ".json", ipfs); - wholeTokenChainHash.put(tokenChainHash); - - String tokenChainFileContent = readFile(TOKENCHAIN_PATH + wholeTokens.get(i) + ".json"); - JSONArray tokenChainFileArray = new JSONArray(tokenChainFileContent); - JSONArray previousSenderArray = new JSONArray(); - - if (tokenChainFileArray.length() > 0) { - // JSONObject lastObject = - // tokenChainFileArray.getJSONObject(tokenChainFileArray.length() - 1); - - TokenSenderLogger.debug("Reading TokenChain file : " + TOKENCHAIN_PATH + wholeTokens.get(i) + ".json"); - for (int j = 0; j < tokenChainFileArray.length(); j++) { + 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(); + private static String tid = null; + private static JSONArray partTokens = new JSONArray(); + private static JSONArray wholeTokens = new JSONArray(); + private static ArrayList alphaPeersList; + private static int alphaSize = -1; + private static JSONArray tokenPreviousSender = new JSONArray(); + private static JSONArray wholeTokenChainHash = new JSONArray(); + private static JSONArray partTokenChainHash = new JSONArray(); + private static JSONObject partTokenChainsPrevState = new JSONObject(); + private static String tokenChainPath = "", tokenPath = ""; + private static JSONObject amountLedger = new JSONObject(); + private static JSONArray allTokens = new JSONArray(); + private static boolean newPart = false, oldNew = false; + private static Double decimalAmount = -1.00; + private static String PART_TOKEN_CHAIN_PATH = TOKENCHAIN_PATH.concat("PARTS/"); + private static String PART_TOKEN_PATH = TOKENS_PATH.concat("PARTS/"); + private static String senderPayloadHash = null; + private static int intPart = -1; + private static int wholeAmount = -1; + private static PrintStream output; + private static BufferedReader input; + private static Socket senderSocket; + private static boolean senderMutex = false; + + public static void resetVariables() { + detailsObject = new JSONObject(); + quorumArray = new JSONArray(); + tid = null; + partTokens = new JSONArray(); + wholeTokens = new JSONArray(); + alphaPeersList = new ArrayList<>(); + alphaSize = -1; + tokenPreviousSender = new JSONArray(); + wholeTokenChainHash = new JSONArray(); + partTokenChainHash = new JSONArray(); + lastObJsonArray = new JSONArray(); + partTokenChainsPrevState = new JSONObject(); + tokenChainPath = ""; + tokenPath = ""; + amountLedger = new JSONObject(); + allTokens = new JSONArray(); + newPart = false; + oldNew = false; + decimalAmount = -1.00; + PART_TOKEN_CHAIN_PATH = TOKENCHAIN_PATH.concat("PARTS/"); + PART_TOKEN_PATH = TOKENS_PATH.concat("PARTS/"); + senderPayloadHash = null; + intPart = -1; + wholeAmount = -1; + senderMutex = false; + authSenderByRecHash = ""; + TokenSenderLogger.debug("Cleanup completed"); + } + + /** + * A sender node to transfer tokens + * + * @param data Details required for tokenTransfer + * @param ipfs IPFS instance + * @param port Sender port for communication + * @return Transaction Details (JSONObject) + * @throws IOException handles IO Exceptions + * @throws JSONException handles JSON Exceptions + * @throws NoSuchAlgorithmException handles No Such Algorithm Exceptions + */ + public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exception { + repo(ipfs); + resetVariables(); + JSONObject APIResponse = new JSONObject(); + PropertyConfigurator.configure(LOGGER_PATH + "log4jWallet.properties"); + + JSONObject challengeObject = new JSONObject(); + + detailsObject = new JSONObject(data); + String receiverDidIpfsHash = detailsObject.getString("receiverDidIpfsHash"); + syncDataTableByDID(receiverDidIpfsHash); + String pvt = detailsObject.getString("pvt"); + double requestedAmount = detailsObject.getDouble("amount"); + int type = detailsObject.getInt("type"); + String comment = detailsObject.getString("comment"); + String keyPass = detailsObject.getString("pvtKeyPass"); + PrivateKey pvtKey = null; + pvtKey = getPvtKey(keyPass, 1); + + // If user enters wrong pvt key password + if (pvtKey == null) { + APIResponse.put("message", + "Incorrect password entered for Private Key, cannot proceed with the transaction"); + TokenSenderLogger.warn("Incorrect Private Key password entered"); + return APIResponse; + } + + // detailsObject.remove("pvtKeyPass"); + + APIResponse = new JSONObject(); + + intPart = (int) requestedAmount; + String senderPeerID = getPeerID(DATA_PATH + "DID.json"); + TokenSenderLogger.debug("sender peer id" + senderPeerID); + String senderDidIpfsHash = getValues(DATA_PATH + "DataTable.json", "didHash", "peerid", senderPeerID); + TokenSenderLogger.debug("sender did ipfs hash" + senderDidIpfsHash); + + if (senderMutex) { + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Sender busy. Try again later"); + TokenSenderLogger.warn("Sender busy"); + return APIResponse; + } + + senderMutex = true; + + File partFolder = new File(PART_TOKEN_PATH); + if (!partFolder.exists()) + partFolder.mkdir(); + partFolder = new File(PART_TOKEN_CHAIN_PATH); + if (!partFolder.exists()) + partFolder.mkdir(); + File partTokensFile = new File(PAYMENTS_PATH.concat("PartsToken.json")); + if (!partTokensFile.exists()) { + partTokensFile.createNewFile(); + writeToFile(partTokensFile.toString(), "[]", false); + } + + 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 ; + if (intPart <= bankArray.length()) + wholeAmount = intPart; + else + wholeAmount = bankArray.length(); + + TokenSenderLogger.debug("wholeAmount is " + wholeAmount); + + for (int i = 0; i < wholeAmount; i++) { + 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 + String tokenRemove = wholeTokens.getString(i); + for (int j = 0; j < bankArray.length(); j++) { + if (bankArray.getJSONObject(j).getString("tokenHash").equals(tokenRemove)) + bankArray.remove(j); + } + } + + for (int i = 0; i < wholeTokens.length(); i++) { + File token = new File(TOKENS_PATH + wholeTokens.get(i)); + File tokenchain = new File(TOKENCHAIN_PATH + wholeTokens.get(i) + ".json"); + if (!(token.exists() && tokenchain.exists())) { + TokenSenderLogger.info("Tokens Not Verified"); + senderMutex = false; + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Invalid token(s)"); + return APIResponse; + + } + String wholeTokenHash = add(TOKENS_PATH + wholeTokens.get(i), ipfs); + pin(wholeTokenHash, ipfs); + String tokenChainHash = add(TOKENCHAIN_PATH + wholeTokens.get(i) + ".json", ipfs); + wholeTokenChainHash.put(tokenChainHash); + + String tokenChainFileContent = readFile(TOKENCHAIN_PATH + wholeTokens.get(i) + ".json"); + JSONArray tokenChainFileArray = new JSONArray(tokenChainFileContent); + JSONArray previousSenderArray = new JSONArray(); + + if (tokenChainFileArray.length() > 0) { + // JSONObject lastObject = + // tokenChainFileArray.getJSONObject(tokenChainFileArray.length() - 1); + + 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); - String peerID = getValues(DATA_PATH + "DataTable.json", "peerid", "didHash", - tokenChainFileArray.getJSONObject(j).getString("sender")); - previousSenderArray.put(peerID); - } - } - - JSONObject previousSenderObject = new JSONObject(); - previousSenderObject.put("token", wholeTokenHash); - previousSenderObject.put("sender", previousSenderArray); - tokenPreviousSender.put(previousSenderObject); - - } - - decimalAmount = requestedAmount - wholeAmount; - decimalAmount = formatAmount(decimalAmount); - - TokenSenderLogger.debug("Decimal Part: " + decimalAmount); - if (decimalAmount > 0.000D) { - TokenSenderLogger.debug("Decimal Amount > 0.000D"); - String partFileContent = readFile(partTokensFile.toString()); - JSONArray partContentArray = new JSONArray(partFileContent); - - if (partContentArray.length() == 0) { - newPart = true; - TokenSenderLogger.debug("New token for parts"); - String chosenToken = bankArray.getJSONObject(0).getString("tokenHash"); - partTokens.put(chosenToken); - amountLedger.put(chosenToken, formatAmount(decimalAmount)); - - } else { - Double counter = decimalAmount; - JSONArray selectParts = new JSONArray(partFileContent); - while (counter > 0.000D) { - counter = formatAmount(counter); - TokenSenderLogger.debug("Counter: " + formatAmount(counter)); - if (!(selectParts.length() == 0)) { - TokenSenderLogger.debug("Old Parts"); - String currentPartToken = selectParts.getJSONObject(0).getString("tokenHash"); - Double currentPartBalance = partTokenBalance(currentPartToken); - currentPartBalance = formatAmount(currentPartBalance); - if (counter >= currentPartBalance) - amountLedger.put(currentPartToken, formatAmount(currentPartBalance)); - else - amountLedger.put(currentPartToken, formatAmount(counter)); - - partTokens.put(currentPartToken); - counter -= currentPartBalance; - selectParts.remove(0); - } else { - oldNew = true; - TokenSenderLogger.debug("Old Parts then new parts"); - String chosenToken = bankArray.getJSONObject(0).getString("tokenHash"); - partTokens.put(chosenToken); - amountLedger.put(chosenToken, formatAmount(counter)); - File tokenFile = new File(TOKENS_PATH.concat(chosenToken)); - tokenFile.renameTo(new File(PART_TOKEN_PATH.concat(chosenToken))); - File chainFile = new File(TOKENCHAIN_PATH.concat(chosenToken).concat(".json")); - chainFile.renameTo(new File(PART_TOKEN_CHAIN_PATH.concat(chosenToken).concat(".json"))); - - File shiftedFile = new File(PAYMENTS_PATH.concat("ShiftedTokens.json")); - if (!shiftedFile.exists()) { - shiftedFile.createNewFile(); - JSONArray shiftedTokensArray = new JSONArray(); - shiftedTokensArray.put(chosenToken); - writeToFile(PAYMENTS_PATH.concat("ShiftedTokens.json"), shiftedTokensArray.toString(), - false); - } else { - String shiftedContent = readFile(PAYMENTS_PATH.concat("ShiftedTokens.json")); - JSONArray shiftedArray = new JSONArray(shiftedContent); - shiftedArray.put(chosenToken); - writeToFile(PAYMENTS_PATH.concat("ShiftedTokens.json"), shiftedArray.toString(), false); - } - counter = 0.000D; - } - } - } - } - - if (newPart) { - tokenChainPath = TOKENCHAIN_PATH; - tokenPath = TOKENS_PATH; - } else { - tokenChainPath = TOKENCHAIN_PATH.concat("PARTS/"); - tokenPath = TOKENS_PATH.concat("PARTS/"); - } - - TokenSenderLogger.debug("Tokenchain path: " + tokenChainPath); - TokenSenderLogger.debug("Token path: " + tokenPath); - for (int i = 0; i < partTokens.length(); i++) { - File token = new File(tokenPath.concat(partTokens.getString(i))); - File tokenchain = new File(tokenChainPath.concat(partTokens.getString(i)) + ".json"); - if (!(token.exists() && tokenchain.exists())) { - if (!token.exists()) - TokenSenderLogger.debug("Token File for parts not avail"); - if (!tokenchain.exists()) - TokenSenderLogger.debug("Token Chain File for parts not avail"); - - TokenSenderLogger.info("Tokens Not Verified"); - senderMutex = false; - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Invalid part token(s)"); - return APIResponse; - - } - String hash = add(tokenPath + partTokens.getString(i), ipfs); - pin(hash, ipfs); - - String chainContent = readFile(tokenChainPath.concat(partTokens.getString(i)).concat(".json")); - - JSONArray chainArray = new JSONArray(); - JSONArray finalChainArray = new JSONArray(chainContent); - for (int j = 0; j < finalChainArray.length(); j++) { - JSONObject object = finalChainArray.getJSONObject(j); - /* - * if (finalChainArray.length() == 1) { object.put("previousHash", ""); - * object.put("nextHash", ""); } else if (finalChainArray.length() > 1) { if (j - * == 0) { object.put("previousHash", ""); object.put("nextHash", - * calculateHash(finalChainArray.getJSONObject(j + 1).getString("tid"), - * "SHA3-256")); } else if (j == finalChainArray.length() - 1) { - * object.put("previousHash", calculateHash(finalChainArray.getJSONObject(j - - * 1).getString("tid"), "SHA3-256")); object.put("nextHash", ""); } else { - * object.put("previousHash", calculateHash(finalChainArray.getJSONObject(j - - * 1).getString("tid"), "SHA3-256")); object.put("nextHash", - * calculateHash(finalChainArray.getJSONObject(j + 1).getString("tid"), - * "SHA3-256")); } } - */ - - if (object.has("nextHash") && object.has("previousHash")) { - object.remove("nextHash"); - object.remove("previousHash"); - } - - chainArray.put(object); - - } - - partTokenChainsPrevState.put(partTokens.getString(i), chainArray); - // TokenSenderLogger.debug("Part token chain to be sent for verification: - // "+prevStateChainContent); - - writeToFile(tokenChainPath.concat(partTokens.getString(i)).concat(".json"), chainArray.toString(), false); - - partTokenChainHash.put(add(tokenChainPath.concat(partTokens.getString(i)).concat(".json"), ipfs)); - } - TokenSenderLogger.debug("Completed tokens selection"); - - authSenderByRecHash = calculateHash( - wholeTokens.toString() + wholeTokenChainHash.toString() + partTokens.toString() - + partTokenChainHash.toString() + receiverDidIpfsHash + senderDidIpfsHash + comment, - "SHA3-256"); - 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); - - challengeObject.put("authSenderByRecHash", authSenderByRecHash); - - for (int i = 0; i < wholeTokens.length(); i++) - allTokens.put(wholeTokens.getString(i)); - for (int i = 0; i < partTokens.length(); i++) - allTokens.put(partTokens.getString(i)); - - JSONArray alphaQuorum = 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 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"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "File for Quorum List for Subnet is empty"); - return APIResponse; - } - - } - - break; - } - case 3: { - quorumArray = detailsObject.getJSONArray("quorum"); - JSONArray finArray = new JSONArray(); - if(quorumArray.length()>7) { - for(int i=0;i<7;i++) { - finArray.put(quorumArray.get(i)); - - } - quorumArray = finArray; - } - 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; - for (int i = 0; i < quorumArray.length(); i++) { - - if (quorumArray.get(i).equals(senderDidIpfsHash)) { - TokenSenderLogger.error("SenderDID " + senderDidIpfsHash + " cannot be a Quorum"); - errMessage = "SenderDID " + senderDidIpfsHash; - } - if (quorumArray.get(i).equals(receiverDidIpfsHash)) { - TokenSenderLogger.error("ReceiverDID " + receiverDidIpfsHash + " cannot be a Quorum"); - if (errMessage != null) { - errMessage = errMessage + " and "; - } - errMessage = "ReceiverDID " + receiverDidIpfsHash; - } - if (errMessage != null) { - APIResponse.put("status", "Failed"); - APIResponse.put("message", errMessage + " cannot be a Quorum "); - return APIResponse; - } - - } - - TokenSenderLogger.debug("Updated quorumlist is " + quorumArray.toString()); + String peerID = getValues(DATA_PATH + "DataTable.json", "peerid", "didHash", + tokenChainFileArray.getJSONObject(j).getString("sender")); + previousSenderArray.put(peerID); + } + } + + JSONObject previousSenderObject = new JSONObject(); + previousSenderObject.put("token", wholeTokenHash); + previousSenderObject.put("sender", previousSenderArray); + tokenPreviousSender.put(previousSenderObject); + + } + + decimalAmount = requestedAmount - wholeAmount; + decimalAmount = formatAmount(decimalAmount); + + TokenSenderLogger.debug("Decimal Part: " + decimalAmount); + if (decimalAmount > 0.000D) { + TokenSenderLogger.debug("Decimal Amount > 0.000D"); + String partFileContent = readFile(partTokensFile.toString()); + JSONArray partContentArray = new JSONArray(partFileContent); + + if (partContentArray.length() == 0) { + newPart = true; + TokenSenderLogger.debug("New token for parts"); + String chosenToken = bankArray.getJSONObject(0).getString("tokenHash"); + partTokens.put(chosenToken); + amountLedger.put(chosenToken, formatAmount(decimalAmount)); + + } else { + Double counter = decimalAmount; + JSONArray selectParts = new JSONArray(partFileContent); + while (counter > 0.000D) { + counter = formatAmount(counter); + TokenSenderLogger.debug("Counter: " + formatAmount(counter)); + if (!(selectParts.length() == 0)) { + TokenSenderLogger.debug("Old Parts"); + String currentPartToken = selectParts.getJSONObject(0).getString("tokenHash"); + Double currentPartBalance = partTokenBalance(currentPartToken); + currentPartBalance = formatAmount(currentPartBalance); + if (counter >= currentPartBalance) + amountLedger.put(currentPartToken, formatAmount(currentPartBalance)); + else + amountLedger.put(currentPartToken, formatAmount(counter)); + + partTokens.put(currentPartToken); + counter -= currentPartBalance; + selectParts.remove(0); + } else { + oldNew = true; + TokenSenderLogger.debug("Old Parts then new parts"); + String chosenToken = bankArray.getJSONObject(0).getString("tokenHash"); + partTokens.put(chosenToken); + amountLedger.put(chosenToken, formatAmount(counter)); + File tokenFile = new File(TOKENS_PATH.concat(chosenToken)); + tokenFile.renameTo(new File(PART_TOKEN_PATH.concat(chosenToken))); + File chainFile = new File(TOKENCHAIN_PATH.concat(chosenToken).concat(".json")); + chainFile.renameTo(new File(PART_TOKEN_CHAIN_PATH.concat(chosenToken).concat(".json"))); + + File shiftedFile = new File(PAYMENTS_PATH.concat("ShiftedTokens.json")); + if (!shiftedFile.exists()) { + shiftedFile.createNewFile(); + JSONArray shiftedTokensArray = new JSONArray(); + shiftedTokensArray.put(chosenToken); + writeToFile(PAYMENTS_PATH.concat("ShiftedTokens.json"), shiftedTokensArray.toString(), + false); + } else { + String shiftedContent = readFile(PAYMENTS_PATH.concat("ShiftedTokens.json")); + JSONArray shiftedArray = new JSONArray(shiftedContent); + shiftedArray.put(chosenToken); + writeToFile(PAYMENTS_PATH.concat("ShiftedTokens.json"), shiftedArray.toString(), false); + } + counter = 0.000D; + } + } + } + } + + if (newPart) { + tokenChainPath = TOKENCHAIN_PATH; + tokenPath = TOKENS_PATH; + } else { + tokenChainPath = TOKENCHAIN_PATH.concat("PARTS/"); + tokenPath = TOKENS_PATH.concat("PARTS/"); + } + + TokenSenderLogger.debug("Tokenchain path: " + tokenChainPath); + TokenSenderLogger.debug("Token path: " + tokenPath); + for (int i = 0; i < partTokens.length(); i++) { + File token = new File(tokenPath.concat(partTokens.getString(i))); + File tokenchain = new File(tokenChainPath.concat(partTokens.getString(i)) + ".json"); + if (!(token.exists() && tokenchain.exists())) { + if (!token.exists()) + TokenSenderLogger.debug("Token File for parts not avail"); + if (!tokenchain.exists()) + TokenSenderLogger.debug("Token Chain File for parts not avail"); + + TokenSenderLogger.info("Tokens Not Verified"); + senderMutex = false; + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Invalid part token(s)"); + return APIResponse; + + } + String hash = add(tokenPath + partTokens.getString(i), ipfs); + pin(hash, ipfs); + + String chainContent = readFile(tokenChainPath.concat(partTokens.getString(i)).concat(".json")); + + JSONArray chainArray = new JSONArray(); + JSONArray finalChainArray = new JSONArray(chainContent); + for (int j = 0; j < finalChainArray.length(); j++) { + JSONObject object = finalChainArray.getJSONObject(j); + /* + * if (finalChainArray.length() == 1) { object.put("previousHash", ""); + * object.put("nextHash", ""); } else if (finalChainArray.length() > 1) { if (j + * == 0) { object.put("previousHash", ""); object.put("nextHash", + * calculateHash(finalChainArray.getJSONObject(j + 1).getString("tid"), + * "SHA3-256")); } else if (j == finalChainArray.length() - 1) { + * object.put("previousHash", calculateHash(finalChainArray.getJSONObject(j - + * 1).getString("tid"), "SHA3-256")); object.put("nextHash", ""); } else { + * object.put("previousHash", calculateHash(finalChainArray.getJSONObject(j - + * 1).getString("tid"), "SHA3-256")); object.put("nextHash", + * calculateHash(finalChainArray.getJSONObject(j + 1).getString("tid"), + * "SHA3-256")); } } + */ + + if (object.has("nextHash") && object.has("previousHash")) { + object.remove("nextHash"); + object.remove("previousHash"); + } + + chainArray.put(object); + + } + + partTokenChainsPrevState.put(partTokens.getString(i), chainArray); + // TokenSenderLogger.debug("Part token chain to be sent for verification: + // "+prevStateChainContent); + + writeToFile(tokenChainPath.concat(partTokens.getString(i)).concat(".json"), chainArray.toString(), false); + + partTokenChainHash.put(add(tokenChainPath.concat(partTokens.getString(i)).concat(".json"), ipfs)); + } + TokenSenderLogger.debug("Completed tokens selection"); + + authSenderByRecHash = calculateHash( + wholeTokens.toString() + wholeTokenChainHash.toString() + partTokens.toString() + + partTokenChainHash.toString() + receiverDidIpfsHash + senderDidIpfsHash + comment, + "SHA3-256"); + 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); + + challengeObject.put("authSenderByRecHash", authSenderByRecHash); + + for (int i = 0; i < wholeTokens.length(); i++) + allTokens.put(wholeTokens.getString(i)); + for (int i = 0; i < partTokens.length(); i++) + allTokens.put(partTokens.getString(i)); + + JSONArray alphaQuorum = new JSONArray(); + + switch (type) { + 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")); + 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; + + } + } + + String errMessage = null; + for (int i = 0; i < quorumArray.length(); i++) { + + if (quorumArray.get(i).equals(senderDidIpfsHash)) { + TokenSenderLogger.error("SenderDID " + senderDidIpfsHash + " cannot be a Quorum"); + errMessage = "SenderDID " + senderDidIpfsHash; + } + if (quorumArray.get(i).equals(receiverDidIpfsHash)) { + TokenSenderLogger.error("ReceiverDID " + receiverDidIpfsHash + " cannot be a Quorum"); + if (errMessage != null) { + errMessage = errMessage + " and "; + } + errMessage = "ReceiverDID " + receiverDidIpfsHash; + } + if (errMessage != null) { + APIResponse.put("status", "Failed"); + APIResponse.put("message", errMessage + " cannot be a Quorum "); + return APIResponse; + } + + } + + TokenSenderLogger.debug("Updated quorumlist is " + quorumArray.toString()); // //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", - quorumArray.getString(i)); - boolean quorumSanityCheck = sanityCheck("Quorum", quorumPeerID, ipfs, port + 11); - - if (!quorumSanityCheck) { - sanityFailedQuorum.put(quorumPeerID); - if (i <= 6) - alphaCheck++; - - } - } - - if (alphaCheck > 2) { - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - String message = "Quorum: ".concat(sanityFailedQuorum.toString()).concat(" "); - APIResponse.put("message", message.concat(sanityMessage)); - TokenSenderLogger.warn("Quorum: ".concat(message.concat(sanityMessage))); - return APIResponse; - } + int alphaCheck = 0; + JSONArray sanityFailedQuorum = new JSONArray(); + for (int i = 0; i < quorumArray.length(); i++) { + String quorumPeerID = getValues(DATA_PATH + "DataTable.json", "peerid", "didHash", + quorumArray.getString(i)); + boolean quorumSanityCheck = sanityCheck("Quorum", quorumPeerID, ipfs, port + 10); + + if (!quorumSanityCheck) { + sanityFailedQuorum.put(quorumPeerID); + if (i <= 6) + alphaCheck++; + + } + } + + if (alphaCheck > 2) { + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + String message = "Quorum: ".concat(sanityFailedQuorum.toString()).concat(" "); + APIResponse.put("message", message.concat(sanityMessage)); + TokenSenderLogger.warn("Quorum: ".concat(message.concat(sanityMessage))); + return APIResponse; + } // //sanity check for Quorum - Ends - long startTime, endTime, totalTime; - - QuorumSwarmConnect(quorumArray, ipfs); - - alphaSize = quorumArray.length() - 14; - - for (int i = 0; i < alphaSize; i++) - alphaQuorum.put(quorumArray.getString(i)); - - - startTime = System.currentTimeMillis(); - - alphaPeersList = QuorumCheck(alphaQuorum, alphaSize); - - endTime = System.currentTimeMillis(); - totalTime = endTime - startTime; - eventLogger.debug("Quorum Check " + totalTime); - - if (alphaPeersList.size() < minQuorum(alphaSize)) { - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Quorum Members not available"); - TokenSenderLogger.warn("Quorum Members not available"); - senderMutex = false; - return APIResponse; - } - - TokenSenderLogger.debug("Final Selected Alpha Members: " + alphaPeersList); - JSONArray alphaList = new JSONArray(); - for (int i = 0; i < alphaPeersList.size(); i++) { - alphaList.put(alphaPeersList.get(i)); - } - - int numberOfTokensToPledge = 0; - if (wholeAmount > 0) { - numberOfTokensToPledge += wholeAmount; - if (decimalAmount > 0) - numberOfTokensToPledge += 1; - } else - numberOfTokensToPledge = 1; - - TokenSenderLogger.debug("Amount being transferred: " + requestedAmount - + " and number of tokens required to be pledged: " + numberOfTokensToPledge); - - JSONObject dataToSendToInitiator = new JSONObject(); - dataToSendToInitiator.put("alphaList", alphaList); - dataToSendToInitiator.put("tokenList", wholeTokens); - dataToSendToInitiator.put("amount", numberOfTokensToPledge); - dataToSendToInitiator.put("tid", tid); - dataToSendToInitiator.put("pvt", pvt); - dataToSendToInitiator.put("pvtKeyPass", keyPass); - dataToSendToInitiator.put("sender", senderDidIpfsHash); - dataToSendToInitiator.put("receiver", receiverDidIpfsHash); - - TokenSenderLogger.debug("Details being sent to Initiator: " + dataToSendToInitiator); - - boolean abort = Initiator.pledgeSetUp(dataToSendToInitiator.toString(), ipfs, 22143); - if (abort) { - Initiator.abort = false; - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - if (Initiator.abortReason.has("Quorum")) - APIResponse.put("message", "Alpha Node " + Initiator.abortReason.getString("Quorum") + " " - + Initiator.abortReason.getString("Reason")); - else - APIResponse.put("message", Initiator.abortReason.getString("Reason")); - TokenSenderLogger.warn("Quorum Members with insufficient Tokens/Credits"); - senderMutex = false; - Initiator.abortReason = new JSONObject(); - return APIResponse; - } else { - JSONArray array = Initiator.quorumWithHashesArray; - challengeObject.put("pledgeDetails", array); - - } - - TokenSenderLogger.debug("Nodes that pledged tokens: " + Initiator.pledgedNodes); - - /** - * Send the array without sender sign calculated - */ - JSONArray newChains = new JSONArray(); - for (int i = 0; i < intPart; i++) { - JSONObject lastObject = new JSONObject(); - // lastObject.put("senderSign", ""); - lastObject.put("sender", senderDidIpfsHash); - lastObject.put("group", allTokens); - lastObject.put("comment", comment); - lastObject.put("tid", tid); - lastObject.put("receiver", receiverDidIpfsHash); - lastObject.put("pledgeToken", ""); - lastObject.put("tokensPledgedFor", allTokens); - lastObject.put("tokensPledgedWith", Initiator.pledgedTokensArray); - - String tokenChainFileContent = readFile(TOKENCHAIN_PATH + wholeTokens.get(i) + ".json"); - JSONArray tokenChain = new JSONArray(tokenChainFileContent); - tokenChain.put(lastObject); - lastObJsonArray.put(lastObject); - - String tokenChainHash = calculateHash(tokenChain.toString(), "SHA3-256"); - JSONObject tokenObject = new JSONObject(); - tokenObject.put("token", wholeTokens.getString(i)); - tokenObject.put("hash", tokenChainHash); - newChains.put(tokenObject); - } - challengeObject.put("lastObject", newChains); - senderPayloadHash = calculateHash(allTokens.toString() + senderDidIpfsHash + comment, "SHA3-256"); - - challengeObject.put("senderPayloadSign", senderPayloadHash); - - FileWriter file = new FileWriter(WALLET_DATA_PATH.concat("/ChallengePayload").concat(tid).concat(".json")); - file.write(challengeObject.toString()); - file.close(); - - JSONArray signedChains = new JSONArray(); - JSONObject payloadSigned = new JSONObject(); - File privateShareFile = new File(DATA_PATH.concat(senderDidIpfsHash).concat("/PrivateShare.png")); - - if (privateShareFile.exists()) { - payloadSigned.put("authSenderByRecHash", getSignFromShares(pvt, authSenderByRecHash)); - payloadSigned.put("senderPayloadSign", getSignFromShares(pvt, senderPayloadHash)); - for (int i = 0; i < intPart; i++) { - JSONObject tokenObject = newChains.getJSONObject(i); - // JSONArray chainArray = tokenObject.getJSONArray("chain"); - // JSONObject lastObject = chainArray.getJSONObject(chainArray.length() - 1); - // String senderSign = getSignFromShares(pvt, authSenderByRecHash); - // lastObject.put("senderSign", senderSign); - - // chainArray.remove(chainArray.length() - 1); - // chainArray.put(lastObject); - - // String chainHash = calculateHash(chainArray.toString(), "SHA3-256"); - String chainSign = getSignFromShares(pvt, newChains.getJSONObject(i).getString("hash")); - tokenObject.put("chainSign", chainSign); - signedChains.put(tokenObject); - } - payloadSigned.put("lastObject", signedChains); - - FileWriter payloadfile = new FileWriter( - WALLET_DATA_PATH.concat("/SignPayload").concat(tid).concat(".json")); - payloadfile.write(payloadSigned.toString()); - payloadfile.close(); - - JSONArray quorumWithSignsArray = new JSONArray(); - JSONArray pledgeArray = Initiator.quorumWithHashesArray; - if (pledgeArray.length() == 0) { - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Not enough token to pledge"); - TokenSenderLogger.warn("Pledging failed"); - return APIResponse; - } - - 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()); - JSONObject pledgeSignedObject = new JSONObject(); - String key = ""; - JSONArray hashAndSignsArray = new JSONArray(); - while (keys.hasNext()) { - key = keys.next(); - TokenSenderLogger.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()); - TokenSenderLogger.debug("@@@@@ Calculating hash for: " + hashArray); - //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)); - pledgeSignedObject.put("sign", sign); - hashAndSignsArray.put(pledgeSignedObject); - } - } - } - JSONObject signObject = new JSONObject(); - signObject.put(key, hashAndSignsArray); - TokenSenderLogger.debug("signObject is " + signObject); - quorumWithSignsArray.put(signObject); - - } + long startTime, endTime, totalTime; + + QuorumSwarmConnect(quorumArray, ipfs); + + alphaSize = quorumArray.length(); + + for (int i = 0; i < alphaSize; i++) + alphaQuorum.put(quorumArray.getString(i)); + + startTime = System.currentTimeMillis(); + + alphaPeersList = QuorumCheck(alphaQuorum, alphaSize); + + endTime = System.currentTimeMillis(); + totalTime = endTime - startTime; + eventLogger.debug("Quorum Check " + totalTime); + + if (alphaPeersList.size() < minQuorum(alphaSize)) { + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Quorum Members not available"); + TokenSenderLogger.warn("Quorum Members not available"); + senderMutex = false; + return APIResponse; + } + + TokenSenderLogger.debug("Final Selected Alpha Members: " + alphaPeersList); + JSONArray alphaList = new JSONArray(); + for (int i = 0; i < alphaPeersList.size(); i++) { + alphaList.put(alphaPeersList.get(i)); + } + + int numberOfTokensToPledge = 0; + if (wholeAmount > 0) { + numberOfTokensToPledge += wholeAmount; + if (decimalAmount > 0) + numberOfTokensToPledge += 1; + } else + numberOfTokensToPledge = 1; + + TokenSenderLogger.debug("Amount being transferred: " + requestedAmount + + " and number of tokens required to be pledged: " + numberOfTokensToPledge); + + JSONObject dataToSendToInitiator = new JSONObject(); + dataToSendToInitiator.put("alphaList", alphaList); + dataToSendToInitiator.put("tokenList", wholeTokens); + dataToSendToInitiator.put("amount", numberOfTokensToPledge); + dataToSendToInitiator.put("tid", tid); + dataToSendToInitiator.put("pvt", pvt); + dataToSendToInitiator.put("pvtKeyPass", keyPass); + dataToSendToInitiator.put("sender", senderDidIpfsHash); + dataToSendToInitiator.put("receiver", receiverDidIpfsHash); + + TokenSenderLogger.debug("Details being sent to Initiator: " + dataToSendToInitiator); + + boolean abort = Initiator.pledgeSetUp(dataToSendToInitiator.toString(), ipfs, 22143); + if (abort) { + Initiator.abort = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + if (Initiator.abortReason.has("Quorum")) + APIResponse.put("message", "Alpha Node " + Initiator.abortReason.getString("Quorum") + " " + + Initiator.abortReason.getString("Reason")); + else + APIResponse.put("message", Initiator.abortReason.getString("Reason")); + TokenSenderLogger.warn("Quorum Members with insufficient Tokens/Credits"); + senderMutex = false; + Initiator.abortReason = new JSONObject(); + return APIResponse; + } else { + JSONArray array = Initiator.quorumWithHashesArray; + challengeObject.put("pledgeDetails", array); + + } + + TokenSenderLogger.debug("Nodes that pledged tokens: " + Initiator.pledgedNodes); + + /** + * Send the array without sender sign calculated + */ + JSONArray newChains = new JSONArray(); + for (int i = 0; i < intPart; i++) { + JSONObject lastObject = new JSONObject(); + // lastObject.put("senderSign", ""); + lastObject.put("sender", senderDidIpfsHash); + lastObject.put("group", allTokens); + lastObject.put("comment", comment); + lastObject.put("tid", tid); + lastObject.put("receiver", receiverDidIpfsHash); + lastObject.put("pledgeToken", ""); + lastObject.put("tokensPledgedFor", allTokens); + lastObject.put("tokensPledgedWith", Initiator.pledgedTokensArray); + + String tokenChainFileContent = readFile(TOKENCHAIN_PATH + wholeTokens.get(i) + ".json"); + JSONArray tokenChain = new JSONArray(tokenChainFileContent); + tokenChain.put(lastObject); + lastObJsonArray.put(lastObject); + + String tokenChainHash = calculateHash(tokenChain.toString(), "SHA3-256"); + JSONObject tokenObject = new JSONObject(); + tokenObject.put("token", wholeTokens.getString(i)); + tokenObject.put("hash", tokenChainHash); + newChains.put(tokenObject); + } + challengeObject.put("lastObject", newChains); + senderPayloadHash = calculateHash(allTokens.toString() + senderDidIpfsHash + comment, "SHA3-256"); + + challengeObject.put("senderPayloadSign", senderPayloadHash); + + FileWriter file = new FileWriter(WALLET_DATA_PATH.concat("/ChallengePayload").concat(tid).concat(".json")); + file.write(challengeObject.toString()); + file.close(); + + JSONArray signedChains = new JSONArray(); + JSONObject payloadSigned = new JSONObject(); + File privateShareFile = new File(DATA_PATH.concat(senderDidIpfsHash).concat("/PrivateShare.png")); + + if (privateShareFile.exists()) { + payloadSigned.put("authSenderByRecHash", getSignFromShares(pvt, authSenderByRecHash)); + payloadSigned.put("senderPayloadSign", getSignFromShares(pvt, senderPayloadHash)); + for (int i = 0; i < intPart; i++) { + JSONObject tokenObject = newChains.getJSONObject(i); + // JSONArray chainArray = tokenObject.getJSONArray("chain"); + // JSONObject lastObject = chainArray.getJSONObject(chainArray.length() - 1); + // String senderSign = getSignFromShares(pvt, authSenderByRecHash); + // lastObject.put("senderSign", senderSign); + + // chainArray.remove(chainArray.length() - 1); + // chainArray.put(lastObject); + + // String chainHash = calculateHash(chainArray.toString(), "SHA3-256"); + String chainSign = getSignFromShares(pvt, newChains.getJSONObject(i).getString("hash")); + tokenObject.put("chainSign", chainSign); + signedChains.put(tokenObject); + } + payloadSigned.put("lastObject", signedChains); + + FileWriter payloadfile = new FileWriter( + WALLET_DATA_PATH.concat("/SignPayload").concat(tid).concat(".json")); + payloadfile.write(payloadSigned.toString()); + payloadfile.close(); + + JSONArray quorumWithSignsArray = new JSONArray(); + JSONArray pledgeArray = Initiator.quorumWithHashesArray; + if (pledgeArray.length() == 0) { + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Not enough token to pledge"); + TokenSenderLogger.warn("Pledging failed"); + return APIResponse; + } + + 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()); + JSONObject pledgeSignedObject = new JSONObject(); + String key = ""; + JSONArray hashAndSignsArray = new JSONArray(); + while (keys.hasNext()) { + key = keys.next(); + TokenSenderLogger.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()); + TokenSenderLogger.debug("@@@@@ Calculating hash for: " + hashArray); + // 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)); + pledgeSignedObject.put("sign", sign); + hashAndSignsArray.put(pledgeSignedObject); + } + } + } + JSONObject signObject = new JSONObject(); + signObject.put(key, hashAndSignsArray); + TokenSenderLogger.debug("signObject is " + signObject); + quorumWithSignsArray.put(signObject); + + } // for (int i = 0; i < intPart; i++) { // JSONObject jsonObject = new JSONObject(Initiator.quorumWithHashesArray); @@ -716,555 +706,554 @@ public static JSONObject SendPartA(String data, IPFS ipfs, int port) throws Exce // quorumWithSignsArray.put(signObject); // } - payloadSigned.put("pledgeDetails", quorumWithSignsArray); - TokenSenderLogger.debug("pledgeDetails: " + quorumWithSignsArray); - - FileWriter spfile = new FileWriter(WALLET_DATA_PATH.concat("/signedPayload").concat(tid).concat(".json")); - spfile.write(payloadSigned.toString()); - spfile.close(); - - senderMutex = false; - return SendPartB(payloadSigned, ipfs, port); - } - senderMutex = false; - return challengeObject; - } - - public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) - throws JSONException, IOException, InterruptedException, ParseException { - - TokenSenderLogger.debug("PartB - signPayload " + signPayload); - - String senderSign = signPayload.getString("authSenderByRecHash"); - JSONObject APIResponse = new JSONObject(); - String receiverDidIpfsHash = detailsObject.getString("receiverDidIpfsHash"); - String receiverPeerId = getValues(DATA_PATH + "DataTable.json", "peerid", "didHash", receiverDidIpfsHash); - String pvt = detailsObject.getString("pvt"); - double requestedAmount = detailsObject.getDouble("amount"); - int type = detailsObject.getInt("type"); - String comment = detailsObject.getString("comment"); - String keyPass = detailsObject.getString("pvtKeyPass"); - - PrivateKey pvtKey = getPvtKey(keyPass, 1); - String senderPeerID = getPeerID(DATA_PATH + "DID.json"); - String senderDidIpfsHash = getValues(DATA_PATH + "DataTable.json", "didHash", "peerid", senderPeerID); - JSONArray quorumWithSignsArray = signPayload.getJSONArray("pledgeDetails"); - JSONArray signedChains = signPayload.getJSONArray("lastObject"); - - // If user enters wrong pvt key password - if (pvtKey == null) { - APIResponse.put("message", - "Incorrect password entered for Private Key, cannot proceed with the transaction"); - TokenSenderLogger.warn("Incorrect Private Key password entered"); - return APIResponse; - } - - // detailsObject.remove("pvtKeyPass"); - if (senderMutex) { - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Sender busy. Try again later"); - TokenSenderLogger.warn("Sender busy"); - return APIResponse; - } - - senderMutex = true; - Initiator.pledge(quorumWithSignsArray, requestedAmount, port); - - boolean sanityCheck = sanityCheck("Receiver", receiverPeerId, ipfs, port + 10); - if (!sanityCheck) { - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", sanityMessage); - TokenSenderLogger.warn(sanityMessage); - senderMutex = false; - return APIResponse; - } - - syncDataTable(receiverDidIpfsHash, null); - - if (!receiverPeerId.equals("")) { - TokenSenderLogger.debug("Swarm connecting to " + receiverPeerId); - swarmConnectP2P(receiverPeerId, ipfs); - TokenSenderLogger.debug("Swarm connected"); - } else { - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Receiver Peer ID null"); - TokenSenderLogger.warn("Receiver Peer ID null"); - senderMutex = false; - return APIResponse; - } - - String receiverWidIpfsHash = getValues(DATA_PATH + "DataTable.json", "walletHash", "didHash", - receiverDidIpfsHash); - if (!receiverWidIpfsHash.equals("")) { - nodeData(receiverDidIpfsHash, receiverWidIpfsHash, ipfs); - } else { - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", "null"); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Receiver WID null"); - TokenSenderLogger.warn("Receiver WID null"); - senderMutex = false; - return APIResponse; - } - - TokenSenderLogger.debug("Sender IPFS forwarding to DID: " + receiverDidIpfsHash + " PeerID: " + receiverPeerId); - forward(receiverPeerId, port, receiverPeerId); - TokenSenderLogger.debug("Forwarded to " + receiverPeerId + " on " + port); - senderSocket = new Socket("127.0.0.1", port); - - input = new BufferedReader(new InputStreamReader(senderSocket.getInputStream())); - output = new PrintStream(senderSocket.getOutputStream()); - - long startTime = System.currentTimeMillis(); - - /** - * Sending Sender Peer ID to Receiver Receiver to authenticate Sender's DID - * (Identity) - */ - output.println(senderPeerID); - TokenSenderLogger.debug("Sent PeerID"); - - String peerAuth; - try { - peerAuth = input.readLine(); - } catch (SocketException e) { - TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " is unable to Respond! - Sender Auth"); - 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 + "is unable to respond! - Sender Auth"); - - return APIResponse; - } - - if (peerAuth == null) { - executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); - TokenSenderLogger.info("Receiver is unable to authenticate the sender!"); - output.close(); - input.close(); - senderSocket.close(); - senderMutex = false; - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Receiver is unable to authenticate the sender!"); - return APIResponse; - - } else if (peerAuth != null && (!peerAuth.equals("200"))) { - executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); - TokenSenderLogger.info("Sender Data Not Available"); - output.close(); - input.close(); - senderSocket.close(); - senderMutex = false; - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Sender Data Not Available"); - return APIResponse; - - } - - String pvtKeyType = privateKeyAlgorithm(1); - // String senderSignWithPvtKey = pvtKeySign(senderSign, pvtKey, pvtKeyType); - - JSONObject senderDetails2Receiver = new JSONObject(); - // senderDetails2Receiver.put("pvtKeySign", senderSignWithPvtKey); - senderDetails2Receiver.put("pvtShareBits", senderSign); - senderDetails2Receiver.put("tid", tid); - senderDetails2Receiver.put("comment", comment); - - JSONObject partTokenChainArrays = new JSONObject(); - for (int i = 0; i < partTokens.length(); i++) { - String chainContent = readFile(tokenChainPath.concat(partTokens.getString(i)).concat(".json")); - JSONArray chainArray = new JSONArray(chainContent); - 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")); - * newLastObject.put("previousHash", - * calculateHash(chainArray.getJSONObject(chainArray.length() - - * 1).getString("tid"), "SHA3-256")); } - */ - - Double amount = formatAmount(amountLedger.getDouble(partTokens.getString(i))); - - newLastObject.put("senderSign", senderSign); - newLastObject.put("sender", senderDidIpfsHash); - newLastObject.put("receiver", receiverDidIpfsHash); - newLastObject.put("comment", comment); - newLastObject.put("tid", tid); - newLastObject.put("role", "Sender"); - newLastObject.put("amount", amount); - chainArray.put(newLastObject); - partTokenChainArrays.put(partTokens.getString(i), chainArray); - - } - JSONArray proofOfWork = new JSONArray(); - for (int i = 0; i < wholeTokens.length(); i++) { - File proofFile = new File(TOKENCHAIN_PATH + "Proof/" + wholeTokens.getString(i) + ".proof"); - if (proofFile.exists()) { - String proofCID = add(TOKENCHAIN_PATH + "Proof/" + wholeTokens.getString(i) + ".proof", ipfs); - JSONObject proofObject = new JSONObject(); - proofObject.put("token", wholeTokens.getString(i)); - proofObject.put("cid", proofCID); - proofOfWork.put(proofObject); - } - } - JSONObject tokenDetails = new JSONObject(); - tokenDetails.put("whole-tokens", wholeTokens); - tokenDetails.put("whole-tokenChains", wholeTokenChainHash); - tokenDetails.put("hashSender", partTokenChainHash); - tokenDetails.put("part-tokens", partTokens); - tokenDetails.put("part-tokenChains", partTokenChainArrays); - tokenDetails.put("part-tokenChains-PrevState", partTokenChainsPrevState); - tokenDetails.put("sender", senderDidIpfsHash); - tokenDetails.put("proof", proofOfWork); - String doubleSpendString = tokenDetails.toString(); - - TokenSenderLogger.debug("tokenDetails is " + tokenDetails.toString()); - - String doubleSpend = calculateHash(doubleSpendString, "SHA3-256"); - writeToFile(LOGGER_PATH + "doubleSpend", doubleSpend, false); - TokenSenderLogger.debug("********Double Spend Hash*********: " + doubleSpend); - IPFSNetwork.addHashOnly(LOGGER_PATH + "doubleSpend", ipfs); - deleteFile(LOGGER_PATH + "doubleSpend"); - - JSONObject tokenObject = new JSONObject(); - tokenObject.put("tokenDetails", tokenDetails); - tokenObject.put("previousSender", tokenPreviousSender); - 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"); - } - - /** - * Sending Token Details to Receiver Receiver to authenticate Tokens (Double - * Spending, IPFS availability) - */ - output.println(tokenObject); - - String tokenAuth; - try { - tokenAuth = input.readLine(); - TokenSenderLogger.debug("Token Auth Code: " + tokenAuth); - } catch (SocketException e) { - TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " is unable to Respond! - Token Auth"); - 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 + "is unable to respond! - Token Auth"); - - return APIResponse; - } - if (tokenAuth == null) { - executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); - TokenSenderLogger.info("Receiver is unable to verify the tokens!"); - output.close(); - input.close(); - senderSocket.close(); - senderMutex = false; - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Receiver is unable to verify the tokens!"); - return APIResponse; - } else if (tokenAuth != null && (tokenAuth.startsWith("4"))) { - switch (tokenAuth) { - 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); - } - 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); - output.close(); - input.close(); - senderSocket.close(); - senderMutex = false; - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", tid); - APIResponse.put("status", "Failed"); - return APIResponse; - } - - TokenSenderLogger.debug("Token Auth Code: " + tokenAuth); - - JSONObject dataObject = new JSONObject(); - dataObject.put("tid", tid); - dataObject.put("senderPayloadHash", senderPayloadHash); - dataObject.put("senderPayloadSign", signPayload.getString("senderPayloadSign")); - dataObject.put("receiverDidIpfs", receiverDidIpfsHash); - dataObject.put("pvt", pvt); - dataObject.put("senderDidIpfs", senderDidIpfsHash); - dataObject.put("token", wholeTokens.toString()); - dataObject.put("alphaList", alphaPeersList); - 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))) { - TokenSenderLogger.debug("Consensus Failed"); - senderDetails2Receiver.put("status", "Consensus Failed"); - output.println(senderDetails2Receiver); - 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", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Transaction declined by Quorum"); - return APIResponse; - - } - - TokenSenderLogger.debug("Consensus Reached"); - senderDetails2Receiver.put("status", "Consensus Reached"); - senderDetails2Receiver.put("quorumsign", InitiatorConsensus.quorumSignature.toString()); - senderDetails2Receiver.put("pledgeDetails", Initiator.pledgedTokensArray); - - - output.println(senderDetails2Receiver); - TokenSenderLogger.debug("Quorum Signatures length " + InitiatorConsensus.quorumSignature.length()); - - String signatureAuth; - try { - signatureAuth = input.readLine(); - } catch (SocketException e) { - TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " is unable to Respond! - Signature Auth"); - 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 + "is unable to respond! - Signature Auth"); - - return APIResponse; - } - TokenSenderLogger.info("signatureAuth : " + signatureAuth); - long endTime = System.currentTimeMillis(); - long totalTime = endTime - startTime; - if (signatureAuth == null) { - executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); - TokenSenderLogger.info("Receiver is unable to authenticate Sender!"); - output.close(); - input.close(); - senderSocket.close(); - senderMutex = false; - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Receiver is unable to authenticate Sender!"); - return APIResponse; - } else if (signatureAuth != null && (!signatureAuth.equals("200"))) { - executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); - TokenSenderLogger.info("Authentication Failed!"); - output.close(); - input.close(); - senderSocket.close(); - senderMutex = false; - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Sender not authenticated"); - return APIResponse; - - } - - // Sender requests for new block that is going to be added to the Token chains. - // (For Token chain auth) - output.println("Request for new blocks being added to the Token Chains"); - - String newBlocksForTokenChains; - try { - newBlocksForTokenChains = input.readLine(); - } catch (SocketException e) { - TokenSenderLogger.warn( - "Receiver " + receiverDidIpfsHash + " could'nt send 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 + "couldn't send token chain blocks for hashing and signing"); - - return APIResponse; - } - - TokenSenderLogger.debug("newBlocksForTokenChains is " + newBlocksForTokenChains); - TokenSenderLogger.debug(""); - - TokenSenderLogger.debug("lastObJsonArray is " + lastObJsonArray.toString()); - - JSONArray newTokenChainBlocks = new JSONArray(newBlocksForTokenChains); - JSONArray hashAndSigns = new JSONArray(); - - for (int i = 0; i < intPart; i++) { - JSONObject lastObject = lastObJsonArray.getJSONObject(i); - JSONObject receiverLastObject = newTokenChainBlocks.getJSONObject(i).getJSONObject("lastObject"); - - Map senderChainMap = lastObject.toMap(); - Map receiverChainMap = receiverLastObject.toMap(); - senderChainMap.remove("pledgeToken"); - receiverChainMap.remove("pledgeToken"); - - 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(senderChainMap.equals(receiverChainMap) + " is the chainmap status"); - - TokenSenderLogger.debug("signedChains is " + signedChains.toString()); - if (senderChainMap.equals(receiverChainMap)) { - - // String PvtKeySign = - // pvtKeySign(signedChains.getJSONObject(i).getString("chainSign"), pvtKey, - // privateKeyAlgorithm(1)); - - JSONObject obj = new JSONObject(); - obj.put("hash", signedChains.getJSONObject(i).getString("hash")); - obj.put("pvtShareBits", signedChains.getJSONObject(i).getString("chainSign")); - // obj.put("pvtKeySign", PvtKeySign); - - hashAndSigns.put(obj); - } else { - output.println("Token chains Not Matching"); - executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); - TokenSenderLogger.info("Token chains Not Matching"); - output.close(); - input.close(); - senderSocket.close(); - senderMutex = false; - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Token chains Not Matching"); - return APIResponse; - } - } - - output.println(hashAndSigns.toString()); - // Sender requests for new block that is going to be added to the part Token - // chains. + payloadSigned.put("pledgeDetails", quorumWithSignsArray); + TokenSenderLogger.debug("pledgeDetails: " + quorumWithSignsArray); + + FileWriter spfile = new FileWriter(WALLET_DATA_PATH.concat("/signedPayload").concat(tid).concat(".json")); + spfile.write(payloadSigned.toString()); + spfile.close(); + + senderMutex = false; + return SendPartB(payloadSigned, ipfs, port); + } + senderMutex = false; + return challengeObject; + } + + public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) + throws JSONException, IOException, InterruptedException, ParseException { + + TokenSenderLogger.debug("PartB - signPayload " + signPayload); + + String senderSign = signPayload.getString("authSenderByRecHash"); + JSONObject APIResponse = new JSONObject(); + String receiverDidIpfsHash = detailsObject.getString("receiverDidIpfsHash"); + String receiverPeerId = getValues(DATA_PATH + "DataTable.json", "peerid", "didHash", receiverDidIpfsHash); + String pvt = detailsObject.getString("pvt"); + double requestedAmount = detailsObject.getDouble("amount"); + int type = detailsObject.getInt("type"); + String comment = detailsObject.getString("comment"); + String keyPass = detailsObject.getString("pvtKeyPass"); + + PrivateKey pvtKey = getPvtKey(keyPass, 1); + String senderPeerID = getPeerID(DATA_PATH + "DID.json"); + String senderDidIpfsHash = getValues(DATA_PATH + "DataTable.json", "didHash", "peerid", senderPeerID); + JSONArray quorumWithSignsArray = signPayload.getJSONArray("pledgeDetails"); + JSONArray signedChains = signPayload.getJSONArray("lastObject"); + + // If user enters wrong pvt key password + if (pvtKey == null) { + APIResponse.put("message", + "Incorrect password entered for Private Key, cannot proceed with the transaction"); + TokenSenderLogger.warn("Incorrect Private Key password entered"); + return APIResponse; + } + + // detailsObject.remove("pvtKeyPass"); + if (senderMutex) { + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Sender busy. Try again later"); + TokenSenderLogger.warn("Sender busy"); + return APIResponse; + } + + senderMutex = true; + Initiator.pledge(quorumWithSignsArray, requestedAmount, port); + + boolean sanityCheck = sanityCheck("Receiver", receiverPeerId, ipfs, port + 10); + if (!sanityCheck) { + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", sanityMessage); + TokenSenderLogger.warn(sanityMessage); + senderMutex = false; + return APIResponse; + } + + syncDataTable(receiverDidIpfsHash, null); + + if (!receiverPeerId.equals("")) { + TokenSenderLogger.debug("Swarm connecting to " + receiverPeerId); + swarmConnectP2P(receiverPeerId, ipfs); + TokenSenderLogger.debug("Swarm connected"); + } else { + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Receiver Peer ID null"); + TokenSenderLogger.warn("Receiver Peer ID null"); + senderMutex = false; + return APIResponse; + } + + String receiverWidIpfsHash = getValues(DATA_PATH + "DataTable.json", "walletHash", "didHash", + receiverDidIpfsHash); + if (!receiverWidIpfsHash.equals("")) { + nodeData(receiverDidIpfsHash, receiverWidIpfsHash, ipfs); + } else { + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", "null"); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Receiver WID null"); + TokenSenderLogger.warn("Receiver WID null"); + senderMutex = false; + return APIResponse; + } + + TokenSenderLogger.debug("Sender IPFS forwarding to DID: " + receiverDidIpfsHash + " PeerID: " + receiverPeerId); + forward(receiverPeerId, port, receiverPeerId); + TokenSenderLogger.debug("Forwarded to " + receiverPeerId + " on " + port); + senderSocket = new Socket("127.0.0.1", port); + + input = new BufferedReader(new InputStreamReader(senderSocket.getInputStream())); + output = new PrintStream(senderSocket.getOutputStream()); + + long startTime = System.currentTimeMillis(); + + /** + * Sending Sender Peer ID to Receiver Receiver to authenticate Sender's DID + * (Identity) + */ + output.println(senderPeerID); + TokenSenderLogger.debug("Sent PeerID"); + + String peerAuth; + try { + peerAuth = input.readLine(); + } catch (SocketException e) { + TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " is unable to Respond! - Sender Auth"); + 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 + "is unable to respond! - Sender Auth"); + + return APIResponse; + } + + if (peerAuth == null) { + executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); + TokenSenderLogger.info("Receiver is unable to authenticate the sender!"); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Receiver is unable to authenticate the sender!"); + return APIResponse; + + } else if (peerAuth != null && (!peerAuth.equals("200"))) { + executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); + TokenSenderLogger.info("Sender Data Not Available"); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Sender Data Not Available"); + return APIResponse; + + } + + String pvtKeyType = privateKeyAlgorithm(1); + // String senderSignWithPvtKey = pvtKeySign(senderSign, pvtKey, pvtKeyType); + + JSONObject senderDetails2Receiver = new JSONObject(); + // senderDetails2Receiver.put("pvtKeySign", senderSignWithPvtKey); + senderDetails2Receiver.put("pvtShareBits", senderSign); + senderDetails2Receiver.put("tid", tid); + senderDetails2Receiver.put("comment", comment); + + JSONObject partTokenChainArrays = new JSONObject(); + for (int i = 0; i < partTokens.length(); i++) { + String chainContent = readFile(tokenChainPath.concat(partTokens.getString(i)).concat(".json")); + JSONArray chainArray = new JSONArray(chainContent); + 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")); + * newLastObject.put("previousHash", + * calculateHash(chainArray.getJSONObject(chainArray.length() - + * 1).getString("tid"), "SHA3-256")); } + */ + + Double amount = formatAmount(amountLedger.getDouble(partTokens.getString(i))); + + newLastObject.put("senderSign", senderSign); + newLastObject.put("sender", senderDidIpfsHash); + newLastObject.put("receiver", receiverDidIpfsHash); + newLastObject.put("comment", comment); + newLastObject.put("tid", tid); + newLastObject.put("role", "Sender"); + newLastObject.put("amount", amount); + chainArray.put(newLastObject); + partTokenChainArrays.put(partTokens.getString(i), chainArray); + + } + JSONArray proofOfWork = new JSONArray(); + for (int i = 0; i < wholeTokens.length(); i++) { + File proofFile = new File(TOKENCHAIN_PATH + "Proof/" + wholeTokens.getString(i) + ".proof"); + if (proofFile.exists()) { + String proofCID = add(TOKENCHAIN_PATH + "Proof/" + wholeTokens.getString(i) + ".proof", ipfs); + JSONObject proofObject = new JSONObject(); + proofObject.put("token", wholeTokens.getString(i)); + proofObject.put("cid", proofCID); + proofOfWork.put(proofObject); + } + } + JSONObject tokenDetails = new JSONObject(); + tokenDetails.put("whole-tokens", wholeTokens); + tokenDetails.put("whole-tokenChains", wholeTokenChainHash); + tokenDetails.put("hashSender", partTokenChainHash); + tokenDetails.put("part-tokens", partTokens); + tokenDetails.put("part-tokenChains", partTokenChainArrays); + tokenDetails.put("part-tokenChains-PrevState", partTokenChainsPrevState); + tokenDetails.put("sender", senderDidIpfsHash); + tokenDetails.put("proof", proofOfWork); + String doubleSpendString = tokenDetails.toString(); + + TokenSenderLogger.debug("tokenDetails is " + tokenDetails.toString()); + + String doubleSpend = calculateHash(doubleSpendString, "SHA3-256"); + writeToFile(LOGGER_PATH + "doubleSpend", doubleSpend, false); + TokenSenderLogger.debug("********Double Spend Hash*********: " + doubleSpend); + IPFSNetwork.addHashOnly(LOGGER_PATH + "doubleSpend", ipfs); + deleteFile(LOGGER_PATH + "doubleSpend"); + + JSONObject tokenObject = new JSONObject(); + tokenObject.put("tokenDetails", tokenDetails); + tokenObject.put("previousSender", tokenPreviousSender); + 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"); + } + + /** + * Sending Token Details to Receiver Receiver to authenticate Tokens (Double + * Spending, IPFS availability) + */ + output.println(tokenObject); + + String tokenAuth; + try { + tokenAuth = input.readLine(); + TokenSenderLogger.debug("Token Auth Code: " + tokenAuth); + } catch (SocketException e) { + TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " is unable to Respond! - Token Auth"); + 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 + "is unable to respond! - Token Auth"); + + return APIResponse; + } + if (tokenAuth == null) { + executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); + TokenSenderLogger.info("Receiver is unable to verify the tokens!"); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Receiver is unable to verify the tokens!"); + return APIResponse; + } else if (tokenAuth != null && (tokenAuth.startsWith("4"))) { + switch (tokenAuth) { + 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); + } + 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); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", tid); + APIResponse.put("status", "Failed"); + return APIResponse; + } + + TokenSenderLogger.debug("Token Auth Code: " + tokenAuth); + + JSONObject dataObject = new JSONObject(); + dataObject.put("tid", tid); + dataObject.put("senderPayloadHash", senderPayloadHash); + dataObject.put("senderPayloadSign", signPayload.getString("senderPayloadSign")); + dataObject.put("receiverDidIpfs", receiverDidIpfsHash); + dataObject.put("pvt", pvt); + dataObject.put("senderDidIpfs", senderDidIpfsHash); + dataObject.put("token", wholeTokens.toString()); + dataObject.put("alphaList", alphaPeersList); + 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))) { + TokenSenderLogger.debug("Consensus Failed"); + senderDetails2Receiver.put("status", "Consensus Failed"); + output.println(senderDetails2Receiver); + 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", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Transaction declined by Quorum"); + return APIResponse; + + } + + TokenSenderLogger.debug("Consensus Reached"); + senderDetails2Receiver.put("status", "Consensus Reached"); + senderDetails2Receiver.put("quorumsign", InitiatorConsensus.quorumSignature.toString()); + senderDetails2Receiver.put("pledgeDetails", Initiator.pledgedTokensArray); + + output.println(senderDetails2Receiver); + TokenSenderLogger.debug("Quorum Signatures length " + InitiatorConsensus.quorumSignature.length()); + + String signatureAuth; + try { + signatureAuth = input.readLine(); + } catch (SocketException e) { + TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " is unable to Respond! - Signature Auth"); + 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 + "is unable to respond! - Signature Auth"); + + return APIResponse; + } + TokenSenderLogger.info("signatureAuth : " + signatureAuth); + long endTime = System.currentTimeMillis(); + long totalTime = endTime - startTime; + if (signatureAuth == null) { + executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); + TokenSenderLogger.info("Receiver is unable to authenticate Sender!"); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Receiver is unable to authenticate Sender!"); + return APIResponse; + } else if (signatureAuth != null && (!signatureAuth.equals("200"))) { + executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); + TokenSenderLogger.info("Authentication Failed!"); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Sender not authenticated"); + return APIResponse; + + } + + // Sender requests for new block that is going to be added to the Token chains. + // (For Token chain auth) + output.println("Request for new blocks being added to the Token Chains"); + + String newBlocksForTokenChains; + try { + newBlocksForTokenChains = input.readLine(); + } catch (SocketException e) { + TokenSenderLogger.warn( + "Receiver " + receiverDidIpfsHash + " could'nt send 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 + "couldn't send token chain blocks for hashing and signing"); + + return APIResponse; + } + + TokenSenderLogger.debug("newBlocksForTokenChains is " + newBlocksForTokenChains); + TokenSenderLogger.debug(""); + + TokenSenderLogger.debug("lastObJsonArray is " + lastObJsonArray.toString()); + + JSONArray newTokenChainBlocks = new JSONArray(newBlocksForTokenChains); + JSONArray hashAndSigns = new JSONArray(); + + for (int i = 0; i < intPart; i++) { + JSONObject lastObject = lastObJsonArray.getJSONObject(i); + JSONObject receiverLastObject = newTokenChainBlocks.getJSONObject(i).getJSONObject("lastObject"); + + Map senderChainMap = lastObject.toMap(); + Map receiverChainMap = receiverLastObject.toMap(); + senderChainMap.remove("pledgeToken"); + receiverChainMap.remove("pledgeToken"); + + 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(senderChainMap.equals(receiverChainMap) + " is the chainmap status"); + + TokenSenderLogger.debug("signedChains is " + signedChains.toString()); + if (senderChainMap.equals(receiverChainMap)) { + + // String PvtKeySign = + // pvtKeySign(signedChains.getJSONObject(i).getString("chainSign"), pvtKey, + // privateKeyAlgorithm(1)); + + JSONObject obj = new JSONObject(); + obj.put("hash", signedChains.getJSONObject(i).getString("hash")); + obj.put("pvtShareBits", signedChains.getJSONObject(i).getString("chainSign")); + // obj.put("pvtKeySign", PvtKeySign); + + hashAndSigns.put(obj); + } else { + output.println("Token chains Not Matching"); + executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); + TokenSenderLogger.info("Token chains Not Matching"); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Token chains Not Matching"); + return APIResponse; + } + } + + 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; @@ -1292,429 +1281,429 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) // 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"); - - String confirmation; - try { - confirmation = input.readLine(); - } catch (SocketException e) { - TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " is unable to Respond! - Pinning Auth"); - 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 + "is unable to respond! - Pinning Auth"); - - return APIResponse; - } - if (confirmation == null) { - executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); - TokenSenderLogger.info("Receiver is unable to Pin the tokens!"); - output.close(); - input.close(); - senderSocket.close(); - senderMutex = false; - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Receiver is unable to Pin the tokens!"); - return APIResponse; - - } else if (confirmation != null && (!confirmation.equals("Successfully Pinned"))) { - TokenSenderLogger.warn("Multiple Owners for the token"); - executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); - TokenSenderLogger.info("Tokens with multiple pins"); - output.close(); - input.close(); - senderSocket.close(); - senderMutex = false; - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Tokens with multiple pins"); - return APIResponse; - - } - - TokenSenderLogger.debug("3"); - TokenSenderLogger.debug("Whole tokens: " + wholeTokens); - TokenSenderLogger.debug("Part tokens: " + partTokens); - output.println(InitiatorProcedure.essential); - - String respAuth; - try { - respAuth = input.readLine(); - } catch (SocketException e) { - TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " is unable to Respond! - Share Confirmation"); - 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 + "is unable to respond! - Share Confirmation"); - - return APIResponse; - } - if (respAuth == null) { - executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); - TokenSenderLogger.info("Receiver is unable to complete the transaction!"); - output.close(); - input.close(); - senderSocket.close(); - senderMutex = false; - updateQuorum(quorumArray, null, false, type); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("tid", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Receiver is unable to complete the transaction!"); - return APIResponse; - - } else if (respAuth != null && (!respAuth.equals("Send Response"))) { - 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", tid); - APIResponse.put("status", "Failed"); - APIResponse.put("message", "Receiver process not over"); - TokenSenderLogger.info("Incomplete Transaction"); - return APIResponse; - } - - TokenSenderLogger.debug("Operation over"); - - for (int i = 0; i < wholeTokens.length(); i++) - unpin(String.valueOf(wholeTokens.get(i)), ipfs); - repo(ipfs); - - /* - * Iterator keys = InitiatorConsensus.quorumSignature.keys(); JSONArray - * signedQuorumList = new JSONArray(); while (keys.hasNext()) - * signedQuorumList.put(keys.next()); - */ - - JSONArray QuorumSignatures = new JSONArray(InitiatorConsensus.quorumSignature.toString()); - JSONArray signedQuorumList = new JSONArray(); - JSONObject temp = new JSONObject(); - - for (int i = 0; i < QuorumSignatures.length(); i++) { - - temp = QuorumSignatures.getJSONObject(i); - signedQuorumList.put(temp.getString("quorum_did")); - } - - APIResponse.put("tid", tid); - APIResponse.put("status", "Success"); - APIResponse.put("did", senderDidIpfsHash); - APIResponse.put("message", "Tokens transferred successfully!"); - APIResponse.put("quorumlist", signedQuorumList); - APIResponse.put("receiver", receiverDidIpfsHash); - APIResponse.put("totaltime", totalTime); - - JSONObject transactionRecord = new JSONObject(); - transactionRecord.put("role", "Sender"); - transactionRecord.put("tokens", allTokens); - transactionRecord.put("txn", tid); - transactionRecord.put("quorumList", signedQuorumList); - transactionRecord.put("senderDID", senderDidIpfsHash); - transactionRecord.put("receiverDID", receiverDidIpfsHash); - transactionRecord.put("Date", getCurrentUtcTime()); - transactionRecord.put("totalTime", totalTime); - transactionRecord.put("comment", comment); - transactionRecord.put("essentialShare", InitiatorProcedure.essential); - requestedAmount = formatAmount(requestedAmount); - transactionRecord.put("amount-spent", requestedAmount); - - JSONArray transactionHistoryEntry = new JSONArray(); - transactionHistoryEntry.put(transactionRecord); - - updateJSON("add", WALLET_DATA_PATH + "TransactionHistory.json", transactionHistoryEntry.toString()); - - for (int i = 0; i < wholeTokens.length(); i++) { - deleteFile(TOKENS_PATH.concat(wholeTokens.getString(i))); - Functions.updateJSON("remove", PAYMENTS_PATH.concat("BNK00.json"), wholeTokens.getString(i)); - } - if (decimalAmount != 0.0) { - - if (newPart) { - TokenSenderLogger.debug("Updating files for new parts"); - JSONObject newPartTokenObject = new JSONObject(); - newPartTokenObject.put("tokenHash", partTokens.getString(0)); - JSONArray newPartArray = new JSONArray(); - newPartArray.put(newPartTokenObject); - writeToFile(PAYMENTS_PATH.concat("PartsToken.json"), newPartArray.toString(), false); - - String bankNew = readFile(PAYMENTS_PATH.concat("BNK00.json")); - JSONArray bankNewArray = new JSONArray(bankNew); - bankNewArray.remove(0); - writeToFile(PAYMENTS_PATH.concat("BNK00.json"), bankNewArray.toString(), false); - - String newTokenChain = readFile(TOKENCHAIN_PATH + partTokens.getString(0) + ".json"); - JSONArray chainArray = new JSONArray(newTokenChain); - - 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")); - * newLastObject.put("previousHash", - * calculateHash(chainArray.getJSONObject(chainArray.length() - - * 1).getString("tid"), "SHA3-256")); } - */ - - Double amount = formatAmount(decimalAmount); - - newLastObject.put("senderSign", senderSign); - newLastObject.put("sender", senderDidIpfsHash); - newLastObject.put("receiver", receiverDidIpfsHash); - newLastObject.put("comment", comment); - newLastObject.put("tid", tid); - // newLastObject.put("nextHash", ""); - newLastObject.put("role", "Sender"); - newLastObject.put("amount", amount); - chainArray.put(newLastObject); - - output.println("New part token chain to be hashed"); - output.println(chainArray.toString()); - - TokenSenderLogger.debug("!@#$% 1: " + chainArray); - - String finalPartTokenChain_string; - try { - finalPartTokenChain_string = input.readLine(); - } catch (SocketException e) { - TokenSenderLogger.warn( - "Receiver " + receiverDidIpfsHash + " could'nt send hahsed and signed token chain blocks."); - 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 hahsed and signed token chain blocks."); - - return APIResponse; - } - TokenSenderLogger.debug("!@#$% 2: " + finalPartTokenChain_string); - - JSONArray newPartTokenChain = new JSONArray(finalPartTokenChain_string); - writeToFile(TOKENCHAIN_PATH + partTokens.getString(0) + ".json", newPartTokenChain.toString(), false); - - File tokenFile = new File(TOKENS_PATH.concat(partTokens.getString(0))); - tokenFile.renameTo(new File(PART_TOKEN_PATH.concat(partTokens.getString(0)))); - File chainFile = new File(TOKENCHAIN_PATH.concat(partTokens.getString(0)).concat(".json")); - chainFile.renameTo(new File(PART_TOKEN_CHAIN_PATH.concat(partTokens.getString(0)).concat(".json"))); - - File shiftedFile = new File(PAYMENTS_PATH.concat("ShiftedTokens.json")); - if (!shiftedFile.exists()) { - shiftedFile.createNewFile(); - JSONArray shiftedTokensArray = new JSONArray(); - shiftedTokensArray.put(partTokens.getString(0)); - writeToFile(PAYMENTS_PATH.concat("ShiftedTokens.json"), shiftedTokensArray.toString(), false); - } else { - String shiftedContent = readFile(PAYMENTS_PATH.concat("ShiftedTokens.json")); - JSONArray shiftedArray = new JSONArray(shiftedContent); - shiftedArray.put(partTokens.getString(0)); - writeToFile(PAYMENTS_PATH.concat("ShiftedTokens.json"), shiftedArray.toString(), false); - } - } else { - - JSONObject partTokenChainsToBeSentForHashing = new JSONObject(); - - TokenSenderLogger.debug("Updating files for old parts"); - for (int i = 0; i < partTokens.length(); i++) { - String newTokenChain = readFile( - TOKENCHAIN_PATH.concat("PARTS/") + partTokens.getString(i) + ".json"); - JSONArray chainArray = new JSONArray(newTokenChain); - - 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")); - * newLastObject.put("previousHash", calculateHash( - * chainArray.getJSONObject(chainArray.length() - 1).getString("tid"), - * "SHA3-256")); } - */ - - TokenSenderLogger.debug( - "Amount from ledger: " + formatAmount(amountLedger.getDouble(partTokens.getString(i)))); - Double amount = formatAmount(amountLedger.getDouble(partTokens.getString(i))); - - newLastObject.put("senderSign", senderSign); - newLastObject.put("sender", senderDidIpfsHash); - newLastObject.put("receiver", receiverDidIpfsHash); - newLastObject.put("comment", comment); - newLastObject.put("tid", tid); - // newLastObject.put("nextHash", ""); - newLastObject.put("role", "Sender"); - newLastObject.put("amount", amount); - chainArray.put(newLastObject); - - partTokenChainsToBeSentForHashing.put(partTokens.getString(i), chainArray); - - TokenSenderLogger.debug("Checking Parts Token Balance ..."); - Double availableParts = partTokenBalance(partTokens.getString(i)); - TokenSenderLogger.debug("Available: " + availableParts); - if (availableParts >= 1.000 || availableParts <= 0.000) { - TokenSenderLogger.debug("Wholly Spent, Removing token from parts"); - String partFileContent2 = readFile(PAYMENTS_PATH.concat("PartsToken.json")); - JSONArray partContentArray2 = new JSONArray(partFileContent2); - for (int j = 0; j < partContentArray2.length(); j++) { - if (partContentArray2.getJSONObject(j).getString("tokenHash") - .equals(partTokens.getString(i))) - partContentArray2.remove(j); - writeToFile(PAYMENTS_PATH.concat("PartsToken.json"), partContentArray2.toString(), false); - } - deleteFile(PART_TOKEN_PATH.concat(partTokens.getString(i))); - } - } - output.println("Old part token chains to be hashed"); - output.println(partTokenChainsToBeSentForHashing.toString()); - TokenSenderLogger.debug("!@#$% 3: " + partTokenChainsToBeSentForHashing); - - String hashedPartTokenChains_string; - try { - hashedPartTokenChains_string = input.readLine(); - } catch (SocketException e) { - TokenSenderLogger.warn( - "Receiver " + receiverDidIpfsHash + " could'nt send hahsed and signed token chain blocks."); - 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 hahsed and signed token chain blocks."); - - return APIResponse; - } - - TokenSenderLogger.debug("!@#$% 4: " + hashedPartTokenChains_string); - - JSONObject finalPartTokenChains = new JSONObject(hashedPartTokenChains_string); - for (int i = 0; i < partTokens.length(); i++) { - - JSONArray chainArray = finalPartTokenChains.getJSONArray(partTokens.getString(i)); - writeToFile(TOKENCHAIN_PATH.concat("PARTS/").concat(partTokens.getString(i)).concat(".json"), - chainArray.toString(), false); - } - - if (oldNew) { - String token = partTokens.getString(partTokens.length() - 1); - String bnk = readFile(PAYMENTS_PATH.concat("BNK00.json")); - JSONArray bnkArray = new JSONArray(bnk); - for (int i = 0; i < bnkArray.length(); i++) { - if (bnkArray.getJSONObject(i).getString("tokenHash").equals(token)) - bnkArray.remove(i); - } - writeToFile(PAYMENTS_PATH.concat("BNK00.json"), bnkArray.toString(), false); - - JSONArray pArray = new JSONArray(); - JSONObject pObject = new JSONObject(); - pObject.put("tokenHash", token); - pArray.put(pObject); - writeToFile(PAYMENTS_PATH.concat("PartsToken.json"), pArray.toString(), false); - - } - } - } - TokenSenderLogger.info("Transaction Successful"); - executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); - updateQuorum(quorumArray, signedQuorumList, true, type); - output.close(); - input.close(); - senderSocket.close(); - senderMutex = false; - - // Populating data to explorer - if (!EXPLORER_IP.contains("127.0.0.1")) { - - List tokenList = new ArrayList<>(); - for (int i = 0; i < allTokens.length(); i++) - tokenList.add(allTokens.getString(i)); - String url = EXPLORER_IP + "/CreateOrUpdateRubixTransaction"; - URL obj = new URL(url); - HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); - - // Setting basic post request - con.setRequestMethod("POST"); - con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); - con.setRequestProperty("Accept", "application/json"); - con.setRequestProperty("Content-Type", "application/json"); - con.setRequestProperty("Authorization", "null"); - - // Serialization - JSONObject dataToSend = new JSONObject(); - dataToSend.put("transaction_id", tid); - dataToSend.put("sender_did", senderDidIpfsHash); - dataToSend.put("receiver_did", receiverDidIpfsHash); - dataToSend.put("token_id", tokenList); - dataToSend.put("token_time", (int) totalTime); - dataToSend.put("amount", requestedAmount); - String populate = dataToSend.toString(); - - JSONObject jsonObject = new JSONObject(); - jsonObject.put("inputString", populate); - String postJsonData = jsonObject.toString(); - - // Send post request - con.setDoOutput(true); - DataOutputStream wr = new DataOutputStream(con.getOutputStream()); - wr.writeBytes(postJsonData); - wr.flush(); - wr.close(); - - int responseCode = con.getResponseCode(); - TokenSenderLogger.debug("Sending 'POST' request to URL : " + url); - TokenSenderLogger.debug("Post Data : " + postJsonData); - TokenSenderLogger.debug("Response Code : " + responseCode); - - BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); - String output; - StringBuffer response = new StringBuffer(); - - while ((output = in.readLine()) != null) { - response.append(output); - } - in.close(); - - TokenSenderLogger.debug(response.toString()); - } - - senderMutex = false; - resetVariables(); - return APIResponse; - - } + TokenSenderLogger.debug("Unpinned Tokens"); + output.println("Unpinned"); + + String confirmation; + try { + confirmation = input.readLine(); + } catch (SocketException e) { + TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " is unable to Respond! - Pinning Auth"); + 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 + "is unable to respond! - Pinning Auth"); + + return APIResponse; + } + if (confirmation == null) { + executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); + TokenSenderLogger.info("Receiver is unable to Pin the tokens!"); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Receiver is unable to Pin the tokens!"); + return APIResponse; + + } else if (confirmation != null && (!confirmation.equals("Successfully Pinned"))) { + TokenSenderLogger.warn("Multiple Owners for the token"); + executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); + TokenSenderLogger.info("Tokens with multiple pins"); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Tokens with multiple pins"); + return APIResponse; + + } + + TokenSenderLogger.debug("3"); + TokenSenderLogger.debug("Whole tokens: " + wholeTokens); + TokenSenderLogger.debug("Part tokens: " + partTokens); + output.println(InitiatorProcedure.essential); + + String respAuth; + try { + respAuth = input.readLine(); + } catch (SocketException e) { + TokenSenderLogger.warn("Receiver " + receiverDidIpfsHash + " is unable to Respond! - Share Confirmation"); + 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 + "is unable to respond! - Share Confirmation"); + + return APIResponse; + } + if (respAuth == null) { + executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); + TokenSenderLogger.info("Receiver is unable to complete the transaction!"); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + updateQuorum(quorumArray, null, false, type); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("tid", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Receiver is unable to complete the transaction!"); + return APIResponse; + + } else if (respAuth != null && (!respAuth.equals("Send Response"))) { + 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", tid); + APIResponse.put("status", "Failed"); + APIResponse.put("message", "Receiver process not over"); + TokenSenderLogger.info("Incomplete Transaction"); + return APIResponse; + } + + TokenSenderLogger.debug("Operation over"); + + for (int i = 0; i < wholeTokens.length(); i++) + unpin(String.valueOf(wholeTokens.get(i)), ipfs); + repo(ipfs); + + /* + * Iterator keys = InitiatorConsensus.quorumSignature.keys(); JSONArray + * signedQuorumList = new JSONArray(); while (keys.hasNext()) + * signedQuorumList.put(keys.next()); + */ + + JSONArray QuorumSignatures = new JSONArray(InitiatorConsensus.quorumSignature.toString()); + JSONArray signedQuorumList = new JSONArray(); + JSONObject temp = new JSONObject(); + + for (int i = 0; i < QuorumSignatures.length(); i++) { + + temp = QuorumSignatures.getJSONObject(i); + signedQuorumList.put(temp.getString("quorum_did")); + } + + APIResponse.put("tid", tid); + APIResponse.put("status", "Success"); + APIResponse.put("did", senderDidIpfsHash); + APIResponse.put("message", "Tokens transferred successfully!"); + APIResponse.put("quorumlist", signedQuorumList); + APIResponse.put("receiver", receiverDidIpfsHash); + APIResponse.put("totaltime", totalTime); + + JSONObject transactionRecord = new JSONObject(); + transactionRecord.put("role", "Sender"); + transactionRecord.put("tokens", allTokens); + transactionRecord.put("txn", tid); + transactionRecord.put("quorumList", signedQuorumList); + transactionRecord.put("senderDID", senderDidIpfsHash); + transactionRecord.put("receiverDID", receiverDidIpfsHash); + transactionRecord.put("Date", getCurrentUtcTime()); + transactionRecord.put("totalTime", totalTime); + transactionRecord.put("comment", comment); + transactionRecord.put("essentialShare", InitiatorProcedure.essential); + requestedAmount = formatAmount(requestedAmount); + transactionRecord.put("amount-spent", requestedAmount); + + JSONArray transactionHistoryEntry = new JSONArray(); + transactionHistoryEntry.put(transactionRecord); + + updateJSON("add", WALLET_DATA_PATH + "TransactionHistory.json", transactionHistoryEntry.toString()); + + for (int i = 0; i < wholeTokens.length(); i++) { + deleteFile(TOKENS_PATH.concat(wholeTokens.getString(i))); + Functions.updateJSON("remove", PAYMENTS_PATH.concat("BNK00.json"), wholeTokens.getString(i)); + } + if (decimalAmount != 0.0) { + + if (newPart) { + TokenSenderLogger.debug("Updating files for new parts"); + JSONObject newPartTokenObject = new JSONObject(); + newPartTokenObject.put("tokenHash", partTokens.getString(0)); + JSONArray newPartArray = new JSONArray(); + newPartArray.put(newPartTokenObject); + writeToFile(PAYMENTS_PATH.concat("PartsToken.json"), newPartArray.toString(), false); + + String bankNew = readFile(PAYMENTS_PATH.concat("BNK00.json")); + JSONArray bankNewArray = new JSONArray(bankNew); + bankNewArray.remove(0); + writeToFile(PAYMENTS_PATH.concat("BNK00.json"), bankNewArray.toString(), false); + + String newTokenChain = readFile(TOKENCHAIN_PATH + partTokens.getString(0) + ".json"); + JSONArray chainArray = new JSONArray(newTokenChain); + + 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")); + * newLastObject.put("previousHash", + * calculateHash(chainArray.getJSONObject(chainArray.length() - + * 1).getString("tid"), "SHA3-256")); } + */ + + Double amount = formatAmount(decimalAmount); + + newLastObject.put("senderSign", senderSign); + newLastObject.put("sender", senderDidIpfsHash); + newLastObject.put("receiver", receiverDidIpfsHash); + newLastObject.put("comment", comment); + newLastObject.put("tid", tid); + // newLastObject.put("nextHash", ""); + newLastObject.put("role", "Sender"); + newLastObject.put("amount", amount); + chainArray.put(newLastObject); + + output.println("New part token chain to be hashed"); + output.println(chainArray.toString()); + + TokenSenderLogger.debug("!@#$% 1: " + chainArray); + + String finalPartTokenChain_string; + try { + finalPartTokenChain_string = input.readLine(); + } catch (SocketException e) { + TokenSenderLogger.warn( + "Receiver " + receiverDidIpfsHash + " could'nt send hahsed and signed token chain blocks."); + 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 hahsed and signed token chain blocks."); + + return APIResponse; + } + TokenSenderLogger.debug("!@#$% 2: " + finalPartTokenChain_string); + + JSONArray newPartTokenChain = new JSONArray(finalPartTokenChain_string); + writeToFile(TOKENCHAIN_PATH + partTokens.getString(0) + ".json", newPartTokenChain.toString(), false); + + File tokenFile = new File(TOKENS_PATH.concat(partTokens.getString(0))); + tokenFile.renameTo(new File(PART_TOKEN_PATH.concat(partTokens.getString(0)))); + File chainFile = new File(TOKENCHAIN_PATH.concat(partTokens.getString(0)).concat(".json")); + chainFile.renameTo(new File(PART_TOKEN_CHAIN_PATH.concat(partTokens.getString(0)).concat(".json"))); + + File shiftedFile = new File(PAYMENTS_PATH.concat("ShiftedTokens.json")); + if (!shiftedFile.exists()) { + shiftedFile.createNewFile(); + JSONArray shiftedTokensArray = new JSONArray(); + shiftedTokensArray.put(partTokens.getString(0)); + writeToFile(PAYMENTS_PATH.concat("ShiftedTokens.json"), shiftedTokensArray.toString(), false); + } else { + String shiftedContent = readFile(PAYMENTS_PATH.concat("ShiftedTokens.json")); + JSONArray shiftedArray = new JSONArray(shiftedContent); + shiftedArray.put(partTokens.getString(0)); + writeToFile(PAYMENTS_PATH.concat("ShiftedTokens.json"), shiftedArray.toString(), false); + } + } else { + + JSONObject partTokenChainsToBeSentForHashing = new JSONObject(); + + TokenSenderLogger.debug("Updating files for old parts"); + for (int i = 0; i < partTokens.length(); i++) { + String newTokenChain = readFile( + TOKENCHAIN_PATH.concat("PARTS/") + partTokens.getString(i) + ".json"); + JSONArray chainArray = new JSONArray(newTokenChain); + + 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")); + * newLastObject.put("previousHash", calculateHash( + * chainArray.getJSONObject(chainArray.length() - 1).getString("tid"), + * "SHA3-256")); } + */ + + TokenSenderLogger.debug( + "Amount from ledger: " + formatAmount(amountLedger.getDouble(partTokens.getString(i)))); + Double amount = formatAmount(amountLedger.getDouble(partTokens.getString(i))); + + newLastObject.put("senderSign", senderSign); + newLastObject.put("sender", senderDidIpfsHash); + newLastObject.put("receiver", receiverDidIpfsHash); + newLastObject.put("comment", comment); + newLastObject.put("tid", tid); + // newLastObject.put("nextHash", ""); + newLastObject.put("role", "Sender"); + newLastObject.put("amount", amount); + chainArray.put(newLastObject); + + partTokenChainsToBeSentForHashing.put(partTokens.getString(i), chainArray); + + TokenSenderLogger.debug("Checking Parts Token Balance ..."); + Double availableParts = partTokenBalance(partTokens.getString(i)); + TokenSenderLogger.debug("Available: " + availableParts); + if (availableParts >= 1.000 || availableParts <= 0.000) { + TokenSenderLogger.debug("Wholly Spent, Removing token from parts"); + String partFileContent2 = readFile(PAYMENTS_PATH.concat("PartsToken.json")); + JSONArray partContentArray2 = new JSONArray(partFileContent2); + for (int j = 0; j < partContentArray2.length(); j++) { + if (partContentArray2.getJSONObject(j).getString("tokenHash") + .equals(partTokens.getString(i))) + partContentArray2.remove(j); + writeToFile(PAYMENTS_PATH.concat("PartsToken.json"), partContentArray2.toString(), false); + } + deleteFile(PART_TOKEN_PATH.concat(partTokens.getString(i))); + } + } + output.println("Old part token chains to be hashed"); + output.println(partTokenChainsToBeSentForHashing.toString()); + TokenSenderLogger.debug("!@#$% 3: " + partTokenChainsToBeSentForHashing); + + String hashedPartTokenChains_string; + try { + hashedPartTokenChains_string = input.readLine(); + } catch (SocketException e) { + TokenSenderLogger.warn( + "Receiver " + receiverDidIpfsHash + " could'nt send hahsed and signed token chain blocks."); + 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 hahsed and signed token chain blocks."); + + return APIResponse; + } + + TokenSenderLogger.debug("!@#$% 4: " + hashedPartTokenChains_string); + + JSONObject finalPartTokenChains = new JSONObject(hashedPartTokenChains_string); + for (int i = 0; i < partTokens.length(); i++) { + + JSONArray chainArray = finalPartTokenChains.getJSONArray(partTokens.getString(i)); + writeToFile(TOKENCHAIN_PATH.concat("PARTS/").concat(partTokens.getString(i)).concat(".json"), + chainArray.toString(), false); + } + + if (oldNew) { + String token = partTokens.getString(partTokens.length() - 1); + String bnk = readFile(PAYMENTS_PATH.concat("BNK00.json")); + JSONArray bnkArray = new JSONArray(bnk); + for (int i = 0; i < bnkArray.length(); i++) { + if (bnkArray.getJSONObject(i).getString("tokenHash").equals(token)) + bnkArray.remove(i); + } + writeToFile(PAYMENTS_PATH.concat("BNK00.json"), bnkArray.toString(), false); + + JSONArray pArray = new JSONArray(); + JSONObject pObject = new JSONObject(); + pObject.put("tokenHash", token); + pArray.put(pObject); + writeToFile(PAYMENTS_PATH.concat("PartsToken.json"), pArray.toString(), false); + + } + } + } + TokenSenderLogger.info("Transaction Successful"); + executeIPFSCommands(" ipfs p2p close -t /p2p/" + receiverPeerId); + updateQuorum(quorumArray, signedQuorumList, true, type); + output.close(); + input.close(); + senderSocket.close(); + senderMutex = false; + + // Populating data to explorer + if (!EXPLORER_IP.contains("127.0.0.1")) { + + List tokenList = new ArrayList<>(); + for (int i = 0; i < allTokens.length(); i++) + tokenList.add(allTokens.getString(i)); + String url = EXPLORER_IP + "/CreateOrUpdateRubixTransaction"; + URL obj = new URL(url); + HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); + + // Setting basic post request + con.setRequestMethod("POST"); + con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); + con.setRequestProperty("Accept", "application/json"); + con.setRequestProperty("Content-Type", "application/json"); + con.setRequestProperty("Authorization", "null"); + + // Serialization + JSONObject dataToSend = new JSONObject(); + dataToSend.put("transaction_id", tid); + dataToSend.put("sender_did", senderDidIpfsHash); + dataToSend.put("receiver_did", receiverDidIpfsHash); + dataToSend.put("token_id", tokenList); + dataToSend.put("token_time", (int) totalTime); + dataToSend.put("amount", requestedAmount); + String populate = dataToSend.toString(); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("inputString", populate); + String postJsonData = jsonObject.toString(); + + // Send post request + con.setDoOutput(true); + DataOutputStream wr = new DataOutputStream(con.getOutputStream()); + wr.writeBytes(postJsonData); + wr.flush(); + wr.close(); + + int responseCode = con.getResponseCode(); + TokenSenderLogger.debug("Sending 'POST' request to URL : " + url); + TokenSenderLogger.debug("Post Data : " + postJsonData); + TokenSenderLogger.debug("Response Code : " + responseCode); + + BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); + String output; + StringBuffer response = new StringBuffer(); + + while ((output = in.readLine()) != null) { + response.append(output); + } + in.close(); + + TokenSenderLogger.debug(response.toString()); + } + + senderMutex = false; + resetVariables(); + return APIResponse; + + } } \ No newline at end of file From ff61e7a3e22f41484b1132cc18a781652a3aacf4 Mon Sep 17 00:00:00 2001 From: Gokul P S Date: Tue, 6 Dec 2022 12:12:52 +0530 Subject: [PATCH 6/8] fixes --- src/com/rubix/Consensus/InitiatorProcedure.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/rubix/Consensus/InitiatorProcedure.java b/src/com/rubix/Consensus/InitiatorProcedure.java index 910482b..2d3c4d0 100644 --- a/src/com/rubix/Consensus/InitiatorProcedure.java +++ b/src/com/rubix/Consensus/InitiatorProcedure.java @@ -175,13 +175,13 @@ public static void consensusSetUp( alphaThread.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()); From 73c213c528f32c6a8b7b62347a756331fde9b610 Mon Sep 17 00:00:00 2001 From: Gokul P S Date: Thu, 8 Dec 2022 04:53:02 +0530 Subject: [PATCH 7/8] Fork resolve - Bug Fixes --- src/com/rubix/Ping/PingReceive.java | 37 +- src/com/rubix/Ping/VerifyStakedToken.java | 183 +-- src/com/rubix/Resources/APIHandler.java | 1 + src/com/rubix/Resources/Functions.java | 112 +- .../rubix/TokenTransfer/ForkResolution.java | 199 +++- .../rubix/TokenTransfer/TokenReceiver.java | 100 +- src/com/rubix/TokenTransfer/TokenSender.java | 36 +- .../TransferPledge/Initiator.java | 1034 +++++++++-------- 8 files changed, 991 insertions(+), 711 deletions(-) diff --git a/src/com/rubix/Ping/PingReceive.java b/src/com/rubix/Ping/PingReceive.java index 43f2881..ef09aaa 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 bd599f5..8939e26 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 9ec7ca3..f58bc4d 100644 --- a/src/com/rubix/Resources/APIHandler.java +++ b/src/com/rubix/Resources/APIHandler.java @@ -1000,6 +1000,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 bf9cdd2..91f5f62 100644 --- a/src/com/rubix/Resources/Functions.java +++ b/src/com/rubix/Resources/Functions.java @@ -1235,43 +1235,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(); @@ -1551,25 +1551,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 index 1c2f302..bbf8983 100644 --- a/src/com/rubix/TokenTransfer/ForkResolution.java +++ b/src/com/rubix/TokenTransfer/ForkResolution.java @@ -1,5 +1,6 @@ package com.rubix.TokenTransfer; +import com.rubix.Ping.VerifyStakedToken; import com.rubix.Resources.IPFSNetwork; import org.apache.log4j.Logger; import org.json.JSONArray; @@ -9,13 +10,16 @@ import java.io.IOException; import java.util.ArrayList; +import static com.rubix.Resources.Functions.SEND_PORT; +import static com.rubix.Resources.Functions.calculateHash; + 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 { - boolean resolution = true; /** * 1. Check number of pins on the token * 2. If number of pins < 2 - Pass the token @@ -24,9 +28,14 @@ public static boolean check(JSONObject tokenDetails) throws IOException, Interru * 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 */ - ForkResolutionLogger.debug("Token Details:" + tokenDetails); + boolean resolution = true; + +// ForkResolutionLogger.debug("Token Details:" + tokenDetails); ArrayList previousSender = new ArrayList(); JSONArray ownersReceived = new JSONArray(); @@ -35,60 +44,160 @@ public static boolean check(JSONObject tokenDetails) throws IOException, Interru String token = tokenDetails.getString("token"); JSONArray tokenChain = tokenDetails.getJSONArray("tokenChain"); - + ForkResolutionLogger.debug("Unpledged Token Check: " + token); boolean tokenOwners = true; - try { - ForkResolutionLogger.debug("Checking owners for " + token + " Please wait..."); - pinOwnersArrayTransferToken = IPFSNetwork.dhtOwnerCheck(token); + ForkResolutionLogger.debug("Checking owners for " + token + " Please wait..."); + pinOwnersArrayTransferToken = IPFSNetwork.dhtOwnerCheck(token); - if (pinOwnersArrayTransferToken.size() > 2) { - - for (int j = 0; j < previousSendersArray.length(); j++) { - if (previousSendersArray.getJSONObject(j).getString("token").equals(token)) - ownersReceived = previousSendersArray.getJSONObject(j).getJSONArray("sender"); - } + 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 < ownersReceived.length(); j++) { + previousSender.add(ownersReceived.getString(j)); + } - for (int j = 0; j < pinOwnersArrayTransferToken.size(); j++) { - if (!previousSender.contains(pinOwnersArrayTransferToken.get(j).toString())) - tokenOwners = false; + 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 !!!"); - } catch (IOException | InterruptedException e) { - ForkResolutionLogger.debug("Ipfs dht find did not execute"); - } + } else + ForkResolutionLogger.debug("Token " + token + " has not multiple pins. Passed !!!"); + if (!tokenOwners) { - 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"; - } + 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() > 0) { + 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 + */ + for (int i = 0; i < tokenChainsList.length(); i++) { + JSONArray chain = tokenChainsList.getJSONObject(i).getJSONArray("chain"); + boolean includedCheck = true; + for (int j = chain.length() - 1; j > 0; j--) { + JSONObject chainIndexObject = chain.getJSONObject(j); + if (chainIndexObject.has("tokensPledgedWith")) { + JSONArray tokensPledgedWithArray = chainIndexObject.getJSONArray("tokensPledgedWith"); + if (tokensPledgedWithArray.toString().contains(pledgedToken)) { + if(chainIndexObject.getString("receiver").equals(tokenChainsList.getJSONObject(i).getString("node"))) { + 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; + } 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; + } + } + resolutionMessage = "<6> Token Pledged correctly in the appropriate level"; + 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 1de3aba..c1f5aa8 100644 --- a/src/com/rubix/TokenTransfer/TokenReceiver.java +++ b/src/com/rubix/TokenTransfer/TokenReceiver.java @@ -193,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"); @@ -329,41 +330,61 @@ public static String receive() { tokenMaxLimitMap.put(tokenNumberHash, tokenLimitForLevel); tokenDetailMap.put(tokenNumberHash, -1); } - - 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)); - JSONObject forkObject = new JSONObject(); - forkObject.put("token", wholeTokens.getString(i)); - forkObject.put("tokenChain", new JSONArray(wholeTokenChainContent.get(i))); - forkObject.put("previousSendersArray", previousSendersArray); - 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(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()); + + } 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(); } } - 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 // @@ -989,10 +1010,8 @@ public static String receive() { APIResponse.put("did", senderDidIpfsHash); APIResponse.put("tid", "null"); APIResponse.put("status", "Failed"); - APIResponse.put("message", - "Part Token Chain could not be verified. Previous sender's signature not verified"); - TokenReceiverLogger - .info("Part Token Chain could not be verified. Previous sender's signature not verified"); + APIResponse.put("message", "Part Token Chain could not be verified. Previous sender's signature not verified"); + TokenReceiverLogger.info("Part Token Chain could not be verified. Previous sender's signature not verified"); output.println("431"); IPFSNetwork.executeIPFSCommands(" ipfs p2p close -t /p2p/" + senderPeerID); @@ -1328,7 +1347,7 @@ 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; } } @@ -1683,6 +1702,7 @@ 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); @@ -1809,6 +1829,10 @@ 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); /* diff --git a/src/com/rubix/TokenTransfer/TokenSender.java b/src/com/rubix/TokenTransfer/TokenSender.java index c597fd7..dd60ff1 100644 --- a/src/com/rubix/TokenTransfer/TokenSender.java +++ b/src/com/rubix/TokenTransfer/TokenSender.java @@ -61,8 +61,10 @@ public class TokenSender { private static BufferedReader input; private static Socket senderSocket; private static boolean senderMutex = false; + private static int numberOfTokensToPledge; public static void resetVariables() { + numberOfTokensToPledge = 0; detailsObject = new JSONObject(); quorumArray = new JSONArray(); tid = null; @@ -520,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; @@ -565,8 +567,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 */ @@ -581,7 +581,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); @@ -760,7 +761,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) { @@ -927,6 +928,7 @@ 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()); @@ -937,19 +939,21 @@ public static JSONObject SendPartB(JSONObject signPayload, IPFS ipfs, int port) IPFSNetwork.addHashOnly(LOGGER_PATH + "doubleSpend", ipfs); deleteFile(LOGGER_PATH + "doubleSpend"); + + JSONObject tokenObject = new JSONObject(); tokenObject.put("tokenDetails", tokenDetails); tokenObject.put("previousSender", tokenPreviousSender); 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 @@ -1112,7 +1116,7 @@ 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()); diff --git a/src/com/rubix/TokenTransfer/TransferPledge/Initiator.java b/src/com/rubix/TokenTransfer/TransferPledge/Initiator.java index 54b4617..ed0b567 100644 --- a/src/com/rubix/TokenTransfer/TransferPledge/Initiator.java +++ b/src/com/rubix/TokenTransfer/TransferPledge/Initiator.java @@ -30,490 +30,552 @@ 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(); + 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"); + abortReason = new JSONObject(); + abort = false; + pledgedNodes = new JSONArray(); + JSONObject dataObject = new JSONObject(data); + // PledgeInitiatorLogger.debug("pledgeSetUp dataObject is + // "+dataObject.toString()); + + 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"); + 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")) { + 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 tid = lasObject.getString("tid"); + pledged = Unpledge.verifyProof(tokenName, did, tid); + + 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; + } + + 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); +// PledgeInitiatorLogger.debug("@@@@@ Chain to hash: " + tokenChain); + +// PledgeInitiatorLogger.debug("pledgeNewObject is " + pledgeNewObject); + String chainHashString = calculateHash(tokenChain.toString(), "SHA3-256"); + hashesArray.put(chainHashString); + + } 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")); + pledgeNewObject.put("distributedObject", new JSONObject()); + + // pledgedTokensArray.put(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(); + + } + } 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; + } + + if(tokensCount != 0) { + abortReason.put("Quorum", quorumID); + abortReason.put("Reason", "Not enough tokens to pledge"); + return true; + } + else { + return false; } - - 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 tid = lasObject.getString("tid"); - pledged = Unpledge.verifyProof(tokenName, did, tid); - - 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; - } - - 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); - - } 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(); - - } - } 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; - } - -} + } + + closeAllConnections(alphaList); + + 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; + }else + distributePledgeTokens(tokenList, pledgedTokensArray); + return abort; + } + + 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; + } + +} \ No newline at end of file From 3a32abdb74d0adbba2ad12609f6ee279adb0a142 Mon Sep 17 00:00:00 2001 From: Gokul P S Date: Fri, 9 Dec 2022 12:24:23 +0530 Subject: [PATCH 8/8] Bug fixes --- .../rubix/TokenTransfer/ForkResolution.java | 26 ++- .../TransferPledge/Initiator.java | 173 ++++++------------ 2 files changed, 77 insertions(+), 122 deletions(-) diff --git a/src/com/rubix/TokenTransfer/ForkResolution.java b/src/com/rubix/TokenTransfer/ForkResolution.java index bbf8983..c5742fa 100644 --- a/src/com/rubix/TokenTransfer/ForkResolution.java +++ b/src/com/rubix/TokenTransfer/ForkResolution.java @@ -10,8 +10,7 @@ import java.io.IOException; import java.util.ArrayList; -import static com.rubix.Resources.Functions.SEND_PORT; -import static com.rubix.Resources.Functions.calculateHash; +import static com.rubix.Resources.Functions.*; public class ForkResolution { public static Logger ForkResolutionLogger = Logger.getLogger(ForkResolution.class); @@ -110,7 +109,7 @@ public static boolean verifyUnpledgedToken(String transferToken, String pledgedT if(pinListTransferToken.size() > 2) { ForkResolutionLogger.debug("Transfer token " + transferToken + " has multiple pins. Checking pledged details"); ArrayList pinListPledgeToken = IPFSNetwork.dhtOwnerCheck(pledgedToken); - if (pinListPledgeToken.size() > 0) { + 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++) { @@ -150,19 +149,27 @@ public static boolean verifyUnpledgedToken(String transferToken, String pledgedT /** * 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"); - boolean includedCheck = true; + includedCheck = true; for (int j = chain.length() - 1; j > 0; j--) { + ForkResolutionLogger.debug("Object " + j); JSONObject chainIndexObject = chain.getJSONObject(j); if (chainIndexObject.has("tokensPledgedWith")) { - JSONArray tokensPledgedWithArray = chainIndexObject.getJSONArray("tokensPledgedWith"); - if (tokensPledgedWithArray.toString().contains(pledgedToken)) { - if(chainIndexObject.getString("receiver").equals(tokenChainsList.getJSONObject(i).getString("node"))) { + 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"); @@ -184,11 +191,10 @@ public static boolean verifyUnpledgedToken(String transferToken, String pledgedT includedCheck = false; } } - resolutionMessage = "<6> Token Pledged correctly in the appropriate level"; 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; } + if (includedCheck) + return true; ForkResolutionLogger.debug("Transfer token " + transferToken + " not found in any pledged token chains"); return false; } else { diff --git a/src/com/rubix/TokenTransfer/TransferPledge/Initiator.java b/src/com/rubix/TokenTransfer/TransferPledge/Initiator.java index ed0b567..b329616 100644 --- a/src/com/rubix/TokenTransfer/TransferPledge/Initiator.java +++ b/src/com/rubix/TokenTransfer/TransferPledge/Initiator.java @@ -4,26 +4,18 @@ 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; @@ -54,8 +46,8 @@ public class Initiator { public static boolean abort = false; public static void resetVariables() { - alphaList = new JSONArray(); - pledgedTokensWithNodesArray = new JSONArray(); + alphaList = new JSONArray(); + pledgedTokensWithNodesArray = new JSONArray(); distributedObject = new JSONObject(); pledgedNodes = new JSONArray(); abortReason = new JSONObject(); @@ -78,12 +70,8 @@ public static void resetVariables() { 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()); alphaList = dataObject.getJSONArray("alphaList"); pvt = dataObject.getString("pvt"); @@ -91,8 +79,6 @@ public static boolean pledgeSetUp(String data, IPFS ipfs, int PORT) throws JSONE 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; @@ -134,8 +120,8 @@ public static boolean pledgeSetUp(String data, IPFS ipfs, int PORT) throws JSONE 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"); + PledgeInitiatorLogger.debug("Quorum " + quorumID + " is pledging Tokens: " + tokenDetails); JSONArray hashesArray = new JSONArray(); for (int k = 0; k < tokenDetails.length(); k++) { @@ -144,9 +130,9 @@ public static boolean pledgeSetUp(String data, IPFS ipfs, int PORT) throws JSONE 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 + 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"); @@ -164,44 +150,31 @@ public static boolean pledgeSetUp(String data, IPFS ipfs, int PORT) throws JSONE pledged = Unpledge.verifyProof(tokenName, did, tid); 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; + PledgeInitiatorLogger.debug("PoW not Verified"); + IPFSNetwork.executeIPFSCommands("ipfs p2p close -t /p2p/" + quorumID); qSocket.close(); - return abort; + }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); } - 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); -// PledgeInitiatorLogger.debug("@@@@@ Chain to hash: " + tokenChain); - -// PledgeInitiatorLogger.debug("pledgeNewObject is " + pledgeNewObject); - String chainHashString = calculateHash(tokenChain.toString(), "SHA3-256"); - hashesArray.put(chainHashString); - } 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; + PledgeInitiatorLogger.debug("The token does not have PoW"); + IPFSNetwork.executeIPFSCommands("ipfs p2p close -t /p2p/" + quorumID); qSocket.close(); - return abort; } } else { JSONObject pledgeNewObject = new JSONObject(); @@ -213,13 +186,9 @@ public static boolean pledgeSetUp(String data, IPFS ipfs, int PORT) throws JSONE pledgeNewObject.put("tokensPledgedWith", tokenObject.getString("tokenHash")); pledgeNewObject.put("distributedObject", new JSONObject()); - // pledgedTokensArray.put(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); @@ -229,16 +198,11 @@ public static boolean pledgeSetUp(String data, IPFS ipfs, int PORT) throws JSONE 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); @@ -246,47 +210,32 @@ public static boolean pledgeSetUp(String data, IPFS ipfs, int PORT) throws JSONE break; } else { + PledgeInitiatorLogger.debug("Quorum " + quorumID + " is not pledging tokens"); IPFSNetwork.executeIPFSCommands("ipfs p2p close -t /p2p/" + quorumID); qSocket.close(); } } 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"); + PledgeInitiatorLogger.debug("Quorum " + quorumID + " Response is null"); IPFSNetwork.executeIPFSCommands("ipfs p2p close -t /p2p/" + quorumID); qSocket.close(); - return abort; } - - if(tokensCount != 0) { - abortReason.put("Quorum", quorumID); - abortReason.put("Reason", "Not enough tokens to pledge"); - return true; - } - else { - return false; - } } closeAllConnections(alphaList); - 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; + PledgeInitiatorLogger.debug("Quorum nodes with lesser tokens to pledge, Exiting..."); return true; - }else + }else { distributePledgeTokens(tokenList, pledgedTokensArray); - return abort; + return false; + } } public static boolean pledge(JSONArray pledgeDetails, double amount, int PORT) throws JSONException, UnknownHostException, IOException { - pledgedTokensArray = new JSONArray(); + pledgedTokensArray = new JSONArray(); Double tokensPledged = amount; PledgeInitiatorLogger.debug("pledgeDetails in pledge is " + pledgeDetails.toString()); @@ -495,7 +444,7 @@ public static boolean pledge(JSONArray pledgeDetails, double amount, int PORT) 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)); @@ -504,37 +453,37 @@ public static void closeAllConnections(JSONArray nodes){ 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); - + 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); + 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; }