Merge branch 'develop'
This commit is contained in:
commit
d127499a32
83
.gitignore
vendored
Normal file
83
.gitignore
vendored
Normal file
|
@ -0,0 +1,83 @@
|
|||
# Created by https://www.gitignore.io/api/intellij
|
||||
|
||||
### Intellij ###
|
||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
|
||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||
|
||||
# User-specific stuff
|
||||
.idea/**/workspace.xml
|
||||
.idea/**/tasks.xml
|
||||
.idea/**/usage.statistics.xml
|
||||
.idea/**/dictionaries
|
||||
.idea/**/shelf
|
||||
|
||||
# Generated files
|
||||
.idea/**/contentModel.xml
|
||||
|
||||
# Sensitive or high-churn files
|
||||
.idea/**/dataSources/
|
||||
.idea/**/dataSources.ids
|
||||
.idea/**/dataSources.local.xml
|
||||
.idea/**/sqlDataSources.xml
|
||||
.idea/**/dynamic.xml
|
||||
.idea/**/uiDesigner.xml
|
||||
.idea/**/dbnavigator.xml
|
||||
|
||||
# Gradle
|
||||
.idea/**/gradle.xml
|
||||
.idea/**/libraries
|
||||
|
||||
# Gradle and Maven with auto-import
|
||||
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||
# since they will be recreated, and may cause churn. Uncomment if using
|
||||
# auto-import.
|
||||
# .idea/modules.xml
|
||||
# .idea/*.iml
|
||||
# .idea/modules
|
||||
|
||||
# CMake
|
||||
cmake-build-*/
|
||||
|
||||
# Mongo Explorer plugin
|
||||
.idea/**/mongoSettings.xml
|
||||
|
||||
# File-based project format
|
||||
*.iws
|
||||
|
||||
# IntelliJ
|
||||
out/
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
.idea_modules/
|
||||
|
||||
# JIRA plugin
|
||||
atlassian-ide-plugin.xml
|
||||
|
||||
# Cursive Clojure plugin
|
||||
.idea/replstate.xml
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
com_crashlytics_export_strings.xml
|
||||
crashlytics.properties
|
||||
crashlytics-build.properties
|
||||
fabric.properties
|
||||
|
||||
# Editor-based Rest Client
|
||||
.idea/httpRequests
|
||||
|
||||
# Android studio 3.1+ serialized cache file
|
||||
.idea/caches/build_file_checksums.ser
|
||||
|
||||
### Intellij Patch ###
|
||||
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
|
||||
|
||||
# *.iml
|
||||
# modules.xml
|
||||
# .idea/misc.xml
|
||||
# *.ipr
|
||||
|
||||
# Sonarlint plugin
|
||||
.idea/sonarlint
|
||||
|
||||
|
||||
# End of https://www.gitignore.io/api/intellij
|
13
.idea/compiler.xml
Normal file
13
.idea/compiler.xml
Normal file
|
@ -0,0 +1,13 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CompilerConfiguration">
|
||||
<annotationProcessing>
|
||||
<profile name="Maven default annotation processors profile" enabled="true">
|
||||
<sourceOutputDir name="target/generated-sources/annotations" />
|
||||
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
|
||||
<outputRelativeToContentRoot value="true" />
|
||||
<module name="java-api" />
|
||||
</profile>
|
||||
</annotationProcessing>
|
||||
</component>
|
||||
</project>
|
6
.idea/encodings.xml
Normal file
6
.idea/encodings.xml
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding">
|
||||
<file url="file://$PROJECT_DIR$" charset="UTF-8" />
|
||||
</component>
|
||||
</project>
|
14
.idea/misc.xml
Normal file
14
.idea/misc.xml
Normal file
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="MavenProjectsManager">
|
||||
<option name="originalFiles">
|
||||
<list>
|
||||
<option value="$PROJECT_DIR$/pom.xml" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
6
.idea/vcs.xml
Normal file
6
.idea/vcs.xml
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
BIN
msp/org1/User-org1.context
Normal file
BIN
msp/org1/User-org1.context
Normal file
Binary file not shown.
BIN
msp/org1/admin.context
Normal file
BIN
msp/org1/admin.context
Normal file
Binary file not shown.
BIN
msp/toto/abdel.context
Normal file
BIN
msp/toto/abdel.context
Normal file
Binary file not shown.
74
pom.xml
Normal file
74
pom.xml
Normal file
|
@ -0,0 +1,74 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.monnethic</groupId>
|
||||
<artifactId>java-api</artifactId>
|
||||
<version>0.1</version>
|
||||
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>1.5.9.RELEASE</version>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
|
||||
|
||||
<!-- HYPERLEDGER -->
|
||||
<dependency>
|
||||
<groupId>org.hyperledger.fabric-sdk-java</groupId>
|
||||
<artifactId>fabric-sdk-java</artifactId>
|
||||
<version>1.2.1</version>
|
||||
</dependency>
|
||||
<!-- ***** -->
|
||||
|
||||
<!-- SPRING FRAMEWORK -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
</dependency>
|
||||
<!-- ***** -->
|
||||
|
||||
<!-- LOGGER AND TEST DEPENDENCIES -->
|
||||
<dependency>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
<version>1.2.17</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.12</version>
|
||||
</dependency>
|
||||
<!-- ***** -->
|
||||
|
||||
<!-- CRYPTO CONFIG -->
|
||||
<dependency>
|
||||
<groupId>org.bouncycastle</groupId>
|
||||
<artifactId>bcprov-jdk15on</artifactId>
|
||||
<version>1.60</version>
|
||||
</dependency>
|
||||
<!-- ***** -->
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
<java.version>1.8</java.version>
|
||||
</properties>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
31
src/main/java/Application/App.java
Normal file
31
src/main/java/Application/App.java
Normal file
|
@ -0,0 +1,31 @@
|
|||
package Application;
|
||||
|
||||
import org.springframework.boot.CommandLineRunner;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
|
||||
@SpringBootApplication
|
||||
public class App {
|
||||
public static void main(String [ ] args){
|
||||
SpringApplication app = new SpringApplication(App.class);
|
||||
app.setDefaultProperties(Collections.singletonMap("server.port","8083"));
|
||||
app.run(args);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public CommandLineRunner commandLineRunner(ApplicationContext ctx){
|
||||
return args -> {
|
||||
System.out.println("Spring Boot:");
|
||||
String[] beanNames = ctx.getBeanDefinitionNames();
|
||||
Arrays.sort(beanNames);
|
||||
for (String beanName : beanNames) {
|
||||
System.out.println(beanName);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
105
src/main/java/blockchain/client/CAClientWrapper.java
Normal file
105
src/main/java/blockchain/client/CAClientWrapper.java
Normal file
|
@ -0,0 +1,105 @@
|
|||
package blockchain.client;
|
||||
|
||||
import blockchain.user.UserContext;
|
||||
import blockchain.utility.Util;
|
||||
import org.apache.log4j.BasicConfigurator;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.hyperledger.fabric.sdk.Enrollment;
|
||||
import org.hyperledger.fabric.sdk.exception.CryptoException;
|
||||
import org.hyperledger.fabric.sdk.exception.InvalidArgumentException;
|
||||
import org.hyperledger.fabric.sdk.security.CryptoSuite;
|
||||
import org.hyperledger.fabric_ca.sdk.HFCAClient;
|
||||
import org.hyperledger.fabric_ca.sdk.RegistrationRequest;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.net.MalformedURLException;
|
||||
import java.util.Properties;
|
||||
|
||||
public class CAClientWrapper {
|
||||
private static Logger logger = Logger.getLogger(CAClientWrapper.class);
|
||||
private String caUrl;
|
||||
private Properties properties;
|
||||
private HFCAClient hfcaClient;
|
||||
private UserContext adminContext;
|
||||
|
||||
public void setAdminContext(UserContext adminContext) { this.adminContext = adminContext; }
|
||||
|
||||
public UserContext getAdminContext(){ return adminContext; }
|
||||
|
||||
public HFCAClient getHfcaClient(){
|
||||
return hfcaClient;
|
||||
}
|
||||
|
||||
public CAClientWrapper(String caUrl, Properties properties) throws MalformedURLException, IllegalAccessException, InstantiationException, ClassNotFoundException, CryptoException, InvalidArgumentException, NoSuchMethodException, InvocationTargetException {
|
||||
this.caUrl=caUrl;
|
||||
this.properties=properties;
|
||||
init();
|
||||
}
|
||||
|
||||
private void init() throws MalformedURLException, IllegalAccessException, InstantiationException, ClassNotFoundException, CryptoException, InvalidArgumentException, NoSuchMethodException, InvocationTargetException {
|
||||
BasicConfigurator.configure();
|
||||
CryptoSuite cryptoSuite = CryptoSuite.Factory.getCryptoSuite();
|
||||
hfcaClient = HFCAClient.createNewInstance(caUrl, properties);
|
||||
hfcaClient.setCryptoSuite(cryptoSuite);
|
||||
}
|
||||
|
||||
public UserContext enrollAdmin(String username, String password, String affiliation) throws Exception{
|
||||
BasicConfigurator.configure();
|
||||
UserContext checkAdmin;
|
||||
checkAdmin = Util.readUserContext(affiliation, username);
|
||||
|
||||
//SANITY CHECK
|
||||
if(adminContext.getName().isEmpty()) throw new NullPointerException();
|
||||
|
||||
if(checkAdmin!=null){
|
||||
logger.warn("Admin already enrolled, skip");
|
||||
return checkAdmin;
|
||||
}
|
||||
|
||||
logger.info("Try hfcaClient.enroll");
|
||||
Enrollment enrollment = hfcaClient.enroll(username,password);
|
||||
|
||||
logger.info("Admin enrolled");
|
||||
adminContext.setEnrollment(enrollment);
|
||||
|
||||
logger.info("Write admin in msp directory");
|
||||
Util.writeUserContext(adminContext);
|
||||
return adminContext;
|
||||
}
|
||||
|
||||
//Method to register an User
|
||||
public String registerUser(String username, String organization) throws Exception {
|
||||
UserContext userContext = Util.readUserContext(organization, username);
|
||||
if (userContext!=null){
|
||||
logger.warn("User already registered");
|
||||
return null;
|
||||
}
|
||||
RegistrationRequest rr = new RegistrationRequest(username,organization);
|
||||
logger.info("registrar is : "+adminContext.getName());
|
||||
String enrollementSecret = hfcaClient.register(rr,adminContext);
|
||||
logger.info("User registered");
|
||||
return enrollementSecret;
|
||||
}
|
||||
|
||||
//Method to enroll an User
|
||||
public UserContext enrollUser(UserContext userContext, String secret) throws Exception{
|
||||
UserContext uContext = Util.readUserContext(userContext.getAffiliation(),userContext.getName());
|
||||
if(uContext!=null){
|
||||
logger.warn("User already enrolled");
|
||||
return uContext;
|
||||
}
|
||||
Enrollment enrollment = hfcaClient.enroll(userContext.getName(),secret);
|
||||
userContext.setEnrollment(enrollment);
|
||||
Util.writeUserContext(userContext);
|
||||
logger.info("User enrolled");
|
||||
return userContext;
|
||||
}
|
||||
|
||||
//Method to revoke an User
|
||||
public void revokeUser(UserContext admin, Enrollment userEnrollement, String reason) throws Exception{
|
||||
hfcaClient.revoke(admin,userEnrollement,reason);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
99
src/main/java/blockchain/client/ChannelClientWrapper.java
Normal file
99
src/main/java/blockchain/client/ChannelClientWrapper.java
Normal file
|
@ -0,0 +1,99 @@
|
|||
package blockchain.client;
|
||||
|
||||
|
||||
import blockchain.configuration.Config;
|
||||
import org.apache.log4j.BasicConfigurator;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.hyperledger.fabric.sdk.*;
|
||||
import org.hyperledger.fabric.sdk.exception.InvalidArgumentException;
|
||||
import org.hyperledger.fabric.sdk.exception.ProposalException;
|
||||
import org.hyperledger.fabric.sdk.exception.TransactionException;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class ChannelClientWrapper {
|
||||
private String name;
|
||||
static private Channel channel;
|
||||
private FabricClientWrapper fabricClientWrapper;
|
||||
|
||||
public String getName(){
|
||||
return name;
|
||||
}
|
||||
|
||||
public Channel getChannel(){
|
||||
return channel;
|
||||
}
|
||||
|
||||
public FabricClientWrapper getFabricClientWrapper(){
|
||||
return fabricClientWrapper;
|
||||
}
|
||||
|
||||
public ChannelClientWrapper(String name, Channel channel, FabricClientWrapper fabricClientWrapper){
|
||||
this.name=name;
|
||||
this.channel=channel;
|
||||
this.fabricClientWrapper=fabricClientWrapper;
|
||||
}
|
||||
|
||||
public Collection<ProposalResponse> queryByChainCode(String chaincodeName,String fuctionName, String[] args) throws InvalidArgumentException, ProposalException {
|
||||
QueryByChaincodeRequest request = fabricClientWrapper.getClient().newQueryProposalRequest();
|
||||
ChaincodeID chaincodeID = ChaincodeID.newBuilder().setName(chaincodeName).build();
|
||||
request.setChaincodeID(chaincodeID);
|
||||
request.setFcn(fuctionName);
|
||||
if(args != null){
|
||||
request.setArgs(args);
|
||||
}
|
||||
|
||||
Collection<ProposalResponse> response = channel.queryByChaincode(request);
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
//Method to init the channel for query
|
||||
static public ChannelClientWrapper setupChannel(FabricClientWrapper fabricClientWrapper) throws InvalidArgumentException, TransactionException {
|
||||
|
||||
ChannelClientWrapper channelClientWrapper = fabricClientWrapper.createChannelClient(Config.CHANNEL_NAME);
|
||||
|
||||
channel = channelClientWrapper.getChannel();
|
||||
Peer peer = fabricClientWrapper.getClient().newPeer(Config.ORG1_PEER_0,Config.ORG1_PEER_0_URL);
|
||||
EventHub eventHub = fabricClientWrapper.getClient().newEventHub("eventhub01", "grpc://vps577432.ovh.net:8053");
|
||||
Orderer orderer = fabricClientWrapper.getClient().newOrderer(Config.ORDERER_NAME,Config.ORDERER_URL);
|
||||
channel.addPeer(peer);
|
||||
channel.addEventHub(eventHub);
|
||||
channel.addOrderer(orderer);
|
||||
channel.initialize();
|
||||
|
||||
return channelClientWrapper;
|
||||
}
|
||||
|
||||
//Wrapper for channel.sendTransactionProposal
|
||||
public Collection<ProposalResponse> sendTransactionProposal (TransactionProposalRequest transactionProposalRequest){
|
||||
try{
|
||||
return channel.sendTransactionProposal(transactionProposalRequest);
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
//Wrapper for channel.sendTransaction
|
||||
public BlockEvent.TransactionEvent sendTransaction(Collection<ProposalResponse> proposalResponses){
|
||||
Logger logger = Logger.getLogger(ChannelClientWrapper.class);
|
||||
BasicConfigurator.configure();
|
||||
try{
|
||||
|
||||
List<ProposalResponse> invalid = proposalResponses.stream().filter(r -> r.isInvalid()).collect(Collectors.toList());
|
||||
if (!invalid.isEmpty()) {
|
||||
invalid.forEach(response -> {
|
||||
logger.error(response.getMessage());
|
||||
});
|
||||
}
|
||||
|
||||
return channel.sendTransaction(proposalResponses).get();
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
43
src/main/java/blockchain/client/FabricClientWrapper.java
Normal file
43
src/main/java/blockchain/client/FabricClientWrapper.java
Normal file
|
@ -0,0 +1,43 @@
|
|||
package blockchain.client;
|
||||
|
||||
import blockchain.configuration.Config;
|
||||
import blockchain.user.UserContext;
|
||||
import org.hyperledger.fabric.sdk.*;
|
||||
import org.hyperledger.fabric.sdk.exception.CryptoException;
|
||||
import org.hyperledger.fabric.sdk.exception.InvalidArgumentException;
|
||||
import org.hyperledger.fabric.sdk.exception.ProposalException;
|
||||
import org.hyperledger.fabric.sdk.exception.TransactionException;
|
||||
import org.hyperledger.fabric.sdk.security.CryptoSuite;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.Set;
|
||||
|
||||
public class FabricClientWrapper {
|
||||
private HFClient client;
|
||||
|
||||
public HFClient getClient(){
|
||||
return client;
|
||||
}
|
||||
|
||||
public FabricClientWrapper(UserContext userContext) throws CryptoException, InvalidArgumentException, IllegalAccessException, InstantiationException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException {
|
||||
CryptoSuite cryptoSuite = CryptoSuite.Factory.getCryptoSuite();
|
||||
client = HFClient.createNewInstance();
|
||||
client.setCryptoSuite(cryptoSuite);
|
||||
client.setUserContext(userContext);
|
||||
}
|
||||
|
||||
public ChannelClientWrapper createChannelClient(String name) throws InvalidArgumentException {
|
||||
Channel channel = client.newChannel(name);
|
||||
ChannelClientWrapper channelClientWrapper = new ChannelClientWrapper(name, channel, this);
|
||||
return channelClientWrapper;
|
||||
}
|
||||
|
||||
public Set<String> queryForChannels() throws InvalidArgumentException, IllegalArgumentException, ProposalException {
|
||||
client.newChannel(Config.CHANNEL_NAME);
|
||||
client.newOrderer(Config.ORDERER_NAME,Config.ORDERER_URL);
|
||||
//Peer peer = client.newPeer(Config.ORG_PEER,Config.ORG_PEER_URL);
|
||||
Peer peer = client.newPeer(Config.ORG1_PEER_0,Config.ORG1_PEER_0_URL);
|
||||
return client.queryChannels(peer);
|
||||
}
|
||||
|
||||
}
|
51
src/main/java/blockchain/configuration/Config.java
Normal file
51
src/main/java/blockchain/configuration/Config.java
Normal file
|
@ -0,0 +1,51 @@
|
|||
package blockchain.configuration;
|
||||
|
||||
public class Config {
|
||||
|
||||
//ORGANIZATION
|
||||
public static final String ORG1_MSP = "Org1MSP";
|
||||
|
||||
public static final String ORG1 = "org1";
|
||||
|
||||
//ADMIN
|
||||
public static final String ADMIN = "admin";
|
||||
|
||||
public static final String ADMIN_PASSWORD = "adminpw";
|
||||
|
||||
//USER
|
||||
public static final String UserPWD = "ZIidLJHQbLcC";
|
||||
|
||||
//CA
|
||||
public static final String CA_ORG1_URL = "http://vps577432.ovh.net:7054";
|
||||
|
||||
//ORDERER
|
||||
public static final String ORDERER_URL = "grpc://vps577432.ovh.net:7050";
|
||||
|
||||
public static final String ORDERER_NAME = "orderer.example.com";
|
||||
|
||||
//CHANNEL - CHAINCODE
|
||||
public static final String CHANNEL_NAME = "mychannel";
|
||||
|
||||
public static final String CHAINCODE_NAME = "mycc";
|
||||
|
||||
//PEER 0
|
||||
public static final String ORG1_PEER_0 = "peer0.org1.example.com";
|
||||
|
||||
public static final String ORG1_PEER_0_URL = "grpc://vps577432.ovh.net:8051";
|
||||
|
||||
//PEER 1
|
||||
public static final String ORG_PEER = "peer1.org1.example.com";
|
||||
|
||||
public static final String ORG_PEER_URL = "grpc://vps592802.ovh.net:9051";
|
||||
|
||||
//EVENTHUB
|
||||
public static final String ORG_PEER_EVENT_URL = "grpc://vps592802.ovh.net:9053";
|
||||
|
||||
//ADMIN FILE TEST
|
||||
public static final String ADMIN_FILE_PATH = "msp/AdminFiles";
|
||||
|
||||
public static final String ADMIN_KEY_PATH = ADMIN_FILE_PATH+"/keystore";
|
||||
|
||||
public static final String ADMIN_CERT_PATH = ADMIN_FILE_PATH+"/admincerts";
|
||||
|
||||
}
|
53
src/main/java/blockchain/query/QueryWrapper.java
Normal file
53
src/main/java/blockchain/query/QueryWrapper.java
Normal file
|
@ -0,0 +1,53 @@
|
|||
package blockchain.query;
|
||||
|
||||
import blockchain.client.ChannelClientWrapper;
|
||||
import blockchain.client.FabricClientWrapper;
|
||||
import blockchain.configuration.Config;
|
||||
import blockchain.user.UserContext;
|
||||
import blockchain.utility.Util;
|
||||
import org.hyperledger.fabric.sdk.ChaincodeResponse;
|
||||
import org.hyperledger.fabric.sdk.ProposalResponse;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
public class QueryWrapper {
|
||||
|
||||
public String getUserBalance(String userHashId){
|
||||
String response = null;
|
||||
try{
|
||||
UserContext userContext = Util.readUserContext(Config.ORG1,"User-org1");
|
||||
String chaincode = Config.CHAINCODE_NAME;
|
||||
FabricClientWrapper fabricClientWrapper = new FabricClientWrapper(userContext);
|
||||
|
||||
ChannelClientWrapper channelClientWrapper = ChannelClientWrapper.setupChannel(fabricClientWrapper);
|
||||
|
||||
String[] args = {userHashId};
|
||||
|
||||
Collection<ProposalResponse> responseQuery = channelClientWrapper.queryByChainCode(chaincode,"query",args);
|
||||
for(ProposalResponse pres : responseQuery){
|
||||
ChaincodeResponse.Status status = pres.getStatus();
|
||||
if(status.getStatus()!=200){
|
||||
throw new Exception(pres.getMessage());
|
||||
}
|
||||
|
||||
response = new String(pres.getChaincodeActionResponsePayload());
|
||||
}
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
if(response==null) response = "Error";
|
||||
return response;
|
||||
}
|
||||
|
||||
public String getUser(String userHashId){
|
||||
return "";
|
||||
}
|
||||
|
||||
public List<String> getUserLastTransactions(String userHashId){
|
||||
List<String> transactions = new ArrayList<>();
|
||||
return transactions;
|
||||
}
|
||||
}
|
41
src/main/java/blockchain/query/TransactionWrapper.java
Normal file
41
src/main/java/blockchain/query/TransactionWrapper.java
Normal file
|
@ -0,0 +1,41 @@
|
|||
package blockchain.query;
|
||||
|
||||
import blockchain.client.ChannelClientWrapper;
|
||||
import blockchain.client.FabricClientWrapper;
|
||||
import blockchain.configuration.Config;
|
||||
import blockchain.user.UserContext;
|
||||
import blockchain.utility.Util;
|
||||
import org.hyperledger.fabric.sdk.BlockEvent;
|
||||
import org.hyperledger.fabric.sdk.ChaincodeID;
|
||||
import org.hyperledger.fabric.sdk.ProposalResponse;
|
||||
import org.hyperledger.fabric.sdk.TransactionProposalRequest;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public class TransactionWrapper {
|
||||
|
||||
public String sendTransaction(String from, String to, String amount){
|
||||
try{
|
||||
UserContext userContext = Util.readUserContext(Config.ORG1,"User-org1");
|
||||
String chaincode = Config.CHAINCODE_NAME;
|
||||
FabricClientWrapper fabricClientWrapper = new FabricClientWrapper(userContext);
|
||||
|
||||
ChannelClientWrapper channelClientWrapper = ChannelClientWrapper.setupChannel(fabricClientWrapper);
|
||||
|
||||
TransactionProposalRequest tpr = fabricClientWrapper.getClient().newTransactionProposalRequest();
|
||||
ChaincodeID cid = ChaincodeID.newBuilder().setName(Config.CHAINCODE_NAME).build();
|
||||
tpr.setChaincodeID(cid);
|
||||
tpr.setFcn("invoke");
|
||||
tpr.setArgs(new String[]{from,to,amount});
|
||||
|
||||
Collection<ProposalResponse> responses = channelClientWrapper.sendTransactionProposal(tpr);
|
||||
BlockEvent.TransactionEvent event = channelClientWrapper.sendTransaction(responses);
|
||||
|
||||
return event.getTransactionID();
|
||||
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
27
src/main/java/blockchain/user/CAEnrollement.java
Normal file
27
src/main/java/blockchain/user/CAEnrollement.java
Normal file
|
@ -0,0 +1,27 @@
|
|||
package blockchain.user;
|
||||
|
||||
import org.hyperledger.fabric.sdk.Enrollment;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.security.PrivateKey;
|
||||
|
||||
public class CAEnrollement implements Enrollment, Serializable {
|
||||
private static final long serialVersionUID = 550416591376968096L;
|
||||
private PrivateKey privateKey;
|
||||
private String cert;
|
||||
|
||||
public CAEnrollement(PrivateKey pkey, String signedPem){
|
||||
this.privateKey=pkey;
|
||||
this.cert=signedPem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PrivateKey getKey() {
|
||||
return privateKey;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCert() {
|
||||
return cert;
|
||||
}
|
||||
}
|
72
src/main/java/blockchain/user/UserContext.java
Normal file
72
src/main/java/blockchain/user/UserContext.java
Normal file
|
@ -0,0 +1,72 @@
|
|||
package blockchain.user;
|
||||
|
||||
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;
|
||||
|
||||
public void setName(String name){
|
||||
this.name=name;
|
||||
}
|
||||
|
||||
public void setRoles(Set<String> roles){
|
||||
this.roles=roles;
|
||||
}
|
||||
|
||||
public void setAccount(String account) {
|
||||
this.account = account;
|
||||
}
|
||||
|
||||
public void setAffiliation(String affiliation) {
|
||||
this.affiliation = affiliation;
|
||||
}
|
||||
|
||||
public void setEnrollment(Enrollment enrollment) {
|
||||
this.enrollment = enrollment;
|
||||
}
|
||||
|
||||
public void setMspId(String mspId) {
|
||||
this.mspId = mspId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<String> getRoles() {
|
||||
return roles;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAccount() {
|
||||
return account;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAffiliation() {
|
||||
return affiliation;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enrollment getEnrollment() {
|
||||
return enrollment;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMspId() {
|
||||
return mspId;
|
||||
}
|
||||
}
|
90
src/main/java/blockchain/utility/Util.java
Normal file
90
src/main/java/blockchain/utility/Util.java
Normal file
|
@ -0,0 +1,90 @@
|
|||
package blockchain.utility;
|
||||
|
||||
|
||||
import blockchain.user.UserContext;
|
||||
import org.apache.log4j.BasicConfigurator;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import java.io.*;
|
||||
|
||||
//Class to Read and Write user / admin to msp directory
|
||||
public class Util {
|
||||
private static Logger logger = Logger.getLogger(Util.class);
|
||||
|
||||
public static void writeUserContext(UserContext userContext) {
|
||||
BasicConfigurator.configure();
|
||||
|
||||
ObjectOutputStream out = null;
|
||||
FileOutputStream fileOutputStream = null;
|
||||
try {
|
||||
logger.info("Write user "+userContext.getName()+" of "+userContext.getAffiliation());
|
||||
|
||||
String directoryPath = "msp/" + userContext.getAffiliation();
|
||||
String filePath = directoryPath + "/" + userContext.getName() + ".context";
|
||||
File directory = new File(directoryPath);
|
||||
|
||||
if (!directory.exists()){
|
||||
logger.info("Create directory at path "+directoryPath);
|
||||
directory.mkdirs();
|
||||
}
|
||||
|
||||
File file = new File(filePath);
|
||||
fileOutputStream = new FileOutputStream(file);
|
||||
out = new ObjectOutputStream(fileOutputStream);
|
||||
logger.info("Try write object for user "+userContext.getName());
|
||||
out.writeObject(userContext);
|
||||
} catch (IOException e) {
|
||||
logger.error("1st IOException");
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
try {
|
||||
if (out != null){
|
||||
logger.info("Close ObjectOutputStream");
|
||||
out.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
if (fileOutputStream != null) {
|
||||
logger.info("Close fileOutputStream");
|
||||
fileOutputStream.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static UserContext readUserContext(String affiliation, String username) {
|
||||
UserContext userContext = null;
|
||||
FileInputStream fileStream = null;
|
||||
ObjectInputStream in = null;
|
||||
try {
|
||||
String filePath = "msp/" + affiliation + "/" + username + ".context";
|
||||
File file = new File(filePath);
|
||||
if (file.exists()) {
|
||||
fileStream = new FileInputStream(filePath);
|
||||
in = new ObjectInputStream(fileStream);
|
||||
userContext = (UserContext) in.readObject();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
try {
|
||||
if (in != null)
|
||||
in.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
if (fileStream != null)
|
||||
fileStream.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return userContext;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
12
src/main/java/restService/WelcomeController.java
Normal file
12
src/main/java/restService/WelcomeController.java
Normal file
|
@ -0,0 +1,12 @@
|
|||
package restService;
|
||||
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
public class WelcomeController {
|
||||
|
||||
@RequestMapping("/")
|
||||
public String index(){return "Welcome from Monnethic !";}
|
||||
|
||||
}
|
42
src/test/java/blockchain/client/TestEnrollAdmin.java
Normal file
42
src/test/java/blockchain/client/TestEnrollAdmin.java
Normal file
|
@ -0,0 +1,42 @@
|
|||
package blockchain.client;
|
||||
|
||||
import blockchain.configuration.Config;
|
||||
import blockchain.user.UserContext;
|
||||
import org.hyperledger.fabric.sdk.Enrollment;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
//Test to enroll Admin
|
||||
public class TestEnrollAdmin {
|
||||
@Test
|
||||
public void TestAEnrollAdmin(){
|
||||
String caUrl = Config.CA_ORG1_URL;
|
||||
try {
|
||||
CAClientWrapper caClientWrapper = new CAClientWrapper(caUrl,null);
|
||||
|
||||
UserContext adminContext = new UserContext();
|
||||
adminContext.setName(Config.ADMIN);
|
||||
adminContext.setAffiliation(Config.ORG1);
|
||||
adminContext.setMspId(Config.ORG1_MSP);
|
||||
|
||||
caClientWrapper.setAdminContext(adminContext);
|
||||
|
||||
UserContext verifyUser = caClientWrapper.getAdminContext();
|
||||
assertEquals(Config.ADMIN, verifyUser.getName());
|
||||
assertEquals(Config.ORG1, verifyUser.getAffiliation());
|
||||
assertEquals(Config.ORG1_MSP, verifyUser.getMspId());
|
||||
|
||||
//ENROLL AND WRITE ADMIN
|
||||
adminContext = caClientWrapper.enrollAdmin(adminContext.getName(),Config.ADMIN_PASSWORD,adminContext.getAffiliation());
|
||||
|
||||
//Check Admin Enrollement
|
||||
Enrollment enrollment = adminContext.getEnrollment();
|
||||
System.out.println("admin cert : "+enrollment.getCert());
|
||||
System.out.println("admin keys : "+enrollment.getKey());
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
37
src/test/java/blockchain/client/TestRegisterEnrollUser.java
Normal file
37
src/test/java/blockchain/client/TestRegisterEnrollUser.java
Normal file
|
@ -0,0 +1,37 @@
|
|||
package blockchain.client;
|
||||
|
||||
import blockchain.configuration.Config;
|
||||
import blockchain.user.UserContext;
|
||||
import blockchain.utility.Util;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.junit.Test;
|
||||
|
||||
//Test to register and enroll user
|
||||
public class TestRegisterEnrollUser {
|
||||
private static Logger logger = Logger.getLogger(TestRegisterEnrollUser.class);
|
||||
//Success
|
||||
@Test
|
||||
public void RegisterEnrollUser(){
|
||||
String caUrl = Config.CA_ORG1_URL;
|
||||
try{
|
||||
CAClientWrapper caClientWrapper = new CAClientWrapper(caUrl,null);
|
||||
UserContext admin = Util.readUserContext(Config.ORG1,Config.ADMIN);
|
||||
caClientWrapper.setAdminContext(admin);
|
||||
UserContext userContext = new UserContext();
|
||||
|
||||
userContext.setName("User-org1");
|
||||
userContext.setAffiliation(Config.ORG1);
|
||||
userContext.setMspId(Config.ORG1_MSP);
|
||||
String userSecret = caClientWrapper.registerUser(userContext.getName(),userContext.getAffiliation());
|
||||
logger.info("uSecret : "+userSecret);
|
||||
userContext = caClientWrapper.enrollUser(userContext,userSecret);
|
||||
logger.info("userContext enrollement : "+userContext.getEnrollment());
|
||||
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
75
src/test/java/blockchain/query/ChaincodeTransactionTest.java
Normal file
75
src/test/java/blockchain/query/ChaincodeTransactionTest.java
Normal file
|
@ -0,0 +1,75 @@
|
|||
package blockchain.query;
|
||||
|
||||
import blockchain.client.ChannelClientWrapper;
|
||||
import blockchain.client.FabricClientWrapper;
|
||||
import blockchain.configuration.Config;
|
||||
import blockchain.user.UserContext;
|
||||
import blockchain.utility.Util;
|
||||
import org.apache.log4j.BasicConfigurator;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.hyperledger.fabric.sdk.*;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
//Test for transaction
|
||||
public class ChaincodeTransactionTest {
|
||||
private static Logger logger = Logger.getLogger(ChaincodeTransactionTest.class);
|
||||
@Test
|
||||
public void TestATransaction(){
|
||||
BasicConfigurator.configure();
|
||||
|
||||
//UserContext user = Util.readUserContext(Config.ORG1,"User-org1");
|
||||
UserContext user = Util.readUserContext(Config.ORG1,Config.ADMIN);
|
||||
|
||||
try{
|
||||
|
||||
String chaincode = Config.CHAINCODE_NAME;
|
||||
FabricClientWrapper fabricClientWrapper = new FabricClientWrapper(user);
|
||||
ChannelClientWrapper channelClientWrapper = fabricClientWrapper.createChannelClient(Config.CHANNEL_NAME);
|
||||
|
||||
Channel channel = channelClientWrapper.getChannel();
|
||||
//OLD PEER
|
||||
//Peer peer = fabricClientWrapper.getClient().newPeer(Config.ORG_PEER,Config.ORG_PEER_URL);
|
||||
//EventHub eventHub = fabricClientWrapper.getClient().newEventHub("eventhub01", Config.ORG_PEER_EVENT_URL);
|
||||
//Orderer orderer = fabricClientWrapper.getClient().newOrderer(Config.ORDERER_NAME,Config.ORDERER_URL);
|
||||
|
||||
Peer peer = fabricClientWrapper.getClient().newPeer(Config.ORG1_PEER_0,Config.ORG1_PEER_0_URL);
|
||||
EventHub eventHub = fabricClientWrapper.getClient().newEventHub("eventhub01", "grpc://vps577432.ovh.net:8053");
|
||||
Orderer orderer = fabricClientWrapper.getClient().newOrderer(Config.ORDERER_NAME,Config.ORDERER_URL);
|
||||
channel.addPeer(peer);
|
||||
channel.addEventHub(eventHub);
|
||||
channel.addOrderer(orderer);
|
||||
channel.initialize();
|
||||
|
||||
|
||||
|
||||
TransactionProposalRequest tpr = fabricClientWrapper.getClient().newTransactionProposalRequest();
|
||||
ChaincodeID cid = ChaincodeID.newBuilder().setName(Config.CHAINCODE_NAME).build();
|
||||
tpr.setChaincodeID(cid);
|
||||
tpr.setFcn("invoke");
|
||||
tpr.setArgs(new String[]{"a","b","20"}); //send 20 from a to b
|
||||
|
||||
Collection<ProposalResponse> responses = channel.sendTransactionProposal(tpr);
|
||||
List<ProposalResponse> invalid = responses.stream().filter(r -> r.isInvalid()).collect(Collectors.toList());
|
||||
|
||||
if (!invalid.isEmpty()) {
|
||||
invalid.forEach(response -> {
|
||||
logger.error(response.getMessage());
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
BlockEvent.TransactionEvent event = channel.sendTransaction(responses).get();
|
||||
logger.info("Event transaction id : "+event.getTransactionID()); //print transaction id
|
||||
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
62
src/test/java/blockchain/query/CreateChaincodeUserTest.java
Normal file
62
src/test/java/blockchain/query/CreateChaincodeUserTest.java
Normal file
|
@ -0,0 +1,62 @@
|
|||
package blockchain.query;
|
||||
|
||||
import blockchain.client.ChannelClientWrapper;
|
||||
import blockchain.client.FabricClientWrapper;
|
||||
import blockchain.configuration.Config;
|
||||
import blockchain.user.UserContext;
|
||||
import blockchain.utility.Util;
|
||||
import org.apache.log4j.BasicConfigurator;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.hyperledger.fabric.sdk.*;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
//Test to create user on chaincode -> don't work, can't use function "Init"
|
||||
public class CreateChaincodeUserTest {
|
||||
private static Logger logger = Logger.getLogger(QueryTest.class);
|
||||
|
||||
@Test
|
||||
public void TestCreateUser(){
|
||||
BasicConfigurator.configure();
|
||||
UserContext user = Util.readUserContext(Config.ORG1,Config.ADMIN);
|
||||
|
||||
try{
|
||||
String chaincode = Config.CHAINCODE_NAME;
|
||||
FabricClientWrapper fabricClientWrapper = new FabricClientWrapper(user);
|
||||
ChannelClientWrapper channelClientWrapper = fabricClientWrapper.createChannelClient(Config.CHANNEL_NAME);
|
||||
|
||||
Channel channel = channelClientWrapper.getChannel();
|
||||
//OLD
|
||||
//Peer peer = fabricClientWrapper.getClient().newPeer(Config.ORG_PEER,Config.ORG_PEER_URL);
|
||||
//EventHub eventHub = fabricClientWrapper.getClient().newEventHub("eventhub01", Config.ORG_PEER_EVENT_URL);
|
||||
//Orderer orderer = fabricClientWrapper.getClient().newOrderer(Config.ORDERER_NAME,Config.ORDERER_URL);
|
||||
|
||||
Peer peer = fabricClientWrapper.getClient().newPeer(Config.ORG1_PEER_0,Config.ORG1_PEER_0_URL);
|
||||
EventHub eventHub = fabricClientWrapper.getClient().newEventHub("eventhub01", "grpc://vps577432.ovh.net:8053");
|
||||
Orderer orderer = fabricClientWrapper.getClient().newOrderer(Config.ORDERER_NAME,Config.ORDERER_URL);
|
||||
|
||||
channel.addPeer(peer);
|
||||
channel.addEventHub(eventHub);
|
||||
channel.addOrderer(orderer);
|
||||
channel.initialize();
|
||||
|
||||
String[] args = {"user1","200","user2","180"};
|
||||
|
||||
Collection<ProposalResponse> responseQuery = channelClientWrapper.queryByChainCode(chaincode,"init",args);
|
||||
for(ProposalResponse pres : responseQuery){
|
||||
ChaincodeResponse.Status status = pres.getStatus();
|
||||
if(status.getStatus()!=200){
|
||||
throw new Exception(pres.getMessage());
|
||||
}
|
||||
String stringResponse = new String(pres.getChaincodeActionResponsePayload());
|
||||
logger.info("RESPONSE : "+stringResponse);
|
||||
}
|
||||
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
34
src/test/java/blockchain/query/QueryChannelTest.java
Normal file
34
src/test/java/blockchain/query/QueryChannelTest.java
Normal file
|
@ -0,0 +1,34 @@
|
|||
package blockchain.query;
|
||||
|
||||
import blockchain.client.FabricClientWrapper;
|
||||
import blockchain.configuration.Config;
|
||||
import blockchain.user.UserContext;
|
||||
import blockchain.utility.Util;
|
||||
import org.apache.log4j.BasicConfigurator;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.hyperledger.fabric.sdk.Peer;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
//Test to show channels on a node
|
||||
public class QueryChannelTest {
|
||||
private static Logger logger = Logger.getLogger(QueryTest.class);
|
||||
|
||||
@Test
|
||||
public void testQ(){
|
||||
BasicConfigurator.configure();
|
||||
UserContext userContext = Util.readUserContext(Config.ORG1,"User-org1");
|
||||
|
||||
try{
|
||||
FabricClientWrapper fabricClientWrapper = new FabricClientWrapper(userContext);
|
||||
Set<String> channels = fabricClientWrapper.queryForChannels();
|
||||
|
||||
logger.info("CHANNELS : "+channels);
|
||||
|
||||
}catch(Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
48
src/test/java/blockchain/query/QueryTest.java
Normal file
48
src/test/java/blockchain/query/QueryTest.java
Normal file
|
@ -0,0 +1,48 @@
|
|||
package blockchain.query;
|
||||
|
||||
import blockchain.client.ChannelClientWrapper;
|
||||
import blockchain.client.FabricClientWrapper;
|
||||
import blockchain.configuration.Config;
|
||||
import blockchain.user.UserContext;
|
||||
import blockchain.utility.Util;
|
||||
import org.apache.log4j.BasicConfigurator;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.hyperledger.fabric.sdk.*;
|
||||
import org.junit.Test;
|
||||
import java.util.Collection;
|
||||
|
||||
|
||||
//Test to get balance of a User
|
||||
public class QueryTest {
|
||||
private static Logger logger = Logger.getLogger(QueryTest.class);
|
||||
|
||||
@Test
|
||||
public void TestAQueryChannels() {
|
||||
BasicConfigurator.configure();
|
||||
|
||||
//UserContext user = Util.readUserContext(Config.ORG1,Config.ADMIN);
|
||||
UserContext user = Util.readUserContext(Config.ORG1,"User-org1");
|
||||
|
||||
try{
|
||||
String chaincode = Config.CHAINCODE_NAME;
|
||||
FabricClientWrapper fabricClientWrapper = new FabricClientWrapper(user);
|
||||
|
||||
ChannelClientWrapper channelClientWrapper = ChannelClientWrapper.setupChannel(fabricClientWrapper);
|
||||
|
||||
String[] args1 = {"a"};
|
||||
|
||||
Collection<ProposalResponse> responseQuery = channelClientWrapper.queryByChainCode(chaincode,"query",args1);
|
||||
for(ProposalResponse pres : responseQuery){
|
||||
ChaincodeResponse.Status status = pres.getStatus();
|
||||
if(status.getStatus()!=200){
|
||||
throw new Exception(pres.getMessage());
|
||||
}
|
||||
String stringResponse = new String(pres.getChaincodeActionResponsePayload());
|
||||
logger.info("RESPONSE : "+stringResponse);
|
||||
}
|
||||
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
18
src/test/java/blockchain/queryWrapper/QueryWrapperTest.java
Normal file
18
src/test/java/blockchain/queryWrapper/QueryWrapperTest.java
Normal file
|
@ -0,0 +1,18 @@
|
|||
package blockchain.queryWrapper;
|
||||
|
||||
import blockchain.query.QueryWrapper;
|
||||
import org.apache.log4j.BasicConfigurator;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.junit.Test;
|
||||
|
||||
public class QueryWrapperTest {
|
||||
private static Logger logger = Logger.getLogger(QueryWrapperTest.class);
|
||||
@Test
|
||||
public void TestGerUserBalance() {
|
||||
BasicConfigurator.configure();
|
||||
QueryWrapper queryWrapper = new QueryWrapper();
|
||||
String response = queryWrapper.getUserBalance("a");
|
||||
logger.info(response);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package blockchain.queryWrapper;
|
||||
|
||||
import blockchain.query.QueryWrapper;
|
||||
import blockchain.query.TransactionWrapper;
|
||||
import org.apache.log4j.BasicConfigurator;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.junit.Test;
|
||||
|
||||
public class TransactionWrapperTest {
|
||||
private static Logger logger = Logger.getLogger(TransactionWrapperTest.class);
|
||||
|
||||
@Test
|
||||
public void TestTransaction() {
|
||||
BasicConfigurator.configure();
|
||||
QueryWrapper queryWrapper = new QueryWrapper();
|
||||
TransactionWrapper transactionWrapper = new TransactionWrapper();
|
||||
String responseTransaction = transactionWrapper.sendTransaction("a","b","15"); //do transaction
|
||||
logger.info("TRANSACTION ID : "+responseTransaction);
|
||||
|
||||
String responseUserB = queryWrapper.getUserBalance("b"); //check new balance of user b
|
||||
logger.info("BALANCE USER B : "+responseUserB);
|
||||
|
||||
String responseUserA = queryWrapper.getUserBalance("a"); //check new balance of user a
|
||||
logger.info("BALANCE USER A :"+responseUserA);
|
||||
}
|
||||
}
|
21
src/test/java/blockchain/user/UserContextTest.java
Normal file
21
src/test/java/blockchain/user/UserContextTest.java
Normal file
|
@ -0,0 +1,21 @@
|
|||
package blockchain.user;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
//Test to create a User
|
||||
public class UserContextTest {
|
||||
@Test
|
||||
public void TestACreateUser(){
|
||||
UserContext userContext = new UserContext();
|
||||
userContext.setName("admin");
|
||||
userContext.setAffiliation("org1");
|
||||
userContext.setMspId("MspidOrg1");
|
||||
userContext.setEnrollment(null);
|
||||
|
||||
assertEquals("org1",userContext.getAffiliation());
|
||||
assertEquals("admin",userContext.getName());
|
||||
assertEquals(null,userContext.getEnrollment());
|
||||
}
|
||||
}
|
22
src/test/java/blockchain/utility/ReadUserTest.java
Normal file
22
src/test/java/blockchain/utility/ReadUserTest.java
Normal file
|
@ -0,0 +1,22 @@
|
|||
package blockchain.utility;
|
||||
|
||||
import blockchain.configuration.Config;
|
||||
import blockchain.user.UserContext;
|
||||
import org.junit.Test;
|
||||
|
||||
//Test to Read User
|
||||
public class ReadUserTest {
|
||||
@Test
|
||||
public void testReadUserOrg1(){
|
||||
try{
|
||||
UserContext userContext = Util.readUserContext(Config.ORG1, "User-org1");
|
||||
System.out.println(userContext.getAffiliation());
|
||||
System.out.println(userContext.getMspId());
|
||||
System.out.println(userContext.getEnrollment().getCert());
|
||||
System.out.println(userContext.getEnrollment().getKey());
|
||||
System.out.println(userContext.getName());
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
55
src/test/java/blockchain/utility/UtilTest.java
Normal file
55
src/test/java/blockchain/utility/UtilTest.java
Normal file
|
@ -0,0 +1,55 @@
|
|||
package blockchain.utility;
|
||||
|
||||
import blockchain.user.UserContext;
|
||||
import org.apache.log4j.BasicConfigurator;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.junit.FixMethodOrder;
|
||||
import org.junit.Test;
|
||||
import org.junit.runners.MethodSorters;
|
||||
|
||||
//Test to Read and Write user from files
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
public class UtilTest {
|
||||
private static Logger logger = Logger.getLogger(UtilTest.class);
|
||||
|
||||
@Test
|
||||
public void TestAReadNullUser(){
|
||||
BasicConfigurator.configure();
|
||||
|
||||
logger.info("----- START TEST READ NULL USER ----");
|
||||
UserContext uc = Util.readUserContext("tata","abdel");
|
||||
if(uc!=null){
|
||||
logger.info("UserContext is : "+uc.toString());
|
||||
}else{
|
||||
logger.info("UserContext doesn't exist");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void TestBWriteUser(){
|
||||
BasicConfigurator.configure();
|
||||
logger.info("----- START TEST WRITE NULL USER ----");
|
||||
UserContext user = new UserContext();
|
||||
user.setName("abdel");
|
||||
user.setAffiliation("toto");
|
||||
user.setEnrollment(null);
|
||||
user.setMspId("test");
|
||||
|
||||
Util.writeUserContext(user);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void TestCReadCreatedUser(){
|
||||
BasicConfigurator.configure();
|
||||
logger.info("----- START TEST READ CREATED USER ----");
|
||||
UserContext uc = Util.readUserContext("toto","abdel");
|
||||
if(uc!=null){
|
||||
logger.info("UserContext is : "+uc.toString());
|
||||
}else{
|
||||
logger.info("UserContext doesn't exist");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
BIN
target/classes/Application/App.class
Normal file
BIN
target/classes/Application/App.class
Normal file
Binary file not shown.
BIN
target/classes/blockchain/client/CAClientWrapper.class
Normal file
BIN
target/classes/blockchain/client/CAClientWrapper.class
Normal file
Binary file not shown.
BIN
target/classes/blockchain/client/ChannelClientWrapper.class
Normal file
BIN
target/classes/blockchain/client/ChannelClientWrapper.class
Normal file
Binary file not shown.
BIN
target/classes/blockchain/client/FabricClientWrapper.class
Normal file
BIN
target/classes/blockchain/client/FabricClientWrapper.class
Normal file
Binary file not shown.
BIN
target/classes/blockchain/configuration/Config.class
Normal file
BIN
target/classes/blockchain/configuration/Config.class
Normal file
Binary file not shown.
BIN
target/classes/blockchain/query/QueryWrapper.class
Normal file
BIN
target/classes/blockchain/query/QueryWrapper.class
Normal file
Binary file not shown.
BIN
target/classes/blockchain/query/TransactionWrapper.class
Normal file
BIN
target/classes/blockchain/query/TransactionWrapper.class
Normal file
Binary file not shown.
BIN
target/classes/blockchain/user/CAEnrollement.class
Normal file
BIN
target/classes/blockchain/user/CAEnrollement.class
Normal file
Binary file not shown.
BIN
target/classes/blockchain/user/UserContext.class
Normal file
BIN
target/classes/blockchain/user/UserContext.class
Normal file
Binary file not shown.
BIN
target/classes/blockchain/utility/Util.class
Normal file
BIN
target/classes/blockchain/utility/Util.class
Normal file
Binary file not shown.
BIN
target/classes/restService/WelcomeController.class
Normal file
BIN
target/classes/restService/WelcomeController.class
Normal file
Binary file not shown.
|
@ -0,0 +1,11 @@
|
|||
restService\WelcomeController.class
|
||||
blockchain\user\UserContext.class
|
||||
blockchain\client\CAClientWrapper.class
|
||||
blockchain\utility\Util.class
|
||||
blockchain\client\ChannelClientWrapper.class
|
||||
blockchain\user\CAEnrollement.class
|
||||
Application\App.class
|
||||
blockchain\configuration\Config.class
|
||||
blockchain\query\QueryWrapper.class
|
||||
blockchain\query\TransactionWrapper.class
|
||||
blockchain\client\FabricClientWrapper.class
|
|
@ -0,0 +1,11 @@
|
|||
B:\SCIENCES U\GroupProject\java-api\src\main\java\blockchain\client\ChannelClientWrapper.java
|
||||
B:\SCIENCES U\GroupProject\java-api\src\main\java\blockchain\client\FabricClientWrapper.java
|
||||
B:\SCIENCES U\GroupProject\java-api\src\main\java\blockchain\user\CAEnrollement.java
|
||||
B:\SCIENCES U\GroupProject\java-api\src\main\java\blockchain\client\CAClientWrapper.java
|
||||
B:\SCIENCES U\GroupProject\java-api\src\main\java\blockchain\query\QueryWrapper.java
|
||||
B:\SCIENCES U\GroupProject\java-api\src\main\java\restService\WelcomeController.java
|
||||
B:\SCIENCES U\GroupProject\java-api\src\main\java\Application\App.java
|
||||
B:\SCIENCES U\GroupProject\java-api\src\main\java\blockchain\configuration\Config.java
|
||||
B:\SCIENCES U\GroupProject\java-api\src\main\java\blockchain\query\TransactionWrapper.java
|
||||
B:\SCIENCES U\GroupProject\java-api\src\main\java\blockchain\user\UserContext.java
|
||||
B:\SCIENCES U\GroupProject\java-api\src\main\java\blockchain\utility\Util.java
|
|
@ -0,0 +1,11 @@
|
|||
blockchain\query\QueryTest.class
|
||||
blockchain\queryWrapper\QueryWrapperTest.class
|
||||
blockchain\query\QueryChannelTest.class
|
||||
blockchain\queryWrapper\TransactionWrapperTest.class
|
||||
blockchain\utility\UtilTest.class
|
||||
blockchain\client\TestEnrollAdmin.class
|
||||
blockchain\query\ChaincodeTransactionTest.class
|
||||
blockchain\utility\ReadUserTest.class
|
||||
blockchain\client\TestRegisterEnrollUser.class
|
||||
blockchain\query\CreateChaincodeUserTest.class
|
||||
blockchain\user\UserContextTest.class
|
|
@ -0,0 +1,11 @@
|
|||
B:\SCIENCES U\GroupProject\java-api\src\test\java\blockchain\client\TestRegisterEnrollUser.java
|
||||
B:\SCIENCES U\GroupProject\java-api\src\test\java\blockchain\query\QueryTest.java
|
||||
B:\SCIENCES U\GroupProject\java-api\src\test\java\blockchain\client\TestEnrollAdmin.java
|
||||
B:\SCIENCES U\GroupProject\java-api\src\test\java\blockchain\query\CreateChaincodeUserTest.java
|
||||
B:\SCIENCES U\GroupProject\java-api\src\test\java\blockchain\queryWrapper\TransactionWrapperTest.java
|
||||
B:\SCIENCES U\GroupProject\java-api\src\test\java\blockchain\utility\UtilTest.java
|
||||
B:\SCIENCES U\GroupProject\java-api\src\test\java\blockchain\query\QueryChannelTest.java
|
||||
B:\SCIENCES U\GroupProject\java-api\src\test\java\blockchain\query\ChaincodeTransactionTest.java
|
||||
B:\SCIENCES U\GroupProject\java-api\src\test\java\blockchain\utility\ReadUserTest.java
|
||||
B:\SCIENCES U\GroupProject\java-api\src\test\java\blockchain\queryWrapper\QueryWrapperTest.java
|
||||
B:\SCIENCES U\GroupProject\java-api\src\test\java\blockchain\user\UserContextTest.java
|
BIN
target/surefire/surefirebooter2244873732484001783.jar
Normal file
BIN
target/surefire/surefirebooter2244873732484001783.jar
Normal file
Binary file not shown.
BIN
target/test-classes/blockchain/client/TestEnrollAdmin.class
Normal file
BIN
target/test-classes/blockchain/client/TestEnrollAdmin.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
target/test-classes/blockchain/query/QueryChannelTest.class
Normal file
BIN
target/test-classes/blockchain/query/QueryChannelTest.class
Normal file
Binary file not shown.
BIN
target/test-classes/blockchain/query/QueryTest.class
Normal file
BIN
target/test-classes/blockchain/query/QueryTest.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
target/test-classes/blockchain/user/UserContextTest.class
Normal file
BIN
target/test-classes/blockchain/user/UserContextTest.class
Normal file
Binary file not shown.
BIN
target/test-classes/blockchain/utility/ReadUserTest.class
Normal file
BIN
target/test-classes/blockchain/utility/ReadUserTest.class
Normal file
Binary file not shown.
BIN
target/test-classes/blockchain/utility/UtilTest.class
Normal file
BIN
target/test-classes/blockchain/utility/UtilTest.class
Normal file
Binary file not shown.
Loading…
Reference in a new issue