如何使用java脚手架调用合约接口(以HelloWorld为例提供示范)
前提条件
部署好fisco-bcos区块链网络,此处是通过webase依赖包一键部署区块链网络
在虚拟机或者云服务器部署区块链网络并开放相应的端口,使用windows端导入java项目时,请使用内网IP或公网IP导出项目
1.编写合约HelloWorld.sol
pragma solidity ^0.4.25;
contract HelloWorld{
string str;
constructor(){
str = "Hello World";
}
function setStr(string memory _str)public {
str = _str;
}
function getStr()public view returns(string memory){
return str;
}
}
2.部署编译合约
3.导出java项目
第一步点击到处java项目
第二步,选择节点,选择用户,选择已编译HelloWorld合约
第三步,把下载好的Java项目导入IDEA
打开IDEA,点击左上角文件,点击打开,然后找到下载好的项目导入,构建项目需要一定的时间下载gradel包管理器和依赖
导入后成功构建,如下所示:
4.分析项目源码目录中的raw包和service包下的java文件
HelloWorld.java
HelloWorld.java
是一个合约的Java封装类,用于与HelloWorl.sol
进行交互。
该类的主要功能包括:
- 定义合约的二进制表示:通过
BINARY_ARRAY
定义合约的字节码表示,BINARY
定义非SM模式的合约二进制代码,SM_BINARY
定义SM模式的合约二进制代码。 - 定义合约的
ABI (Application Binary Interface)
:通过ABI_ARRAY
定义合约的ABI
,即合约的函数和参数的描述。 - 定义合约的函数名称:
FUNC_SETSTR
表示设置字符串变量的函数名,FUNC_GETSTR
表示获取字符串变量的函数名。 - 实现合约的部署和加载方法:
deploy
方法用于部署HelloWorld
合约到区块链,并返回一个HelloWorld
的实例。load
方法用于加载已部署的HelloWorld
合约。需要提供合约地址、区块链客户端和密钥对。
- 实现合约函数的具体操作方法:
setStr
方法用于设置HelloWorld
合约中字符串变量的值。getStr
方法用于获取HelloWorld
合约中字符串变量的值。
- 在构造函数中初始化合约:
- 通过传入合约地址、区块链客户端和密钥对,在构造函数中调用父类
Contract
的构造方法进行初始化。
- 通过传入合约地址、区块链客户端和密钥对,在构造函数中调用父类
总的来说,HelloWorld.java
定义了一个与HelloWorld
合约进行交互的封装类,提供了部署和加载合约的方法,以及具体操作合约函数的方法。它管理了与合约的交互逻辑,并提供了简化的接口,供应用程序进行与合约的交互和操作。
代码如下所示:
package org.example.HelloWorld.raw;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.fisco.bcos.sdk.abi.FunctionReturnDecoder;
import org.fisco.bcos.sdk.abi.TypeReference;
import org.fisco.bcos.sdk.abi.datatypes.Function;
import org.fisco.bcos.sdk.abi.datatypes.Type;
import org.fisco.bcos.sdk.abi.datatypes.Utf8String;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple1;
import org.fisco.bcos.sdk.client.Client;
import org.fisco.bcos.sdk.contract.Contract;
import org.fisco.bcos.sdk.crypto.CryptoSuite;
import org.fisco.bcos.sdk.crypto.keypair.CryptoKeyPair;
import org.fisco.bcos.sdk.model.CryptoType;
import org.fisco.bcos.sdk.model.TransactionReceipt;
import org.fisco.bcos.sdk.model.callback.TransactionCallback;
import org.fisco.bcos.sdk.transaction.model.exception.ContractException;
@SuppressWarnings("unchecked")
public class HelloWorld extends Contract {
// 合约的二进制代码表示
public static final String[] BINARY_ARRAY = {
// 合约的字节码...
};
public static final String BINARY = org.fisco.bcos.sdk.utils.StringUtils.joinAll("", BINARY_ARRAY);
public static final String[] SM_BINARY_ARRAY = {
};
public static final String SM_BINARY = org.fisco.bcos.sdk.utils.StringUtils.joinAll("", SM_BINARY_ARRAY);
// 合约的ABI(应用程序二进制接口)
public static final String[] ABI_ARRAY = [
// 合约的ABI...
];
public static final String ABI = org.fisco.bcos.sdk.utils.StringUtils.joinAll("", ABI_ARRAY);
// 函数名称
public static final String FUNC_SETSTR = "setStr";
public static final String FUNC_GETSTR = "getStr";
// 合约的构造函数
protected HelloWorld(String contractAddress,