Commit 7c3d0000 authored by 0Tyler's avatar 0Tyler

Quorum Contract

parent f2953c88
This diff is collapsed.
...@@ -18,19 +18,19 @@ public class DocumentService { ...@@ -18,19 +18,19 @@ public class DocumentService {
public Optional<Document> add(MultipartFile file) { public Optional<Document> add(MultipartFile file) {
return Optional.of(Document.builder() return Optional.of(Document.builder()
.fileName(file.getOriginalFilename()) .fileName(file.getOriginalFilename())
.fileType(file.getContentType()) .fileType(file.getContentType())
.bytes(getBytes(file)) .bytes(getBytes(file))
.build()) .build())
.map(document->documentRepository.save(document)); .map(document -> documentRepository.save(document));
} }
public Optional<Document> readFile(Long id){ public Optional<Document> readFile(Long id) {
return documentRepository.findById(id); return documentRepository.findById(id);
} }
private byte[] getBytes(MultipartFile file) { private byte[] getBytes(MultipartFile file) {
try{ try {
return file.getBytes(); return file.getBytes();
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
......
server.port=8081 server.port=8081
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.hikari.data-source-properties.useUnicode=true
spring.datasource.hikari.data-source-properties.characterEncoding=UTF-8
spring.h2.console.enabled=true
spring.jpa.hibernate.ddl-auto=update spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=true spring.jpa.generate-ddl=true
......
//package edu.prlab.tyler.iotgateway.contract.common; package edu.prlab.tyler.iotgateway.contract.common;
//
//import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
//import lombok.Builder; import lombok.Builder;
//import lombok.Data; import lombok.Data;
//import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
//import org.web3j.quorum.Quorum; import org.web3j.quorum.Quorum;
//import org.web3j.tx.ClientTransactionManager; import org.web3j.tx.ClientTransactionManager;
//import org.web3j.tx.gas.ContractGasProvider; import org.web3j.tx.gas.ContractGasProvider;
//
//@Data @Data
//@Builder @Builder
//@NoArgsConstructor @NoArgsConstructor
//@AllArgsConstructor @AllArgsConstructor
//public class QuorumContractReference { public class QuorumContractReference {
// private Quorum quorum; private String address;
// private ContractGasProvider provider; private Quorum quorum;
// private ClientTransactionManager manager; private ContractGasProvider provider;
//} private ClientTransactionManager manager;
}
//package edu.prlab.tyler.iotgateway.contract.common; package edu.prlab.tyler.iotgateway.contract.common;
//
//import org.web3j.quorum.Quorum; import edu.prlab.tyler.iotgateway.contract.DeviceContract;
//import org.web3j.tx.ClientTransactionManager; import org.web3j.protocol.http.HttpService;
//import org.web3j.tx.gas.ContractGasProvider; import org.web3j.quorum.Quorum;
//import org.web3j.tx.gas.DefaultGasProvider; import org.web3j.tx.ClientTransactionManager;
//import org.web3j.tx.gas.StaticGasProvider; import org.web3j.tx.gas.ContractGasProvider;
// import org.web3j.tx.gas.DefaultGasProvider;
//import java.math.BigInteger; import org.web3j.tx.gas.StaticGasProvider;
//import java.util.Optional;
// import java.math.BigInteger;
//public abstract class QuorumContractService<Data, Contract extends org.web3j.tx.Contract> { import java.util.Optional;
// private static final String rpcUrl = "http://localhost:22000";
// public abstract class QuorumContractService<Data, Contract extends org.web3j.tx.Contract> {
// private static final ContractGasProvider DEFAULT_GAS_PROVIDER = new StaticGasProvider( private static final String rpcUrl = "http://localhost:22000";
// BigInteger.ZERO,
// DefaultGasProvider.GAS_LIMIT private static final ContractGasProvider DEFAULT_GAS_PROVIDER = new StaticGasProvider(
// ); BigInteger.ZERO,
// DefaultGasProvider.GAS_LIMIT
// Quorum quorum; );
// ContractGasProvider provider;
// ClientTransactionManager manager; Quorum quorum;
// ContractGasProvider provider;
// public QuorumContractService(Quorum quorum, ContractGasProvider provider, ClientTransactionManager manager) { ClientTransactionManager manager;
// this.quorum = quorum;
// this.provider = provider; public QuorumContractService(Quorum quorum, ContractGasProvider provider, ClientTransactionManager manager) {
// this.manager = manager; this.quorum = quorum;
// } this.provider = provider;
// this.manager = manager;
// //部屬合約 }
//
// protected Optional<Contract> deploy(QuorumContractReference reference) { //部屬合約
// return null; protected Optional<Contract> deploy() {
// } return Optional.ofNullable(Quorum.build(new HttpService(rpcUrl)))
// .flatMap(this::buildManagerAndMap)
// protected Optional<Contract> load() { .map(this::deployContract)
// .filter(QuorumContractUtil::isContractValid);
// } }
// //載入合約
//} //以帳戶第0個建立TransactionManager
protected Optional<QuorumContractReference> buildManagerAndMap(Quorum quorum) {
try {
return Optional.ofNullable(new ClientTransactionManager(quorum, quorum.ethAccounts().send().getAccounts().get(0)))
.map(this::prepare);
} catch (Exception e) {
System.out.println("Cannot find quorum manager");
}
return Optional.empty();
}
//建立合約所需要的參數
protected QuorumContractReference prepare(ClientTransactionManager manager) {
return QuorumContractReference.builder()
.quorum(quorum)
.provider(DEFAULT_GAS_PROVIDER)
.manager(manager)
.build();
}
//部屬合約的子類別實作
protected Contract deployContract(QuorumContractReference reference) {
return null;
}
//載入合約
protected Contract loadContract(QuorumContractReference reference) {
return null;
}
//載入該合約資料
protected Data loadData(Contract deviceContract) {
return null;
}
}
//package edu.prlab.tyler.iotgateway.contract.common; package edu.prlab.tyler.iotgateway.contract.common;
//
//public class QuorumContractUtil {
// import org.web3j.protocol.core.RemoteCall;
// //合約呼叫函式 import org.web3j.tx.Contract;
// public static
// //呼叫 import java.lang.reflect.Method;
//
// //驗證合約有效性 public class QuorumContractUtil {
// private QuorumContractUtil() {
// }
//}
//合約呼叫函式
public static <Return> Return call(Contract contract, String function, Object... parameters) {
try {
Class[] classes = new Class[parameters.length];
for (int i = 0; i < parameters.length; i++) {
classes[i] = parameters[i].getClass();
}
Method method = contract.getClass().getMethod(function, classes);
RemoteCall<Return> remoteCall = (RemoteCall<Return>) method.invoke(contract, parameters);
return remoteCall.send();
} catch (Exception e) {
//do nothing
System.out.println("Remote call Cannot find method");
}
return null;
}
//呼叫
public static <Return> Return call(RemoteCall<Return> remoteCall){
try {
return remoteCall.send();
} catch (Exception e) {
System.out.println("call error");
}
return null;
}
//驗證合約有效性
public static boolean isContractValid(Contract contract) {
return contract != null &&
contract.getContractAddress() != null &&
!contract.getContractAddress().isEmpty();
}
}
...@@ -81,7 +81,7 @@ public class ContractTester { ...@@ -81,7 +81,7 @@ public class ContractTester {
@Test @Test
public void test2Contract() throws Exception { public void test2Contract() throws Exception {
Quorum quorum = Quorum.build(new HttpService(rpcUrl)); Quorum quorum = Quorum.build(new HttpService(rpcUrl));
String userAddress = quorum.ethAccounts().send().getAccounts().get(quorum.ethAccounts().send().getAccounts().size() - 1); String userAddress = quorum.ethAccounts().send().getAccounts().get(0);
Assert.assertNotNull(userAddress); Assert.assertNotNull(userAddress);
ClientTransactionManager manager = new ClientTransactionManager(quorum, userAddress); ClientTransactionManager manager = new ClientTransactionManager(quorum, userAddress);
......
...@@ -3,6 +3,7 @@ buildscript { ...@@ -3,6 +3,7 @@ buildscript {
springBootVersion = '2.1.4.RELEASE' springBootVersion = '2.1.4.RELEASE'
mapstructVersion = '1.3.0.Final' mapstructVersion = '1.3.0.Final'
guavaVersion = '27.1-jre' guavaVersion = '27.1-jre'
web3jQuorumVersion = '4.0.6'
} }
repositories { repositories {
mavenCentral() mavenCentral()
...@@ -36,6 +37,7 @@ dependencies { ...@@ -36,6 +37,7 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-web'
implementation "org.mapstruct:mapstruct:${mapstructVersion}" implementation "org.mapstruct:mapstruct:${mapstructVersion}"
implementation "com.google.guava:guava:${guavaVersion}" implementation "com.google.guava:guava:${guavaVersion}"
implementation "org.web3j:quorum:${web3jQuorumVersion}"
implementation project(":cloud") implementation project(":cloud")
compileOnly 'org.projectlombok:lombok' compileOnly 'org.projectlombok:lombok'
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
</td> </td>
<td> <td>
<div class="infoBox" id="duration"> <div class="infoBox" id="duration">
<div class="counter">0.718s</div> <div class="counter">0.770s</div>
<p>duration</p> <p>duration</p>
</div> </div>
</td> </td>
...@@ -85,7 +85,7 @@ ...@@ -85,7 +85,7 @@
<td>2</td> <td>2</td>
<td>0</td> <td>0</td>
<td>0</td> <td>0</td>
<td>0.718s</td> <td>0.770s</td>
<td class="success">100%</td> <td class="success">100%</td>
</tr> </tr>
</tbody> </tbody>
...@@ -111,7 +111,7 @@ ...@@ -111,7 +111,7 @@
<td>1</td> <td>1</td>
<td>0</td> <td>0</td>
<td>0</td> <td>0</td>
<td>0.031s</td> <td>0.030s</td>
<td class="success">100%</td> <td class="success">100%</td>
</tr> </tr>
<tr> <tr>
...@@ -120,7 +120,7 @@ ...@@ -120,7 +120,7 @@
<td>1</td> <td>1</td>
<td>0</td> <td>0</td>
<td>0</td> <td>0</td>
<td>0.687s</td> <td>0.740s</td>
<td class="success">100%</td> <td class="success">100%</td>
</tr> </tr>
</tbody> </tbody>
...@@ -134,7 +134,7 @@ ...@@ -134,7 +134,7 @@
<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/> <input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
</label> </label>
</div>Generated by </div>Generated by
<a href="http://www.gradle.org">Gradle 4.10.3</a> at 2019/6/10 下午 04:21:19</p> <a href="http://www.gradle.org">Gradle 4.10.3</a> at 2019/6/11 下午 02:55:41</p>
</div> </div>
</div> </div>
</body> </body>
......
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
</td> </td>
<td> <td>
<div class="infoBox" id="duration"> <div class="infoBox" id="duration">
<div class="counter">0.718s</div> <div class="counter">0.770s</div>
<p>duration</p> <p>duration</p>
</div> </div>
</td> </td>
...@@ -83,7 +83,7 @@ ...@@ -83,7 +83,7 @@
<td>1</td> <td>1</td>
<td>0</td> <td>0</td>
<td>0</td> <td>0</td>
<td>0.031s</td> <td>0.030s</td>
<td class="success">100%</td> <td class="success">100%</td>
</tr> </tr>
<tr> <tr>
...@@ -93,7 +93,7 @@ ...@@ -93,7 +93,7 @@
<td>1</td> <td>1</td>
<td>0</td> <td>0</td>
<td>0</td> <td>0</td>
<td>0.687s</td> <td>0.740s</td>
<td class="success">100%</td> <td class="success">100%</td>
</tr> </tr>
</table> </table>
...@@ -106,7 +106,7 @@ ...@@ -106,7 +106,7 @@
<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/> <input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
</label> </label>
</div>Generated by </div>Generated by
<a href="http://www.gradle.org">Gradle 4.10.3</a> at 2019/6/10 下午 04:21:19</p> <a href="http://www.gradle.org">Gradle 4.10.3</a> at 2019/6/11 下午 02:55:41</p>
</div> </div>
</div> </div>
</body> </body>
......
Manifest-Version: 1.0 Manifest-Version: 1.0
Start-Class: edu.prlab.tyler.iotgateway.gateway.GatewayApplication Start-Class: edu.prlab.tyler.iotgateway.gateway.GatewayApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.1.4.RELEASE
Main-Class: org.springframework.boot.loader.PropertiesLauncher Main-Class: org.springframework.boot.loader.PropertiesLauncher
...@@ -46,7 +46,6 @@ public class GatewayController { ...@@ -46,7 +46,6 @@ public class GatewayController {
.orElseGet(() -> ResponseEntity.noContent().build()); .orElseGet(() -> ResponseEntity.noContent().build());
} }
//透過裝置UDN取得裝置資訊與隱私政策 //透過裝置UDN取得裝置資訊與隱私政策
@GetMapping("/privacy/{udn}/{account}") @GetMapping("/privacy/{udn}/{account}")
public ResponseEntity<PrivacyPolicyReportResponse> readPrivacyPolicyReportByDevice(@PathVariable String udn, @PathVariable String account) { public ResponseEntity<PrivacyPolicyReportResponse> readPrivacyPolicyReportByDevice(@PathVariable String udn, @PathVariable String account) {
...@@ -72,4 +71,4 @@ public class GatewayController { ...@@ -72,4 +71,4 @@ public class GatewayController {
.orElseGet(() -> ResponseEntity.noContent().build()); .orElseGet(() -> ResponseEntity.noContent().build());
} }
} }
\ No newline at end of file
package edu.prlab.tyler.iotgateway.gateway.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DeviceContractInfoMessage {
String ownerAddress;
String deviceInfo ;
String privacyPolicy;
String bindAddress;
}
package edu.prlab.tyler.iotgateway.gateway.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigInteger;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GatewayContractInfoMessage {
BigInteger numDevices;
Iterable<String> devices;
}
\ No newline at end of file
package edu.prlab.tyler.iotgateway.gateway.pojo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class DeviceContractIndex {
String address;
String udn;
}
package edu.prlab.tyler.iotgateway.gateway.pojo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class GatewayContractIndex {
String address;
String account;
}
package edu.prlab.tyler.iotgateway.gateway.services;
import edu.prlab.tyler.iotgateway.contract.DeviceContract;
import edu.prlab.tyler.iotgateway.contract.common.QuorumContractReference;
import edu.prlab.tyler.iotgateway.contract.common.QuorumContractService;
import edu.prlab.tyler.iotgateway.contract.common.QuorumContractUtil;
import edu.prlab.tyler.iotgateway.gateway.model.DeviceContractInfoMessage;
import org.web3j.quorum.Quorum;
import org.web3j.tx.ClientTransactionManager;
import org.web3j.tx.gas.ContractGasProvider;
public class DeviceContractService extends QuorumContractService<DeviceContractInfoMessage, DeviceContract> {
public DeviceContractService(Quorum quorum, ContractGasProvider provider, ClientTransactionManager manager) {
super(quorum, provider, manager);
}
@Override
protected DeviceContract loadContract(QuorumContractReference reference) {
return DeviceContract.load(reference.getAddress(), reference.getQuorum(), reference.getManager(), reference.getProvider());
}
@Override
protected DeviceContractInfoMessage loadData(DeviceContract deviceContract) {
return DeviceContractInfoMessage.builder()
.ownerAddress(QuorumContractUtil.call(deviceContract.owner()))
.deviceInfo(QuorumContractUtil.call(deviceContract.deviceInfo()))
.privacyPolicy(QuorumContractUtil.call(deviceContract.privacypolicy()))
.bindAddress(QuorumContractUtil.call(deviceContract.binded()))
.build();
}
@Override
protected DeviceContract deployContract(QuorumContractReference reference) {
try {
return DeviceContract.deploy(reference.getQuorum(), reference.getManager(), reference.getProvider()).send();
} catch (Exception e) {
System.out.println("Cannot deploy device contract.");
}
return null;
}
}
package edu.prlab.tyler.iotgateway.gateway.services;
import edu.prlab.tyler.iotgateway.contract.GatewayContract;
import edu.prlab.tyler.iotgateway.contract.common.QuorumContractReference;
import edu.prlab.tyler.iotgateway.contract.common.QuorumContractService;
import edu.prlab.tyler.iotgateway.contract.common.QuorumContractUtil;
import edu.prlab.tyler.iotgateway.gateway.model.GatewayContractInfoMessage;
import org.web3j.quorum.Quorum;
import org.web3j.tx.ClientTransactionManager;
import org.web3j.tx.gas.ContractGasProvider;
import java.math.BigInteger;
import java.util.stream.IntStream;
public class GatewayContractService extends QuorumContractService<GatewayContractInfoMessage, GatewayContract> {
public GatewayContractService(Quorum quorum, ContractGasProvider provider, ClientTransactionManager manager) {
super(quorum, provider, manager);
}
@Override
protected GatewayContract loadContract(QuorumContractReference reference) {
return GatewayContract.load(reference.getAddress(), reference.getQuorum(), reference.getManager(), reference.getProvider());
}
@Override
protected GatewayContractInfoMessage loadData(GatewayContract gatewayContract) {
BigInteger numDevices = QuorumContractUtil.call(gatewayContract.numDevices());
return GatewayContractInfoMessage.builder()
.numDevices(numDevices)
.devices(() -> IntStream.range(0, numDevices.intValue())
.mapToObj(i -> QuorumContractUtil.call(gatewayContract.getDeviceAddress(BigInteger.valueOf(i))))
.iterator())
.build();
}
@Override
protected GatewayContract deployContract(QuorumContractReference reference) {
try {
return GatewayContract.deploy(reference.getQuorum(), reference.getManager(), reference.getProvider()).send();
} catch (Exception e) {
System.out.println("Cannot deploy gateway contract.");
}
return null;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment