Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions contract-service/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,6 @@
</properties>

<dependencies>
<dependency>
<groupId>org.web3j</groupId>
<artifactId>web3j-spring-boot-starter</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package pl.piomin.services.contract.config;

import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.Web3jService;
import org.web3j.protocol.admin.Admin;
import org.web3j.protocol.http.HttpService;
import org.web3j.protocol.ipc.UnixIpcService;
import org.web3j.protocol.ipc.WindowsIpcService;

import java.util.concurrent.TimeUnit;

@Configuration
@ConditionalOnClass(Web3j.class)
@EnableConfigurationProperties(Web3jProperties.class)
public class Web3jAutoConfiguration {

private static Logger LOG = LoggerFactory.getLogger(Web3jAutoConfiguration.class);

@Autowired
private Web3jProperties properties;

@Bean
@ConditionalOnMissingBean
public Web3j web3j() {
Web3jService web3jService = buildService(properties.getClientAddress());
LOG.info("Building service for endpoint: {}", properties.getClientAddress());
return Web3j.build(web3jService);
}

@Bean
@ConditionalOnProperty(
prefix = Web3jProperties.WEB3J_PREFIX, name = "admin-client", havingValue = "true")
public Admin admin() {
Web3jService web3jService = buildService(properties.getClientAddress());
LOG.info("Building admin service for endpoint: {}", properties.getClientAddress());
return Admin.build(web3jService);
}

private Web3jService buildService(String clientAddress) {
Web3jService web3jService;

if (clientAddress == null || clientAddress.equals("")) {
web3jService = new HttpService(createOkHttpClient());
} else if (clientAddress.startsWith("http")) {
web3jService = new HttpService(clientAddress, createOkHttpClient(), false);
} else if (System.getProperty("os.name").toLowerCase().startsWith("win")) {
web3jService = new WindowsIpcService(clientAddress);
} else {
web3jService = new UnixIpcService(clientAddress);
}

return web3jService;
}

private OkHttpClient createOkHttpClient() {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
configureLogging(builder);
configureTimeouts(builder);
return builder.build();
}

private void configureTimeouts(OkHttpClient.Builder builder) {
Long tos = properties.getHttpTimeoutSeconds();
if (tos != null) {
builder.connectTimeout(tos, TimeUnit.SECONDS);
builder.readTimeout(tos, TimeUnit.SECONDS); // Sets the socket timeout too
builder.writeTimeout(tos, TimeUnit.SECONDS);
}
}

private static void configureLogging(OkHttpClient.Builder builder) {
if (LOG.isDebugEnabled()) {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor(LOG::debug);
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(logging);
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package pl.piomin.services.contract.config;

import org.springframework.boot.context.properties.ConfigurationProperties;

import static pl.piomin.services.contract.config.Web3jProperties.WEB3J_PREFIX;

@ConfigurationProperties(prefix = WEB3J_PREFIX)
public class Web3jProperties {

public static final String WEB3J_PREFIX = "web3j";

private String clientAddress;

private Boolean adminClient;

private String networkId;

private Long httpTimeoutSeconds;

public String getClientAddress() {
return clientAddress;
}

public void setClientAddress(String clientAddress) {
this.clientAddress = clientAddress;
}

public Boolean isAdminClient() {
return adminClient;
}

public void setAdminClient(Boolean adminClient) {
this.adminClient = adminClient;
}

public String getNetworkId() {
return networkId;
}

public void setNetworkId(String networkId) {
this.networkId = networkId;
}

public Long getHttpTimeoutSeconds() {
return httpTimeoutSeconds;
}

public void setHttpTimeoutSeconds(Long httpTimeoutSeconds) {
this.httpTimeoutSeconds = httpTimeoutSeconds;
}

}
6 changes: 3 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@
<packaging>pom</packaging>

<properties>
<java.version>11</java.version>
<java.version>17</java.version>
<sonar.projectKey>piomin_sample-spring-blockchain-contract</sonar.projectKey>
<sonar.organization>piomin</sonar.organization>
<sonar.host.url>https://sonarcloud.io</sonar.host.url>
<testcontainers.version>1.19.6</testcontainers.version>
<web3j.version>4.10.0</web3j.version>
<web3j.version>5.0.0</web3j.version>
</properties>

<modules>
Expand All @@ -32,7 +32,7 @@
<plugin>
<groupId>org.web3j</groupId>
<artifactId>web3j-maven-plugin</artifactId>
<version>4.11.0</version>
<version>4.11.1</version>
<configuration>
<packageName>pl.piomin.services.contract.model</packageName>
<sourceDestination>contract-service/src/main/generated</sourceDestination>
Expand Down
20 changes: 17 additions & 3 deletions transaction-service/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>transaction-service</artifactId>
<groupId>pl.piomin.services</groupId>
<version>1.0-SNAPSHOT</version>

<properties>
Expand All @@ -17,8 +16,23 @@
<dependencies>
<dependency>
<groupId>org.web3j</groupId>
<artifactId>web3j-spring-boot-starter</artifactId>
<version>1.6.0</version>
<artifactId>core</artifactId>
<version>${web3j.version}</version>
</dependency>
<dependency>
<groupId>org.web3j</groupId>
<artifactId>tuples</artifactId>
<version>${web3j.version}</version>
</dependency>
<dependency>
<groupId>org.web3j</groupId>
<artifactId>abi</artifactId>
<version>${web3j.version}</version>
</dependency>
<dependency>
<groupId>org.web3j</groupId>
<artifactId>crypto</artifactId>
<version>${web3j.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package pl.piomin.services.transaction.config;

import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.Web3jService;
import org.web3j.protocol.admin.Admin;
import org.web3j.protocol.http.HttpService;
import org.web3j.protocol.ipc.UnixIpcService;
import org.web3j.protocol.ipc.WindowsIpcService;

import java.util.concurrent.TimeUnit;

@Configuration
@ConditionalOnClass(Web3j.class)
@EnableConfigurationProperties(Web3jProperties.class)
public class Web3jAutoConfiguration {

private static Logger LOG = LoggerFactory.getLogger(Web3jAutoConfiguration.class);

@Autowired
private Web3jProperties properties;

@Bean
@ConditionalOnMissingBean
public Web3j web3j() {
Web3jService web3jService = buildService(properties.getClientAddress());
LOG.info("Building service for endpoint: {}", properties.getClientAddress());
return Web3j.build(web3jService);
}

@Bean
@ConditionalOnProperty(
prefix = Web3jProperties.WEB3J_PREFIX, name = "admin-client", havingValue = "true")
public Admin admin() {
Web3jService web3jService = buildService(properties.getClientAddress());
LOG.info("Building admin service for endpoint: {}", properties.getClientAddress());
return Admin.build(web3jService);
}

private Web3jService buildService(String clientAddress) {
Web3jService web3jService;

if (clientAddress == null || clientAddress.equals("")) {
web3jService = new HttpService(createOkHttpClient());
} else if (clientAddress.startsWith("http")) {
web3jService = new HttpService(clientAddress, createOkHttpClient(), false);
} else if (System.getProperty("os.name").toLowerCase().startsWith("win")) {
web3jService = new WindowsIpcService(clientAddress);
} else {
web3jService = new UnixIpcService(clientAddress);
}

return web3jService;
}

private OkHttpClient createOkHttpClient() {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
configureLogging(builder);
configureTimeouts(builder);
return builder.build();
}

private void configureTimeouts(OkHttpClient.Builder builder) {
Long tos = properties.getHttpTimeoutSeconds();
if (tos != null) {
builder.connectTimeout(tos, TimeUnit.SECONDS);
builder.readTimeout(tos, TimeUnit.SECONDS); // Sets the socket timeout too
builder.writeTimeout(tos, TimeUnit.SECONDS);
}
}

private static void configureLogging(OkHttpClient.Builder builder) {
if (LOG.isDebugEnabled()) {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor(LOG::debug);
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(logging);
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package pl.piomin.services.transaction.config;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = Web3jProperties.WEB3J_PREFIX)
public class Web3jProperties {

public static final String WEB3J_PREFIX = "web3j";

private String clientAddress;

private Boolean adminClient;

private String networkId;

private Long httpTimeoutSeconds;

public String getClientAddress() {
return clientAddress;
}

public void setClientAddress(String clientAddress) {
this.clientAddress = clientAddress;
}

public Boolean isAdminClient() {
return adminClient;
}

public void setAdminClient(Boolean adminClient) {
this.adminClient = adminClient;
}

public String getNetworkId() {
return networkId;
}

public void setNetworkId(String networkId) {
this.networkId = networkId;
}

public Long getHttpTimeoutSeconds() {
return httpTimeoutSeconds;
}

public void setHttpTimeoutSeconds(Long httpTimeoutSeconds) {
this.httpTimeoutSeconds = httpTimeoutSeconds;
}

}