Merge branch 'features/hyperledgerBlockchain' into develop
This commit is contained in:
commit
57cd29ad6f
Binary file not shown.
|
@ -25,9 +25,7 @@
|
||||||
</value>
|
</value>
|
||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
|
||||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
|
||||||
</component>
|
|
||||||
<component name="ProjectType">
|
<component name="ProjectType">
|
||||||
<option name="id" value="Android" />
|
<option name="id" value="Android" />
|
||||||
</component>
|
</component>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="VcsDirectoryMappings">
|
<component name="VcsDirectoryMappings">
|
||||||
<mapping directory="" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
|
@ -21,21 +21,32 @@ android {
|
||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
packagingOptions {
|
||||||
|
exclude 'META-INF/INDEX.LIST'
|
||||||
|
exclude 'META-INF/DEPENDENCIES'
|
||||||
|
exclude 'META-INF/io.netty.versions.properties'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
implementation 'com.android.support:appcompat-v7:26.1.0'
|
implementation 'com.android.support:appcompat-v7:26.1.0'
|
||||||
implementation 'com.android.support:design:26.1.0'
|
implementation 'com.android.support:design:26.1.0'
|
||||||
|
implementation 'com.android.support:multidex:1.0.3'
|
||||||
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
|
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
|
||||||
|
implementation 'org.glassfish:javax.json:1.0.4'
|
||||||
|
implementation 'com.google.code.gson:gson:2.8.5'
|
||||||
|
implementation ('org.hyperledger.fabric-sdk-java:fabric-sdk-java:1.2.1'){
|
||||||
|
exclude group:'org.glassfish', module:'javax.json'
|
||||||
|
exclude group:'log4j', module:'log4j'
|
||||||
|
}
|
||||||
testImplementation 'junit:junit:4.12'
|
testImplementation 'junit:junit:4.12'
|
||||||
androidTestImplementation 'com.android.support.test:runner:1.0.1'
|
androidTestImplementation 'com.android.support.test:runner:1.0.2'
|
||||||
androidTestImplementation 'com.android.support.test:rules:1.0.1'
|
androidTestImplementation 'com.android.support.test:rules:1.0.2'
|
||||||
androidTestImplementation 'com.android.support:support-annotations:26.1.0'
|
androidTestImplementation 'com.android.support:support-annotations:28.0.0'
|
||||||
androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.1', {
|
androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.1', {
|
||||||
exclude group: 'com.android.support', module: 'support-annotations'
|
exclude group: 'com.android.support', module: 'support-annotations'
|
||||||
})
|
})
|
||||||
implementation 'org.web3j:core:3.3.1-android'
|
|
||||||
implementation 'com.j256.ormlite:ormlite-core:5.1'
|
implementation 'com.j256.ormlite:ormlite-core:5.1'
|
||||||
implementation 'com.j256.ormlite:ormlite-jdbc:5.1'
|
implementation 'com.j256.ormlite:ormlite-jdbc:5.1'
|
||||||
implementation group: 'org.postgresql', name: 'postgresql', version: '42.2.5'
|
implementation group: 'org.postgresql', name: 'postgresql', version: '42.2.5'
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
package monnethic.mobile.test;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.support.test.InstrumentationRegistry;
|
||||||
|
import com.example.monnthic.monnethicmobile.R;
|
||||||
|
|
||||||
|
|
||||||
|
import org.hyperledger.fabric.sdk.NetworkConfig;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.Reader;
|
||||||
|
import java.io.StringWriter;
|
||||||
|
import java.io.Writer;
|
||||||
|
|
||||||
|
import javax.json.Json;
|
||||||
|
import javax.json.JsonObject;
|
||||||
|
import javax.json.JsonReader;
|
||||||
|
|
||||||
|
import io.grpc.internal.JsonParser;
|
||||||
|
|
||||||
|
|
||||||
|
public class LearningTest {
|
||||||
|
@Test
|
||||||
|
public void useAppContext() throws Exception {
|
||||||
|
// Context of the app under test.
|
||||||
|
Context appContext = InstrumentationRegistry.getTargetContext();
|
||||||
|
|
||||||
|
System.out.println(appContext.getFilesDir());
|
||||||
|
|
||||||
|
System.out.println(appContext.getPackageName());
|
||||||
|
|
||||||
|
InputStream is = appContext.getResources().openRawResource(R.raw.config);
|
||||||
|
|
||||||
|
try (JsonReader reader = Json.createReader(is)) {
|
||||||
|
JsonObject jsonConfig = (JsonObject) reader.read();
|
||||||
|
System.out.println(jsonConfig);
|
||||||
|
System.out.println(jsonConfig.getClass());
|
||||||
|
NetworkConfig config;
|
||||||
|
config = NetworkConfig.fromJsonObject(jsonConfig);
|
||||||
|
//System.out.println(config!=null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Writer writer = new StringWriter();
|
||||||
|
char[] buffer = new char[1024];
|
||||||
|
try {
|
||||||
|
Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
|
||||||
|
int n;
|
||||||
|
while ((n = reader.read(buffer)) != -1) {
|
||||||
|
writer.write(buffer, 0, n);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
is.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
String jsonString = writer.toString();
|
||||||
|
JSONObject jsonObject = new JSONObject(jsonString);
|
||||||
|
System.out.println(jsonObject.getString("name"));
|
||||||
|
System.out.println(jsonObject.getJSONObject("organizations"));
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,157 +0,0 @@
|
||||||
package monnethic.mobile.blockchain;
|
|
||||||
|
|
||||||
import org.web3j.protocol.Web3j;
|
|
||||||
import org.web3j.protocol.Web3jFactory;
|
|
||||||
import org.web3j.protocol.core.methods.response.EthGetBalance;
|
|
||||||
import org.web3j.protocol.core.methods.response.EthGetTransactionCount;
|
|
||||||
import org.web3j.protocol.http.HttpService;
|
|
||||||
import org.web3j.protocol.core.DefaultBlockParameterName;
|
|
||||||
import org.web3j.utils.Convert;
|
|
||||||
|
|
||||||
import java.math.BigInteger;
|
|
||||||
|
|
||||||
import monnethic.mobile.transaction.Transaction;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Guillaume on 28/05/2018.
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class AccessBlockchain {
|
|
||||||
private static final String node3 = "http://5.51.59.70:1403";
|
|
||||||
private static final String node2 = "http://93.30.148.59:1402";
|
|
||||||
private static final String node1 = "http://93.30.148.59:1401";
|
|
||||||
//private static String address_test = "0x5421c79d465a288c28e10aa43f9b7dff1b313c8e";
|
|
||||||
private static String address_node3 = "0x869abc2dadd7e23c8b38f054276813a67d8131a7";
|
|
||||||
//Web3j web3jNode2 = Web3jFactory.build(new HttpService(node2));
|
|
||||||
|
|
||||||
public static void main(String [ ] args)
|
|
||||||
{
|
|
||||||
try{
|
|
||||||
//USED FOR TEST
|
|
||||||
|
|
||||||
/*
|
|
||||||
Web3j web3jNode1 = Web3jFactory.build(new HttpService(node1));
|
|
||||||
System.out.println(web3jNode1.ethCoinbase().sendAsync().get().getResult());
|
|
||||||
|
|
||||||
EthGetTransactionCount transactionCount = web3jNode1.ethGetTransactionCount(address_test, DefaultBlockParameterName.LATEST).sendAsync().get();
|
|
||||||
System.out.println(transactionCount);
|
|
||||||
BigInteger nonce = transactionCount.getTransactionCount();
|
|
||||||
System.out.println(nonce);
|
|
||||||
*/
|
|
||||||
Web3j web3jNode1 = Web3jFactory.build(new HttpService(node1));
|
|
||||||
System.out.println("Node 1 : ethAccounts : "+web3jNode1.ethAccounts().send().getAccounts());
|
|
||||||
EthGetBalance ethGetBalance1 = web3jNode1.ethGetBalance("0x5421c79d465a288c28e10aa43f9b7dff1b313c8e", DefaultBlockParameterName.LATEST).sendAsync().get();
|
|
||||||
|
|
||||||
|
|
||||||
Web3j web3jNode2 = Web3jFactory.build(new HttpService(node2));
|
|
||||||
System.out.println("Noded 2 ethAccounts : "+web3jNode2.ethAccounts().send().getAccounts());
|
|
||||||
EthGetBalance ethGetBalance2 = web3jNode2.ethGetBalance("0xef816528949bda3b87e19b86848fb28767156232", DefaultBlockParameterName.LATEST).sendAsync().get();
|
|
||||||
|
|
||||||
System.out.println("Node 1 ethMining : "+web3jNode1.ethMining().send().getResult());
|
|
||||||
|
|
||||||
System.out.println("Node 1 sync : "+web3jNode1.ethSyncing().send().getResult().toString());
|
|
||||||
|
|
||||||
|
|
||||||
BigInteger wei1 = ethGetBalance1.getBalance();
|
|
||||||
System.out.println("Node 1 balance is : "+wei1);
|
|
||||||
|
|
||||||
BigInteger wei2 = ethGetBalance2.getBalance();
|
|
||||||
System.out.println("Node 2 balance is : "+wei2);
|
|
||||||
|
|
||||||
System.out.println("ethBlockNumber Node 1 : "+web3jNode1.ethBlockNumber().send().getResult());
|
|
||||||
System.out.println("ethGetWork Node 1 : "+web3jNode1.ethGetWork().send().getResult());
|
|
||||||
|
|
||||||
|
|
||||||
Web3j web3jNode3 = Web3jFactory.build(new HttpService(node3));
|
|
||||||
System.out.println("Node 3 : ethAccounts : "+web3jNode3.ethAccounts().send().getAccounts());
|
|
||||||
|
|
||||||
EthGetBalance ethGetBalance_n3 = web3jNode1.ethGetBalance(address_node3, DefaultBlockParameterName.LATEST).sendAsync().get();
|
|
||||||
System.out.println("TEST node 1 wallet 3 : "+ethGetBalance_n3);
|
|
||||||
|
|
||||||
//BigInteger test = getTheBalanceOfWallet(address);
|
|
||||||
//System.out.println(test);
|
|
||||||
|
|
||||||
//Web3j web3jNode1 = Web3jFactory.build(new HttpService(node1));
|
|
||||||
//Web3j web3jNode2 = Web3jFactory.build(new HttpService(node2));
|
|
||||||
//System.out.println("ethAccounts : "+web3jNode1.ethAccounts().send().getAccounts());
|
|
||||||
//System.out.println("ethGasPrice : "+web3jNode1.ethGasPrice().send().getGasPrice());
|
|
||||||
//System.out.println("ethGetWork : "+web3jNode1.ethGetWork().send().getResult());
|
|
||||||
//System.out.println("ethBlockNumber : "+web3jNode1.ethBlockNumber().send().getResult());
|
|
||||||
//EthGetBalance ethGetBalance = web3jNode1.ethGetBalance("0x5421c79d465a288c28e10aa43f9b7dff1b313c8e", DefaultBlockParameterName.LATEST).sendAsync().get();
|
|
||||||
// BigInteger wei = ethGetBalance.getBalance();
|
|
||||||
//System.out.println("wei is : "+wei);
|
|
||||||
|
|
||||||
//System.out.println("*************************************************");
|
|
||||||
//Web3j web3jNode1 = Web3jFactory.build(new HttpService(node1));
|
|
||||||
//Web3j web3jNode2 = Web3jFactory.build(new HttpService(node2));
|
|
||||||
//System.out.println("ethAccounts : "+web3jNode1.ethAccounts().send().getAccounts());
|
|
||||||
//System.out.println("ethAccounts : "+web3jNode2.ethAccounts().send().getAccounts());
|
|
||||||
//System.out.println("ethGasPrice : "+web3jNode2.ethGasPrice().send().getGasPrice());
|
|
||||||
//System.out.println("ethGetWork : "+web3jNode2.ethGetWork().send().getResult());
|
|
||||||
//System.out.println("ethBlockNumber : "+web3jNode2.ethBlockNumber().send().getResult());
|
|
||||||
//EthGetBalance ethGetBalance2 = web3jNode2.ethGetBalance("0x0278467c617c13604b3d88b95c2257a3a8a7bc01", DefaultBlockParameterName.LATEST).sendAsync().get();
|
|
||||||
//BigInteger wei2 = ethGetBalance2.getBalance();
|
|
||||||
//System.out.println("wei is : "+wei2);
|
|
||||||
}catch (Exception e){
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//Get Balance function
|
|
||||||
public BigInteger getTheBalanceOfWallet(String walletAddress){
|
|
||||||
Web3j web3jNode1 = Web3jFactory.build(new HttpService(node1));
|
|
||||||
try{
|
|
||||||
EthGetBalance ethGetBalance = web3jNode1.ethGetBalance(walletAddress, DefaultBlockParameterName.LATEST).sendAsync().get();
|
|
||||||
BigInteger wei = ethGetBalance.getBalance();
|
|
||||||
return wei;
|
|
||||||
}catch (Exception e){
|
|
||||||
e.getMessage();
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Send Transaction demo function
|
|
||||||
public static boolean sendTransationTo(String addressSource, String addressDestination, BigInteger amountToSend){
|
|
||||||
Web3j n1 = Web3jFactory.build(new HttpService(node1));
|
|
||||||
try{
|
|
||||||
EthGetTransactionCount transactionCount = n1.ethGetTransactionCount(addressSource, DefaultBlockParameterName.LATEST).sendAsync().get();
|
|
||||||
String coinbase = n1.ethCoinbase().sendAsync().get().getResult();
|
|
||||||
BigInteger nonce = transactionCount.getTransactionCount();
|
|
||||||
BigInteger gasPrice = n1.ethGasPrice().send().getGasPrice();
|
|
||||||
BigInteger gasLimit = gasPrice.multiply(BigInteger.valueOf(2));
|
|
||||||
|
|
||||||
BigInteger amountEther = Convert.toWei(amountToSend.toString(), Convert.Unit.ETHER).toBigInteger();
|
|
||||||
org.web3j.protocol.core.methods.request.Transaction transaction = org.web3j.protocol.core.methods.request.Transaction.createEtherTransaction(coinbase, nonce, gasPrice, gasLimit, addressDestination, amountEther);
|
|
||||||
String txUnit = "ETHER";
|
|
||||||
|
|
||||||
System.out.println("source : "+coinbase+"\nnonce : "+nonce+"\ngasPrice : "+gasPrice);
|
|
||||||
System.out.println("gasLimit : "+gasLimit+"\ndestination : "+addressDestination+"\namount : "+amountEther);
|
|
||||||
|
|
||||||
/*
|
|
||||||
Send the transaction
|
|
||||||
*/
|
|
||||||
//EthSendTransaction ethSendTransaction = n1.ethSendTransaction(transaction).sendAsync().get();
|
|
||||||
//String txHash = ethSendTransaction.getTransactionHash();
|
|
||||||
//TransactionReceipt txR = n1.ethGetTransactionReceipt(txHash).send().getResult();
|
|
||||||
//txR.getBlockNumber();
|
|
||||||
//insertTransaction(addressSource, addressDestination, amountToSend, txHash, txR.getBlockNumber().toString(), txUnit);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
|
|
||||||
|
|
||||||
}catch (Exception e){
|
|
||||||
e.getMessage();
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void insertTransaction(String adS, String adD, BigInteger amTs, String txH, String blN, String txUnit){
|
|
||||||
|
|
||||||
Transaction dbTrs = new Transaction();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,112 @@
|
||||||
|
package monnethic.mobile.blockchain.client;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import org.hyperledger.fabric.sdk.Enrollment;
|
||||||
|
import org.hyperledger.fabric_ca.sdk.HFCAClient;
|
||||||
|
import org.hyperledger.fabric_ca.sdk.RegistrationRequest;
|
||||||
|
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import monnethic.mobile.blockchain.participant.UserContext;
|
||||||
|
import monnethic.mobile.blockchain.utility.Util;
|
||||||
|
|
||||||
|
public class CAClientWrapper {
|
||||||
|
|
||||||
|
private HFCAClient hfcaClient;
|
||||||
|
private String org;
|
||||||
|
private String url = "http://ca.org1.example.com:7054";
|
||||||
|
private String mspId = "";
|
||||||
|
|
||||||
|
|
||||||
|
public CAClientWrapper(String url, String org){
|
||||||
|
this.org=org;
|
||||||
|
init(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
void init(String url){
|
||||||
|
try{
|
||||||
|
this.hfcaClient = HFCAClient.createNewInstance(url,null);
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Method to enroll admin
|
||||||
|
public void enrollAdmin(Context context, String name, String secret, String org) throws Exception {
|
||||||
|
UserContext adminContext;
|
||||||
|
adminContext = Util.readUserContext(context,name,secret);
|
||||||
|
if(adminContext!=null){
|
||||||
|
Logger.getLogger(CAClientWrapper.class.getName()).log(Level.WARNING, "Admin already enrolled, skip");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Enrollment enrollment = hfcaClient.enroll(name,secret);
|
||||||
|
Logger.getLogger(CAClientWrapper.class.getName()).log(Level.INFO, "Admin enrolled");
|
||||||
|
|
||||||
|
adminContext = new UserContext();
|
||||||
|
adminContext.setName(name);
|
||||||
|
adminContext.setEnrollment(enrollment);
|
||||||
|
adminContext.setAffiliation(org);
|
||||||
|
adminContext.setMspId(mspId);
|
||||||
|
|
||||||
|
Util.writeUserContext(context,adminContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Method to register and enroll user
|
||||||
|
public void regiserUser(Context context, String userName, String registrarAdmin) throws Exception{
|
||||||
|
UserContext userContext;
|
||||||
|
userContext = Util.readUserContext(context,org,userName);
|
||||||
|
if(userContext!=null){
|
||||||
|
Logger.getLogger(CAClientWrapper.class.getName()).log(Level.WARNING, "User already registered");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
RegistrationRequest registrationRequest = new RegistrationRequest(userName,org);
|
||||||
|
UserContext registrarContext = Util.readUserContext(context,org,registrarAdmin);
|
||||||
|
if(registrarAdmin==null){
|
||||||
|
Logger.getLogger(CAClientWrapper.class.getName()).log(Level.SEVERE, "Registar not enrolled");
|
||||||
|
throw new Exception("registrar context not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
String enrollSecret = hfcaClient.register(registrationRequest, registrarContext);
|
||||||
|
|
||||||
|
Enrollment enrollment = hfcaClient.enroll(userName,enrollSecret);
|
||||||
|
|
||||||
|
userContext = new UserContext();
|
||||||
|
userContext.setMspId(mspId);
|
||||||
|
userContext.setAffiliation(org); //TODO GET MSPID IN ORGANIZATIONS, ORGNAME
|
||||||
|
userContext.setEnrollment(enrollment);
|
||||||
|
userContext.setName(userName);
|
||||||
|
|
||||||
|
Util.writeUserContext(context,userContext);
|
||||||
|
Logger.getLogger(CAClientWrapper.class.getName()).log(Level.INFO, "User has been successfully registered");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Method to get userContext
|
||||||
|
public static UserContext getUserContext(Context context, String userName, String org){
|
||||||
|
UserContext userContext;
|
||||||
|
userContext = Util.readUserContext(context,org,userName);
|
||||||
|
if(userContext!=null){
|
||||||
|
return userContext;
|
||||||
|
}
|
||||||
|
Logger.getLogger(CAClientWrapper.class.getName()).log(Level.SEVERE, "User context not found : "+userName+" - "+org);
|
||||||
|
return userContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Method to enroll user.
|
||||||
|
public UserContext enrollUser(Context context, String userName, String enrollSecret, String org) throws Exception {
|
||||||
|
Enrollment enrollment = hfcaClient.enroll(userName,enrollSecret);
|
||||||
|
|
||||||
|
UserContext userContext = new UserContext();
|
||||||
|
userContext.setMspId(mspId);
|
||||||
|
userContext.setAffiliation(this.org);
|
||||||
|
userContext.setEnrollment(enrollment);
|
||||||
|
userContext.setName(userName);
|
||||||
|
|
||||||
|
Util.writeUserContext(context, userContext);
|
||||||
|
Logger.getLogger(CAClientWrapper.class.getName()).log(Level.INFO, "UserName - "+userName+" enrolled");
|
||||||
|
return userContext;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
package monnethic.mobile.blockchain.network;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.example.monnthic.monnethicmobile.R;
|
||||||
|
|
||||||
|
import org.hyperledger.fabric.sdk.NetworkConfig;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.Reader;
|
||||||
|
import java.io.StringWriter;
|
||||||
|
import java.io.Writer;
|
||||||
|
import java.util.logging.XMLFormatter;
|
||||||
|
|
||||||
|
import javax.json.JsonObject;
|
||||||
|
|
||||||
|
public class LoadConfigInfo {
|
||||||
|
private static final Integer lock = 0;
|
||||||
|
private static JSONObject jsonObject;
|
||||||
|
|
||||||
|
//Generate JSONObject from configFile
|
||||||
|
private LoadConfigInfo(Context context) {
|
||||||
|
|
||||||
|
InputStream is = context.getResources().openRawResource(R.raw.config);
|
||||||
|
Writer writer = new StringWriter();
|
||||||
|
char[] buffer = new char[1024];
|
||||||
|
try {
|
||||||
|
Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
|
||||||
|
int n;
|
||||||
|
while ((n = reader.read(buffer)) != -1) {
|
||||||
|
writer.write(buffer, 0, n);
|
||||||
|
}
|
||||||
|
} catch (Exception e){
|
||||||
|
e.getMessage();
|
||||||
|
} finally {
|
||||||
|
try{
|
||||||
|
if(is!=null) {
|
||||||
|
is.close();
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
e.getMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String jsonString = writer.toString();
|
||||||
|
try{
|
||||||
|
jsonObject = new JSONObject(jsonString);
|
||||||
|
}catch (Exception e){
|
||||||
|
e.getMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void getInstanceFile(Context context){
|
||||||
|
try{
|
||||||
|
synchronized (lock){
|
||||||
|
if(jsonObject == null){
|
||||||
|
new LoadConfigInfo(context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO GET ORGANIZATION INFOS
|
||||||
|
public static String getOrgInfo(Context context, String org) {
|
||||||
|
getInstanceFile(context);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//TODO GET ORGANIZATION NAME
|
||||||
|
public static String getOrgName(Context context){
|
||||||
|
getInstanceFile(context);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO GET MSPID IN ORG NAME
|
||||||
|
public static String getMspId(Context context,String orgName){
|
||||||
|
getInstanceFile(context);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
package monnethic.mobile.blockchain.participant;
|
||||||
|
|
||||||
|
import org.hyperledger.fabric.sdk.Enrollment;
|
||||||
|
import org.hyperledger.fabric.sdk.User;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class UserContext implements User, Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
protected String name;
|
||||||
|
protected Set<String> roles;
|
||||||
|
protected String account;
|
||||||
|
protected String affiliation;
|
||||||
|
protected Enrollment enrollment;
|
||||||
|
protected String mspId;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name){
|
||||||
|
this.name=name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<String> getRoles() {
|
||||||
|
return roles;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRoles(Set<String> roles){
|
||||||
|
this.roles=roles;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAccount() {
|
||||||
|
return account;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAccount(String account){
|
||||||
|
this.account=account;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAffiliation() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAffiliation(String affiliation){
|
||||||
|
this.affiliation=affiliation;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Enrollment getEnrollment() {
|
||||||
|
return enrollment;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEnrollment(Enrollment enrollment){
|
||||||
|
this.enrollment=enrollment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getMspId() {
|
||||||
|
return mspId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMspId(String mspId){
|
||||||
|
this.mspId=mspId;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,98 @@
|
||||||
|
package monnethic.mobile.blockchain.utility;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
|
|
||||||
|
import monnethic.mobile.blockchain.participant.UserContext;
|
||||||
|
|
||||||
|
public class Util {
|
||||||
|
|
||||||
|
private Context context;
|
||||||
|
|
||||||
|
public Util(Context context){
|
||||||
|
this.context=context;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Method which write user info into a directory
|
||||||
|
public static void writeUserContext(Context context, UserContext userContext){
|
||||||
|
ObjectOutputStream out = null;
|
||||||
|
FileOutputStream file = null;
|
||||||
|
try{
|
||||||
|
String filename = userContext.getName()+".context";
|
||||||
|
String dirPath = context.getFilesDir()+"userInfos/"+userContext.getAffiliation();
|
||||||
|
String pathFile = dirPath+"/"+filename;
|
||||||
|
|
||||||
|
File dir = new File(dirPath);
|
||||||
|
if(!dir.exists()){
|
||||||
|
dir.mkdirs();
|
||||||
|
}
|
||||||
|
|
||||||
|
file = null;
|
||||||
|
file = new FileOutputStream(pathFile);
|
||||||
|
out = new ObjectOutputStream(file);
|
||||||
|
|
||||||
|
out.writeObject(userContext);
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if (out != null){
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
try{
|
||||||
|
if(file != null){
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Method to read user in file
|
||||||
|
public static UserContext readUserContext(Context context, String affiliation, String username){
|
||||||
|
UserContext userContext = null;
|
||||||
|
FileInputStream fileInputStream = null;
|
||||||
|
ObjectInputStream in = null;
|
||||||
|
|
||||||
|
try{
|
||||||
|
String filename = username+".context";
|
||||||
|
String dirPath = context.getFilesDir()+"userInfos/"+affiliation;
|
||||||
|
String pathFile = dirPath+"/"+filename;
|
||||||
|
|
||||||
|
File file = new File(pathFile);
|
||||||
|
|
||||||
|
if(file.exists()){
|
||||||
|
fileInputStream = new FileInputStream(pathFile);
|
||||||
|
in = new ObjectInputStream(fileInputStream);
|
||||||
|
userContext = (UserContext) in.readObject();
|
||||||
|
}
|
||||||
|
} catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if(in != null){
|
||||||
|
in.close();
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
if(fileInputStream!=null){
|
||||||
|
fileInputStream.close();
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return userContext;
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,9 +10,7 @@ import android.widget.TextView;
|
||||||
|
|
||||||
import com.example.monnthic.monnethicmobile.R;
|
import com.example.monnthic.monnethicmobile.R;
|
||||||
|
|
||||||
import org.web3j.utils.Convert;
|
|
||||||
|
|
||||||
import monnethic.mobile.blockchain.AccessBlockchain;
|
|
||||||
import monnethic.mobile.transaction.TransactionActivity;
|
import monnethic.mobile.transaction.TransactionActivity;
|
||||||
|
|
||||||
public class WalletPresenterActivity extends AppCompatActivity {
|
public class WalletPresenterActivity extends AppCompatActivity {
|
||||||
|
@ -34,9 +32,9 @@ public class WalletPresenterActivity extends AppCompatActivity {
|
||||||
addressPublic.setText(address);
|
addressPublic.setText(address);
|
||||||
|
|
||||||
if(initiateBalance(address)==null){
|
if(initiateBalance(address)==null){
|
||||||
balance.setText("Error");
|
balance.setText("IN DEV");
|
||||||
}else{
|
}else{
|
||||||
balance.setText(Convert.fromWei(initiateBalance(address).toString(), Convert.Unit.ETHER).toString());
|
balance.setText("IN DEV");
|
||||||
}
|
}
|
||||||
|
|
||||||
buttonSendTransaction.setOnClickListener(new View.OnClickListener() {
|
buttonSendTransaction.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@ -61,9 +59,6 @@ public class WalletPresenterActivity extends AppCompatActivity {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String initiateBalance(String address){
|
public String initiateBalance(String address){
|
||||||
AccessBlockchain ab = new AccessBlockchain();
|
return "";
|
||||||
System.out.println("addresse "+ address);
|
|
||||||
String balanceIs = ab.getTheBalanceOfWallet(address).toString();
|
|
||||||
return balanceIs;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
61
app/src/main/res/raw/config.json
Normal file
61
app/src/main/res/raw/config.json
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
{
|
||||||
|
"name": "hlfv1",
|
||||||
|
"x-type": "hlfv1",
|
||||||
|
"x-commitTimeout": 300,
|
||||||
|
"version": "1.0.0",
|
||||||
|
"client": {
|
||||||
|
"organization": "Org1",
|
||||||
|
"connection": {
|
||||||
|
"timeout": {
|
||||||
|
"peer": {
|
||||||
|
"endorser": "300",
|
||||||
|
"eventHub": "300",
|
||||||
|
"eventReg": "300"
|
||||||
|
},
|
||||||
|
"orderer": "300"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"channels": {
|
||||||
|
"composerchannel": {
|
||||||
|
"orderers": [
|
||||||
|
"orderer.example.com"
|
||||||
|
],
|
||||||
|
"peers": {
|
||||||
|
"peer0.org1.example.com": {
|
||||||
|
"endorsingPeer": true,
|
||||||
|
"chaincodeQuery": true,
|
||||||
|
"ledgerQuery": true,
|
||||||
|
"eventSource": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"organizations": {
|
||||||
|
"Org1": {
|
||||||
|
"mspid": "Org1MSP",
|
||||||
|
"peers": [
|
||||||
|
"peer0.org1.example.com"
|
||||||
|
],
|
||||||
|
"certificateAuthorities": [
|
||||||
|
"ca.org1.example.com"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"orderers": {
|
||||||
|
"orderer.example.com": {
|
||||||
|
"url": "grpc://orderer.example.com:7050"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"peers": {
|
||||||
|
"peer0.org1.example.com": {
|
||||||
|
"url": "grpc://peer0.org1.example.com:7051"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"certificateAuthorities": {
|
||||||
|
"ca.org1.example.com": {
|
||||||
|
"url": "http://ca.org1.example.com:7054",
|
||||||
|
"caName": "ca.org1.example.com"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,7 +7,7 @@ buildscript {
|
||||||
jcenter()
|
jcenter()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:3.1.4'
|
classpath 'com.android.tools.build:gradle:3.2.1'
|
||||||
|
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
|
|
4
gradle/wrapper/gradle-wrapper.properties
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -1,6 +1,6 @@
|
||||||
#Mon Sep 24 08:37:23 CEST 2018
|
#Sun Oct 14 15:18:06 CEST 2018
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
|
||||||
|
|
Loading…
Reference in a new issue