目录
前言: 本节点前置篇主要介绍如何通过节点前置接口与java后端进行交互,以及如何参照官方文档编写接口
一、准备链和节点前置服务
首先准备好自己的区块链节点,这里采用单机四节点的默认配置搭建节点,实际可任意褡链方式。此处具体操作在前些博客已详细讲述,故不再赘述。
1.启动区块链节点
2.启动节点前置
二、准备合约
以最简单的HelloWorld合约作为例子,然后编译,选择一个账户部署即可
合约源码:
pragma solidity ^0.6.0;
contract HelloWorld {
string private message;
function sayHello() public pure returns (string memory) {
return "Hello, World!";
}
function setMessage(string memory newMessage) public {
message = newMessage;
}
function getMessage() public view returns (string memory) {
return message;
}
}
1.编译部署合约
2.复制合约地址等信息
部署后复制合约的地址,ABI和Bin,准备后续使用
三、新建java工程
1.处理项目
我们直接新建一个springboot项目,然后创建一个controller层,我们直接在这里测试API接口
2.引入依赖
同时也要加几个必要的依赖包,一个是用于json转换的fastjson,一个用来解析区块交互信息的hutool包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.79</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.11</version>
</dependency>
四、参照API官方文档写接口
WeBASE的子系统 节点前置提供了许多与区块链进行交互的接口,详细查询可参见此官方文档:
1.接口测试
我们先来个简单的接口测试一下:
以此接口为例,我们直接在浏览器发送请求就可以得到,但是这种简单到没有任何参数的接口,能得到的信息也很少。
2.合约交易接口调用
我们调用API最重要的目的是通过FISCO BCOS与合约交互,我们通常使用这个接口与合约进行交互
官方文档中已经对合约的一些参数做了规范与定义 ,看起来很麻烦,需要很多参数,但其实多数参数是固定的,like this,注意替换你自己的合约地址等信息!
private static final String contractAddress = "0x80ea5245c8be0129f6704b855e8dbfc47fd1b5c4";
private static final String ABI = "这里是合约的ABI,原文太长,影响阅读";
private static final String contractName = "HelloWorld";
我们将先前复制的合约地址等信息定义为常量,便于后续方法调用。
接着我们定义一个commonReq的方法调用接口,接收3个值:用户地址、合约方法名、合约方法需要传入的参数,要注意data内数据的准确性。
public static String commonReq(String userAddress,
String funcName,
List funcParam) {
JSONObject data = new JSONObject();
JSONArray abiJSON = JSON.parseArray(ABI);
data.put("user", userAddress);
data.put("contractName", contractName);
data.put("contractAddress", contractAddress);
data.put("funcName", funcName);
data.put("contractAbi", abiJSON);
data.put("groupId", 1);
data.put("funcParam", funcParam);
data.put("useCns", false);
data.put("useCns", false);
data.put("cnsName", "");
String dataString = data.toString();
String response = HttpRequest.post("http://192.168.200.134:5002/WeBASE-Front/trans/handle")
.header(Header.CONTENT_TYPE, "application/json")
.body(dataString)
.execute()
.body();
return response;
}
通过我们定义的commonReq方法,我们即可对合约进行交互,例如对合约的get方法和set方法进行调用。
@GetMapping(value = "/get")
public Object getInfo(){
String result = commonReq("0x1809861467c11217ef957f2bbdc2e63371a6a34f","getMessage",null);
return result;
}
@GetMapping(value = "/set/{info}")
private JSONObject setInfo(@PathVariable String info){
List<String> funcParam = new ArrayList<>();
funcParam.add(info);
String result = commonReq("0x1809861467c11217ef957f2bbdc2e63371a6a34f","setMessage",funcParam);
return JSON.parseObject(result);
}
之后我们启动项目,在postman中进行测试!
3.接口调用
交易返回的result即为在节点前置中调用合约方法的返回结果。
测试结果正常,此时可以去节点前置验证。
4.交易查验
可以看到,区块高度和交易数量都增加了,且合约内信息与刚才调用的相同,真正实现了通过java与区块链的交互。