生成智能合约的Java接口文件

在控制台consolejava-sdk-demo均提供了工具,可以将solidity合约生成出调用该合约java工具类。本例中使用console将Solidity合约生成出做调用该合约java工具类为例子。

体验 webankblockchain-liquid(以下简称WBC-Liquid),请参考第5小节。

使用java-sdk-demo的例子请看第7小节。

1. 下载控制台

$ mkdir -p ~/fisco && cd ~/fisco
# 获取控制台
$ curl -#LO https://github.com/FISCO-BCOS/console/releases/download/v3.6.0/download_console.sh

# 若因为网络问题导致长时间无法执行以上命令,请尝试以下命令:
$ curl -#LO https://gitee.com/FISCO-BCOS/console/raw/master/tools/download_console.sh

$ bash download_console.sh
$ cd ~/fisco/console

2. 将合约放置到控制台的合约目录

然后,将您要用到的Solidity智能合约放入~/fisco/console/contracts/solidity的目录。本次我们用console中的HelloWorld.sol作为例子。保证HelloWorld.sol在指定的目录下。

# 当前目录~/fisco/console
$ ls contracts/solidity 

得到返回

HelloWorld.sol  KVTableTest.sol ShaTest.sol KVTable.sol ...

3. 生成调用该智能合约的Java类

# 当前目录~/fisco/console
$ bash contract2java.sh solidity -p org.com.fisco -s ./contracts/solidity/HelloWorld.sol
# 以上命令中参数“org.com.fisco”是指定产生的java类所属的包名。
# 通过命令./contract2java.sh -h可查看该脚本使用方法

得到返回

*** Compile solidity HelloWorld.sol*** 
INFO: Compile for solidity HelloWorld.sol success.
*** Convert solidity to java  for HelloWorld.sol success ***

contract2java.sh使用方法将在附录2中详细介绍。

查看编译结果

$ ls contracts/sdk/java/org/com/fisco 
# 得到返回
# HelloWorld.java

运行成功之后,将会在console/contracts/sdk目录生成java、abi和bin目录,如下所示。

|-- abi # 编译生成的abi目录,存放solidity合约编译的abi文件
|   |-- HelloWorld.abi
|-- bin # 编译生成的bin目录,存放solidity合约编译的bin文件
|   |-- HelloWorld.bin
|-- java  # 存放编译的包路径及Java合约文件
|   |-- org
|       |-- com
|           |-- fisco
|               |-- HelloWorld.java # Solidity编译的HelloWorld Java文件

Java目录下生成了org/com/fisco/包路径目录。包路径目录下将会生成Java合约文件HelloWorld.java。其中HelloWorld.java是Java应用所需要的Java合约文件。

4. 生成的Java文件代码结构

下面以生成的HelloWorld.java的接口列表为例,简要说明代码结构。

public class HelloWorld extends Contract {
    // 构造函数
    protected HelloWorld(String contractAddress, Client client, CryptoKeyPair credential);
    // 根据CryptoSuite获取合约的code,若是国密就返回国密的code
    public static String getBinary(CryptoSuite cryptoSuite);
    // 获取合约的ABI json字符串
    public static String getABI();
    // HelloWorld合约get接口
    public String get() throws ContractException;
    // HelloWorld合约get接口的Function类,记录了输入和返回的类型,可用于ABI解析
    public Function getMethodGetRawFunction() throws ContractException;
    // HelloWorld合约set接口,输入String类型,返回交易回执
    public TransactionReceipt set(String n);
    // HelloWorld合约set接口的Function类,记录了输入和返回的类型,可用于ABI解析
    public Function getMethodSetRawFunction(String n) throws ContractException;
    // 获取已签名的调用set接口的交易,获取后可以直接发到链上
    public String getSignedTransactionForSet(String n);
    // HelloWorld合约set异步接口,输入String类型,返回交易哈希
    public String set(String n, TransactionCallback callback);
    // HelloWorld合约set的input解析
    public Tuple1<String> getSetInput(TransactionReceipt transactionReceipt);
    // 若链上有已知的HelloWorld合约,可以用改接口直接加载出Java 的HelloWorld类。注意:ABI必须相同,否则会出现调用失败
    public static HelloWorld load(String contractAddress, Client client, CryptoKeyPair credential);
    // 向链上发起部署合约操作,返回Java 的HelloWorld类。
    public static HelloWorld deploy(Client client, CryptoKeyPair credential) throws ContractException;
}

5. 生成WBC-Liquid合约的Java接口文件

与上文Solidity合约类似,如果你想体验 webankblockchain-liquid(以下简称WBC-Liquid)的部署操作,控制台也为你提供了例子。

在使用之前,请先保证cargo liquid的编译环境,使用搭建请参考:https://liquid-doc.readthedocs.io/。

5.1 WBC-Liquid合约的编译

可在控制台dist目录下contracts/liquid下查看,下面以hello_world为例子:

$ ls contracts/liquid
asset_test    hello_world   kv_table_test

$ cd contracts/liquid/hello_world

# 使用cargo liquid 编译
$ cargo liquid build
[1/4] 🔍  Collecting crate metadata
[2/4] 🚚  Building cargo project
[3/4] 🔗  Optimizing Wasm bytecode
[4/4] 📃  Generating ABI file

