Skip to content

Commit 0c840db

Browse files
committed
Remade initialization flow of client/Blockchain
Now admin deploy contracts from code. Reduced all JSON objects to fields in the clientData JSON, thus leading to only one file being saved
1 parent 1084fed commit 0c840db

File tree

4 files changed

+79
-140
lines changed

4 files changed

+79
-140
lines changed

src/main/java/com/brunoarruda/hyperdcpabe/Client.java

Lines changed: 44 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@
1515
import com.brunoarruda.hyperdcpabe.blockchain.BlockchainConnection;
1616
import com.brunoarruda.hyperdcpabe.Recording.FileMode;
1717
import com.brunoarruda.hyperdcpabe.io.FileController;
18+
import com.fasterxml.jackson.annotation.JsonProperty;
19+
import com.fasterxml.jackson.core.JsonParseException;
1820
import com.fasterxml.jackson.core.JsonProcessingException;
21+
import com.fasterxml.jackson.databind.JsonMappingException;
1922
import com.fasterxml.jackson.databind.JsonNode;
2023
import com.fasterxml.jackson.databind.node.ArrayNode;
2124
import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -86,6 +89,23 @@ public String toString() {
8689
private User user;
8790
private Certifier certifier;
8891

92+
private final Map<String, String> contractAddress;
93+
94+
@JsonProperty("Global Parameters")
95+
public GlobalParameters getGlobalParameters() {
96+
return gp;
97+
}
98+
99+
@JsonProperty("activeUserID")
100+
public String getUserID() {
101+
return user.getID();
102+
}
103+
104+
@JsonProperty("ContractAddress")
105+
public Map<String, String> getContractAddresses() {
106+
return contractAddress;
107+
}
108+
89109
private BlockchainConnection blockchain;
90110
private ServerConnection server;
91111
private static final String DATA_PATH = "data";
@@ -94,62 +114,41 @@ public String toString() {
94114

95115
public Client() {
96116
fc = FileController.getInstance().configure(DATA_PATH);
117+
this.server = new ServerConnection(SERVER_PORT);
97118
ObjectNode clientData = (ObjectNode) fc.loadAsJSON(getClientDirectory(), "clientData.json");
98119
if (clientData != null) {
120+
gp = fc.readFromDir(fc.getDataDirectory(), "clientData.json", "globalParameters", GlobalParameters.class);
121+
contractAddress = fc.readAsMap(fc.getDataDirectory(), "clientData.json", "contractAddress", String.class, String.class);
122+
loadUserData(clientData.get("currentUserID").asText());
123+
this.blockchain.loadContracts(user.getCredentials());
99124
String networkURL = clientData.get("networkURL").asText();
100-
if (networkURL.equals("null")) {
101-
throw new RuntimeException(
102-
"Execute o comando --init informando o endereço de rede" + " para conexão com a blockchain");
103-
}
104-
String contractAuthorityAddress = clientData.get("contractAuthorityAddress").asText();
105-
String contractFilesAddress = clientData.get("contractFilesAddress").asText();
106-
String contractKeysAddress = clientData.get("contractKeysAddress").asText();
107-
String contractRequestsAddress = clientData.get("contractRequestsAddress").asText();
108-
String contractUsersAddress = clientData.get("contractUsersAddress").asText();
109-
this.blockchain = new BlockchainConnection(networkURL, contractAuthorityAddress, contractFilesAddress,
110-
contractKeysAddress, contractRequestsAddress, contractUsersAddress);
111-
loadUserData(clientData.get("userID").asText());
125+
this.blockchain = new BlockchainConnection(networkURL, contractAddress);
126+
112127
fc.writeToDir(getClientDirectory(), "clientData.json", clientData);
113128
} else {
114129
throw new RuntimeException(
115-
"Execute o comando --init informando o endereço de rede para conexão com a blockchain");
130+
"Execute o comando --init com o endereço para a Blockchain e o endereço do contrato Root.");
116131
}
117-
this.server = new ServerConnection(SERVER_PORT);
118-
gp = fc.readFromDir(fc.getDataDirectory(), "globalParameters.json", GlobalParameters.class);
119132
}
120133

121-
public Client(String url) {
122-
this(url, null, null, null, null, null);
123-
}
124-
125-
public Client(String networkURL, String contractAuthorityAddress, String contractFilesAddress,
126-
String contractKeysAddress, String contractRequestsAddress, String contractUsersAddress) {
127-
fc = FileController.getInstance();
128-
this.blockchain = new BlockchainConnection(networkURL, contractAuthorityAddress, contractFilesAddress,
129-
contractKeysAddress, contractRequestsAddress, contractUsersAddress);
130-
ObjectNode clientData = (ObjectNode) fc.loadAsJSON(getClientDirectory(), "clientData.json");
131-
if (clientData != null && clientData.get("userID") != null) {
132-
loadUserData(clientData.get("userID").asText());
133-
} else if (clientData == null) {
134-
clientData = (ObjectNode) fc.getMapper().createObjectNode();
135-
}
136-
loadAttributes();
134+
public Client(String networkURL, String adminName, String adminEmail, String adminPrivateKey) {
135+
fc = FileController.getInstance().configure(DATA_PATH);
136+
this.server = new ServerConnection(SERVER_PORT);
137+
this.blockchain = new BlockchainConnection(networkURL);
137138
gp = DCPABE.globalSetup(160);
138-
fc.writeToDir(fc.getDataDirectory(), "globalParameters.json", gp);
139-
// UGLY: refactor contract configuration
140-
clientData.put("networkURL", networkURL);
141-
clientData.put("contractAuthorityAddress", contractAuthorityAddress);
142-
clientData.put("contractFilesAddress", contractFilesAddress);
143-
clientData.put("contractKeysAddress", contractKeysAddress);
144-
clientData.put("contractRequestsAddress", contractRequestsAddress);
145-
clientData.put("contractUsersAddress", contractUsersAddress);
139+
contractAddress = deployContracts(adminName, adminEmail, adminPrivateKey);
140+
ObjectNode gpJSON = fc.getMapper().convertValue(gp, ObjectNode.class);
141+
ObjectNode addressJSON = fc.getMapper().convertValue(contractAddress, ObjectNode.class);
142+
ObjectNode clientData = fc.getMapper().createObjectNode();
143+
clientData.put("currentUserID", "");
144+
clientData.set("globalParameters", gpJSON);
145+
clientData.set("contractAddress", addressJSON);
146146
fc.writeToDir(getClientDirectory(), "clientData.json", clientData);
147-
this.server = new ServerConnection(SERVER_PORT);
148147
}
149148

150149
public void changeUser(String userID) {
151150
ObjectNode clientData = (ObjectNode) fc.loadAsJSON(getClientDirectory(), "clientData.json");
152-
clientData.put("userID", userID);
151+
clientData.put("currentUserID", userID);
153152
fc.writeToDir(getClientDirectory(), "clientData.json", clientData);
154153
loadUserData(userID);
155154
}
@@ -162,16 +161,10 @@ public void createUser(String name, String email, String privateKey) {
162161
this.blockchain.loadContracts(user.getCredentials());
163162
}
164163

165-
public void deployContract(String userID) {
166-
String path = getClientDirectory() + userID;
167-
user = fc.readFromDir(path, "user.json", User.class);
168-
certifier = fc.readFromDir(path, "Certifier.json", Certifier.class);
169-
user.setRecordings(fc.readAsList(path, "recordings.json", Recording.class));
170-
PersonalKeysJSON ABEKeys = fc.readFromDir(path, "personalKeys.json", PersonalKeysJSON.class);
171-
if (ABEKeys != null) {
172-
user.setABEKeys(ABEKeys);
173-
}
174-
this.blockchain.deployContracts(user.getCredentials());
164+
public Map<String, String> deployContracts(String name, String email, String privateKey) {
165+
ECKey keys = this.blockchain.generateECKeys(privateKey);
166+
user = new User(name, email, keys);
167+
return this.blockchain.deployContracts(user.getCredentials());
175168
}
176169

177170
private String getClientDirectory() {
@@ -335,7 +328,6 @@ public void loadUserData(String userID) {
335328
user.setABEKeys(ABEKeys);
336329
}
337330

338-
this.blockchain.loadContracts(user.getCredentials());
339331
System.out.println("Client - user data loaded: " + userID);
340332
}
341333

src/main/java/com/brunoarruda/hyperdcpabe/CommandLine.java

Lines changed: 27 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import java.util.Scanner;
1212

1313
import com.brunoarruda.hyperdcpabe.Client.RequestStatus;
14-
import com.brunoarruda.hyperdcpabe.io.FileController;
1514

1615
/**
1716
* CommandLine
@@ -22,7 +21,6 @@ public class CommandLine {
2221
private static final int BUFFER_SIZE = 1024;
2322
private static Client client;
2423
private static Scanner sc;
25-
private static Map<String, String> contractAddress = new Hashtable<>();
2624

2725
static {
2826
populateCommands();
@@ -50,7 +48,6 @@ private static void populateCommands() {
5048
COMMAND_ALIAS.put("-ga", "--get-attributes");
5149
COMMAND_ALIAS.put("-gr", "--get-recordings");
5250
COMMAND_ALIAS.put("-p", "--publish");
53-
COMMAND_ALIAS.put("-o", "--deploy");
5451

5552
// integrated blockchain / server commands
5653
COMMAND_ALIAS.put("-s", "--send");
@@ -62,58 +59,31 @@ private static void populateCommands() {
6259

6360
public static void main(String[] args) {
6461
// TODO: allow multi input on main, if no args provided
62+
6563
if (args.length == 0) {
6664
System.out.println("Nenhum comando executado");
6765
return;
6866
}
69-
switch (args[0]) {
70-
case "-m":
71-
case "--milestone":
72-
milestone(args);
73-
break;
74-
case "-h":
75-
case "--help":
76-
help(args);
77-
break;
78-
default:
79-
if (client == null && !(args[0].equals("--init") || args[0].equals("-i"))) {
80-
client = new Client();
81-
}
82-
runCommand(args);
83-
break;
67+
if (args[0].equals("-m") || args[0].equals("--milestone")) {
68+
milestone(args);
69+
} else if ((args[0].equals("-i") || args[0].equals("--init"))){
70+
init(args);
71+
} else {
72+
runCommand(args);
8473
}
8574
}
8675

87-
// system commands
8876
public static void init(String[] args) {
89-
String contractAuthorityAddress = null;
90-
String contractFilesAddress = null;
91-
String contractKeysAddress = null;
92-
String contractRequestsAddress = null;
93-
String contractUsersAddress = null;
94-
String networkURL = null;
95-
FileController fc = FileController.getInstance().configure(Client.getDataPath());
96-
contractAddress = fc.readAsMap(fc.getDataDirectory(), "contractAddresses.json", String.class, String.class);
97-
if (args.length == 7) {
98-
networkURL = args[1];
99-
contractAuthorityAddress = args[2];
100-
contractFilesAddress = args[3];
101-
contractKeysAddress = args[4];
102-
contractRequestsAddress = args[5];
103-
contractUsersAddress = args[6];
104-
} else if (contractAddress.size() >= 5) {
105-
System.out.println("Utilizando os contratos informados na última execução do programa.");
106-
networkURL = "HTTP://127.0.0.1:7545";
107-
contractAuthorityAddress = contractAddress.get("Authority");
108-
contractFilesAddress = contractAddress.get("Files");
109-
contractKeysAddress = contractAddress.get("Keys");
110-
contractRequestsAddress = contractAddress.get("Requests");
111-
contractUsersAddress = contractAddress.get("Users");
112-
} else {
113-
throw new RuntimeException("Did not found all contract addresses necessary for code execution");
77+
String networkURL = "http://127.0.0.1:7545";
78+
int index = 1;
79+
if (args.length == 5) {
80+
networkURL = args[index];
81+
index = 2;
11482
}
115-
client = new Client(networkURL, contractAuthorityAddress, contractFilesAddress,
116-
contractKeysAddress, contractRequestsAddress, contractUsersAddress);
83+
String adminName = args[index];
84+
String adminEmail = args[index + 1];
85+
String adminPrivateKey = args[index + 2];
86+
client = new Client(networkURL, adminName, adminEmail, adminPrivateKey);
11787
}
11888

11989
// user commands
@@ -203,10 +173,6 @@ public static void publish(String[] args){
203173
}
204174
}
205175

206-
public static void deploy(String[] args){
207-
client.deployContract(args[1]);
208-
}
209-
210176
// integrated blockchain / server commands
211177
public static void send(String[] args){
212178
if (args[1].equals("attributes")) {
@@ -245,14 +211,11 @@ public static void help(String[] args){
245211
}
246212

247213
public static void runCommand(String[] args) {
214+
client = new Client();
248215
switch (args[0]) {
249-
case "-o":
250-
case "--deploy":
251-
deploy(args);
252-
break;
253-
case "-i":
254-
case "--init":
255-
init(args);
216+
case "-h":
217+
case "--help":
218+
help(args);
256219
break;
257220
case "-l":
258221
case "--load":
@@ -306,6 +269,8 @@ public static void runCommand(String[] args) {
306269
case "--decrypt":
307270
client.decrypt(args[1]);
308271
break;
272+
default:
273+
System.out.println("Comando não reconhecido: " + String.join(" ", args));
309274
}
310275
}
311276

@@ -322,7 +287,11 @@ public static void runMilestone(int[] choice) {
322287
String path = "data\\client\\Alice-0xb038476875480BCE0D0FCf0991B4BB108A3FCB47\\";
323288
new File(path).mkdirs();
324289
getFileFromResources(path, "test\\lorem_ipsum.md");
325-
runCommand("--init".split(" "));
290+
291+
// admin inicia o sistema e cria os contratos
292+
args = "--init http://127.0.0.1:7545 admin [email protected] ";
293+
args = args + "e4d8c81796894ea5bf202e3a3204948dddd62f4d709c278bf8096898957be241";
294+
init(args.split(" "));
326295

327296
// certificador cria perfil e atributo, e os publica
328297
args = "--create-user CRM [email protected] ";

src/main/java/com/brunoarruda/hyperdcpabe/blockchain/BlockchainConnection.java

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -70,33 +70,22 @@ public void setDataPath(String dataPath) {
7070
}
7171

7272
public BlockchainConnection(String networkURL) {
73-
this.networkURL = networkURL;
74-
contractAddress = new HashMap<String, String>();
75-
web3j = Web3j.build(new HttpService(networkURL));
76-
fc = FileController.getInstance();
77-
dgp = new DefaultGasProvider();
73+
this(networkURL, null);
7874
}
7975

8076
// TODO: refactor URL as a POM field or command line/file config
8177
// POM field seems better, as it would allow different value for deploy/test
8278
// cycles
83-
public BlockchainConnection(String networkURL, String contractAuthorityAddress, String contractFilesAddress,
84-
String contractKeysAddress, String contractRequestsAddress, String contractUsersAddress) {
79+
public BlockchainConnection(String networkURL, Map<String, String> contractAddress) {
8580
this.networkURL = networkURL;
8681
contractAddress = new HashMap<String, String>();
8782
web3j = Web3j.build(new HttpService(networkURL));
8883
fc = FileController.getInstance();
8984
dgp = new DefaultGasProvider();
85+
this.contractAddress = contractAddress;
86+
}
9087

91-
contractAddress.put("Authority", contractAuthorityAddress);
92-
contractAddress.put("Files", contractFilesAddress);
93-
contractAddress.put("Keys", contractKeysAddress);
94-
contractAddress.put("Requests", contractRequestsAddress);
95-
contractAddress.put("Users", contractUsersAddress);
96-
}
97-
98-
99-
public BlockchainConnection deployContracts(Credentials credentials) {
88+
public Map<String, String> deployContracts(Credentials credentials) {
10089
try {
10190
SmartDCPABERoot contractRoot = SmartDCPABERoot.deploy(web3j, credentials, dgp).send();
10291
String rootAddress = contractRoot.getContractAddress();
@@ -116,14 +105,14 @@ public BlockchainConnection deployContracts(Credentials credentials) {
116105
contractAddress.put("Users", scUsers.getContractAddress());
117106
contractAddress.put("Utility", scUtility.getContractAddress());
118107

119-
List<String> contractAddresses = Arrays.asList(contractAddress.values().toArray(new String[0]));
108+
List<String> addressList = Arrays.asList(contractAddress.values().toArray(new String[0]));
120109
List<BigInteger> indexes = new ArrayList<BigInteger>();
121110
Arrays.asList(0, 1, 2, 3, 4, 5).forEach(val -> indexes.add(BigInteger.valueOf(val)));
122-
scRoot.setAllContracts(indexes, contractAddresses).send();
111+
scRoot.setAllContracts(indexes, addressList).send();
123112
} catch (Exception e) {
124113
e.printStackTrace();
125114
}
126-
return this;
115+
return contractAddress;
127116
}
128117

129118
public BlockchainConnection loadContracts(Credentials credentials) {

src/test/java/utils/StubBlockChain.java

Lines changed: 0 additions & 11 deletions
This file was deleted.

0 commit comments

Comments
 (0)