以太坊中web3j调用公链超时问题,重构httpservice即可

         在学习使用java集成web3j调用eth公链出现以下问题:SocketTimeoutException异常,具体的异常错误就不截图了,主要是执行下面代码发送的

Web3j.build(new HttpSerivceEx(ApplicationConfig.gethUrl)).ethSendRawTransaction(hexValue).send();

此代码主要是进行发送离线交易,由于返回了超时异常,然后系统认为此次交易失败了。然后实际上此笔交易真实的情况是已经发出了,只是此次请求的时间到了,导致了并未接受到正确的返回,因此就会丢失此次交易的hashId。

       这个时候只能去反编译看代码,发现web3j发送请求实际是用的okhttp3的方式,并且默认的超时时间是10s,这个在网络环境非常复杂的公链环境无法满足需求,因此考虑重新构建发送的okhttp3的属性。所以重写下Httpservice即可如下:

public class HttpSerivceEx extends HttpService {
  

然后在创建okhttpclient时设定请求超时时间即可

 private static OkHttpClient createOkHttpClient() {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        configureLogging(builder);
        MyOkHttpRetryInterceptor myOkHttpRetryInterceptor = new MyOkHttpRetryInterceptor.Builder()
           
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,你可以在SpringBoot使用Web3j库来调用FISCO BCOS上的智能合约。以下是一些基本步骤: 1. 在pom.xml文件添加Web3j依赖: ```xml <dependency> <groupId>org.web3j</groupId> <artifactId>core</artifactId> <version>4.8.1</version> </dependency> ``` 2. 在application.properties文件配置FISCO BCOS节点信息: ``` web3j.client-address=http://localhost:8545 ``` 3. 创建一个智能合约的Java类,该类应该继承自org.web3j.abi.datatypes.Int类型,并在其定义合约的方法。 ```java public class MyContract extends Contract { public MyContract(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) { super("", contractAddress, web3j, credentials, gasPrice, gasLimit); } public RemoteCall<BigInteger> myMethod() { Function function = new Function( "myMethod", Collections.emptyList(), Collections.singletonList(new TypeReference<Uint256>() {}) ); return executeRemoteCallSingleValueReturn(function, BigInteger.class); } } ``` 4. 在SpringBoot创建一个Controller类,用于处理请求。在该类创建一个Web3j对象,然后使用该对象创建一个Credentials对象,该对象应该包含您的FISCO BCOS账户的私钥。接下来,创建一个MyContract对象,然后调用其方法。 ```java @RestController public class MyController { @GetMapping("/myMethod") public BigInteger myMethod() throws Exception { String privateKey = "..."; // FISCO BCOS账户的私钥 Web3j web3j = Web3j.build(new HttpService()); Credentials credentials = Credentials.create(privateKey); MyContract contract = MyContract.load("合约地址", web3j, credentials, new BigInteger("3000000"), new BigInteger("3000000")); return contract.myMethod().send(); } } ``` 这样,您就可以在SpringBoot调用FISCO BCOS上的智能合约了。当您访问/myMethod时,将会调用MyContract的myMethod方法,并返回其结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值