✨ Done in 1 minute, your project is ready now:
Binary: ~/fisco/contracts/liquid/hello_world/target/hello_world.wasm
   ABI: ~/fisco/console/dist/contracts/liquid/hello_world/target/hello_world.abi

生成hello_world.wasmhello_world.abi两个文件

5.2 WBC-Liquid合约生成Java文件

# 当前目录~/fisco/console
$ bash contract2java.sh liquid -b ./contracts/liquid/hello_world/hello_world.wasm -a ./contracts/liquid/hello_world/hello_world.abi -s ./contracts/liquid/hello_world/hello_world_sm.wasm -p org.com.fisco
# 通过命令./contract2java.sh -h可查看该脚本使用方法

$ ls contracts/sdk/java/org/com/fisco 
# 得到返回
HelloWorld.java

6. contract2java.sh 脚本解析

控制台提供一个专门的生成Java合约工具,方便开发者将Solidity和WBC-Liquid合约文件编译为Java合约文件。

当前合约生成工具支持Solidity的自动编译并生成Java文件、支持指定WBC-Liquid编译后的WASM文件以及ABI文件生成Java文件。

6.1 Solidity合约使用

bash contract2java.sh solidity -h
usage: contract2java.sh <solidity|liquid> [OPTIONS...]
 -e,--enable-async-call           [Optional] Enable generate async
                                  interfaces for constant call, java file
                                  only compilable when java-sdk >= 3.3.0.
 -h,--help
 -l,--libraries <arg>             [Optional] Set library address
                                  information built into the solidity
                                  contract
                                  eg:
                                  --libraries lib1:lib1_address
                                  lib2:lib2_address
 -n,--no-analysis                 [Optional] NOT use evm static
                                  parallel-able analysis. It will not
                                  active DAG analysis, but will speedup
                                  compile speed.
 -o,--output <arg>                [Optional] The file path of the
                                  generated java code, default is
                                  contracts/sdk/java/
 -p,--package <arg>               [Optional] The package name of the
                                  generated java code, default is com
 -s,--sol <arg>                   [Optional] The solidity file path or the
                                  solidity directory path, default is
                                  contracts/solidity/
 -t,--transaction-version <arg>   [Optional] Specify transaction version
                                  interface, default is 0; If you want to
                                  use the latest transaction interface,
                                  please specify 1.

参数详细:

  • package: 生成Java文件的包名。

  • sol: (可选)solidity文件的路径,支持文件路径和目录路径两种方式,参数为目录时将目录下所有的solidity文件进行编译转换。默认目录为contracts/solidity

  • output: (可选)生成Java文件的目录,默认生成在contracts/sdk/java目录。

  • no-analysis:(可选)跳过solidity编译的静态分析,可以有效缩减编译速度。静态分析可以分析合约的接口并行可行性,并将分析结果放到abi文件中。

  • enable-async-call :(可选)可生成具有异步call接口的Java文件,异步接口只有在Java-sdk版本>=3.3.0时使用。

  • transaction-version:(可选)指定生成Java文件发交易的版本号,默认是0,可以兼容所有版本的节点;当使用交易版本为1时,可以支持交易带有value、gasLimit、gasPrice、EIP1559等字段,只能发给3.6.0及以上的节点中。

6.2 WBC-Liquid合约使用

$ bash contract2java.sh liquid -h
usage: contract2java.sh <solidity|liquid> [OPTIONS...]
 -a,--abi <arg>       [Required] The ABI file path of WBC-Liquid contract.
 -b,--bin <arg>       [Required] The binary file path of WBC-Liquid contract.
 -h,--help
 -o,--output <arg>    [Optional] The file path of the generated java code,
                      default is contracts/sdk/java/
 -p,--package <arg>   [Optional] The package name of the generated java
                      code, default is com
 -s,--sm-bin <arg>    [Required] The SM binary file path of WBC-Liquid
                      contract.

参数详细:

  • abi:(必选)WBC-Liquid合约ABI文件的路径,在使用cargo liquid build命令之后生成在target文件夹中。

  • bin:(必选)WBC-Liquid合约wasm bin文件的路径,在使用cargo liquid build命令之后生成在target文件夹中。

  • package:(可选)生成Java文件的包名,默认为org

  • sm-bin:(必选)WBC-Liquid合约wasm sm bin文件的路径,在使用cargo liquid build -g命令之后生成在target文件夹中。

7. 使用java-sdk-demo给智能合约生成调用它的Java工具类

$ mkdir -p ~/fisco && cd ~/fisco
# 获取java-sdk代码
$ git clone https://github.com/FISCO-BCOS/java-sdk-demo

# 若因为网络问题导致长时间无法执行以上命令,请尝试以下命令:
$ git clone https://gitee.com/FISCO-BCOS/java-sdk-demo

$ cd java-sdk-demo
# 编译
$ ./gradlew clean build -x test
# 进入sdk-demo/dist目录,创建合约存放目录
$ cd dist && mkdir -p contracts/solidity
# 将需要转换为java代码的sol文件拷贝到~/fisco/java-sdk/dist/contracts/solidity路径下
# 转换sol, 其中${packageName}是生成的java代码包路径
# 生成的java代码位于 ~/fisco/java-sdk/dist/contracts/sdk/java目录下
java -cp "apps/*:lib/*:conf/" org.fisco.bcos.sdk.demo.codegen.DemoSolcToJava ${packageName}