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

Quorum Contract

parent f2953c88
This diff is collapsed.
......@@ -22,15 +22,15 @@ public class DocumentService {
.fileType(file.getContentType())
.bytes(getBytes(file))
.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);
}
private byte[] getBytes(MultipartFile file) {
try{
try {
return file.getBytes();
} catch (IOException e) {
throw new RuntimeException(e);
......
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.generate-ddl=true
......
//package edu.prlab.tyler.iotgateway.contract.common;
//
//import lombok.AllArgsConstructor;
//import lombok.Builder;
//import lombok.Data;
//import lombok.NoArgsConstructor;
//import org.web3j.quorum.Quorum;
//import org.web3j.tx.ClientTransactionManager;
//import org.web3j.tx.gas.ContractGasProvider;
//
//@Data
//@Builder
//@NoArgsConstructor
//@AllArgsConstructor
//public class QuorumContractReference {
// private Quorum quorum;
// private ContractGasProvider provider;
// private ClientTransactionManager manager;
//}
package edu.prlab.tyler.iotgateway.contract.common;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.web3j.quorum.Quorum;
import org.web3j.tx.ClientTransactionManager;
import org.web3j.tx.gas.ContractGasProvider;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class QuorumContractReference {
private String address;
private Quorum quorum;
private ContractGasProvider provider;
private ClientTransactionManager manager;
}
//package edu.prlab.tyler.iotgateway.contract.common;
//
//import org.web3j.quorum.Quorum;
//import org.web3j.tx.ClientTransactionManager;
//import org.web3j.tx.gas.ContractGasProvider;
//import org.web3j.tx.gas.DefaultGasProvider;
//import org.web3j.tx.gas.StaticGasProvider;
//
//import java.math.BigInteger;
//import java.util.Optional;
//
//public abstract class QuorumContractService<Data, Contract extends org.web3j.tx.Contract> {
// private static final String rpcUrl = "http://localhost:22000";
//
// private static final ContractGasProvider DEFAULT_GAS_PROVIDER = new StaticGasProvider(
// BigInteger.ZERO,
// DefaultGasProvider.GAS_LIMIT
// );
//
// Quorum quorum;
// ContractGasProvider provider;
// ClientTransactionManager manager;
//
// public QuorumContractService(Quorum quorum, ContractGasProvider provider, ClientTransactionManager manager) {
// this.quorum = quorum;
// this.provider = provider;
// this.manager = manager;
// }
//
// //部屬合約
//
// protected Optional<Contract> deploy(QuorumContractReference reference) {
// return null;
// }
//
// protected Optional<Contract> load() {
//
// }
// //載入合約
//}
package edu.prlab.tyler.iotgateway.contract.common;
import edu.prlab.tyler.iotgateway.contract.DeviceContract;
import org.web3j.protocol.http.HttpService;
import org.web3j.quorum.Quorum;
import org.web3j.tx.ClientTransactionManager;
import org.web3j.tx.gas.ContractGasProvider;
import org.web3j.tx.gas.DefaultGasProvider;
import org.web3j.tx.gas.StaticGasProvider;
import java.math.BigInteger;
import java.util.Optional;
public abstract class QuorumContractService<Data, Contract extends org.web3j.tx.Contract> {
private static final String rpcUrl = "http://localhost:22000";
private static final ContractGasProvider DEFAULT_GAS_PROVIDER = new StaticGasProvider(
BigInteger.ZERO,
DefaultGasProvider.GAS_LIMIT
);
Quorum quorum;
ContractGasProvider provider;
ClientTransactionManager manager;
public QuorumContractService(Quorum quorum, ContractGasProvider provider, ClientTransactionManager manager) {
this.quorum = quorum;
this.provider = provider;
this.manager = manager;
}
//部屬合約
protected Optional<Contract> deploy() {
return Optional.ofNullable(Quorum.build(new HttpService(rpcUrl)))
.flatMap(this::buildManagerAndMap)
.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;
//
//public class QuorumContractUtil {
//
// //合約呼叫函式
// public static
// //呼叫
//
// //驗證合約有效性
//
//
//}
package edu.prlab.tyler.iotgateway.contract.common;
import org.web3j.protocol.core.RemoteCall;
import org.web3j.tx.Contract;
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 {
@Test
public void test2Contract() throws Exception {
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);
ClientTransactionManager manager = new ClientTransactionManager(quorum, userAddress);
......
......@@ -3,6 +3,7 @@ buildscript {
springBootVersion = '2.1.4.RELEASE'
mapstructVersion = '1.3.0.Final'
guavaVersion = '27.1-jre'
web3jQuorumVersion = '4.0.6'
}
repositories {
mavenCentral()
......@@ -36,6 +37,7 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation "org.mapstruct:mapstruct:${mapstructVersion}"
implementation "com.google.guava:guava:${guavaVersion}"
implementation "org.web3j:quorum:${web3jQuorumVersion}"
implementation project(":cloud")
compileOnly 'org.projectlombok:lombok'
......
......@@ -38,7 +38,7 @@
</td>
<td>
<div class="infoBox" id="duration">
<div class="counter">0.718s</div>
<div class="counter">0.770s</div>
<p>duration</p>
</div>
</td>
......@@ -85,7 +85,7 @@
<td>2</td>
<td>0</td>
<td>0</td>
<td>0.718s</td>
<td>0.770s</td>
<td class="success">100%</td>
</tr>
</tbody>
......@@ -111,7 +111,7 @@
<td>1</td>
<td>0</td>
<td>0</td>
<td>0.031s</td>
<td>0.030s</td>
<td class="success">100%</td>
</tr>
<tr>
......@@ -120,7 +120,7 @@
<td>1</td>
<td>0</td>
<td>0</td>
<td>0.687s</td>
<td>0.740s</td>
<td class="success">100%</td>
</tr>
</tbody>
......@@ -134,7 +134,7 @@
<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
</label>
</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>
</body>
......
......@@ -40,7 +40,7 @@
</td>
<td>
<div class="infoBox" id="duration">
<div class="counter">0.718s</div>
<div class="counter">0.770s</div>
<p>duration</p>
</div>
</td>
......@@ -83,7 +83,7 @@
<td>1</td>
<td>0</td>
<td>0</td>
<td>0.031s</td>
<td>0.030s</td>
<td class="success">100%</td>
</tr>
<tr>
......@@ -93,7 +93,7 @@
<td>1</td>
<td>0</td>
<td>0</td>
<td>0.687s</td>
<td>0.740s</td>
<td class="success">100%</td>
</tr>
</table>
......@@ -106,7 +106,7 @@
<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
</label>
</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>
</body>
......
Manifest-Version: 1.0
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
......@@ -46,7 +46,6 @@ public class GatewayController {
.orElseGet(() -> ResponseEntity.noContent().build());
}
//透過裝置UDN取得裝置資訊與隱私政策
@GetMapping("/privacy/{udn}/{account}")
public ResponseEntity<PrivacyPolicyReportResponse> readPrivacyPolicyReportByDevice(@PathVariable String udn, @PathVariable String account) {
......
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