Skip to content

FISCO BCOS 并行交易合约使用与测试

前提:已经部署好了BCOS节点并安装了内置^0.4版本的solidity编译器的控制台。

合约部署与调用

参考:FISCO BCOS可并行合约开发框架(附实操教程)- Step 4

下载FISCO-BCOS/java-sdk-demoRelease v2.8.0源码。

下载完成后,sol合约文件位于目录下java-sdk-demo-2.8.0/src/main/java/org/fisco/bcos/sdk/demo/contract/sol/下。

将上述目录下的所有文件拷贝至BCOS控制台的contracts/solidity/目录下。

启动控制台,执行如下命令部署合约:

bash
[group:1]> deploy ParallelOk
transaction hash: 0x59d7f22c0ff90fabbe983626cb781db35ffc10766f62b307e2ebb725c1b3d4bc
contract address: 0xdb2e313b0d9ad3d4ef6fba3ceec5b3c6ccb345e1
currentAccount: 0x605a3e0d62350e87f677fb0e78a45b62453526b8

可以看到合约地址。

调用合约

调用 enableParallel()接口,让ParallelOk能并行执行(如果你下载的是Release v3.2.0及更新版本,则不需要此步骤,原因在文末):

[group:1]> call ParallelOk 0xdb2e313b0d9ad3d4ef6fba3ceec5b3c6ccb345e1 enableParallel

发送并行交易 set():

bash
[group:1]> call ParallelOk 0xdb2e313b0d9ad3d4ef6fba3ceec5b3c6ccb345e1 set "jimmyshi" 100000

发送并行交易 transfer():

bash
[group:1]> call ParallelOk 0xdb2e313b0d9ad3d4ef6fba3ceec5b3c6ccb345e1 transfer "jimmyshi" "jinny" 80000

查看交易执行结果 balanceOf():

bash
[group:1]> call ParallelOk 0xdb2e313b0d9ad3d4ef6fba3ceec5b3c6ccb345e1 balanceOf "jinny"

交易的组装

参考:交易的组装与发送详解 -FISCO BCOS v3.2.0 Document

使用文件java-sdk-demo-2.8.0/src/main/java/org/fisco/bcos/sdk/demo/contract/ParallelOk.java,编写Java代码:

java
package org.example;

import org.fisco.bcos.sdk.BcosSDK;
import org.fisco.bcos.sdk.client.Client;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigInteger;

/**
 * App依赖fisco-bcos-sdk的2.9.0版本:https://mvnrepository.com/artifact/org.fisco-bcos.java-sdk/fisco-bcos-java-sdk/2.9.0
 */
public class App {
    /**
     * @param args 接收四个参数
     * 1、SDK配置文件路径
     * 2、ParallelOk合约地址
     * 3、希望循环测试的次数
     * 4、账户数量
     */
    public static void main(String[] args) {
        if (args.length != 4) {
            System.err.println("Args wrong!Example: config/fisco-config.toml 0xdb2e313b0d9ad3d4ef6fba3ceec5b3c6ccb345e1 10 10");
            return;
        }

        String configFile = args[0];
        String contractAddress = args[1];
        int loopCount = Integer.parseInt(args[2]);
        int accountCount = Integer.parseInt(args[3]);

        BcosSDK sdk = BcosSDK.build(configFile);
        Client client = sdk.getClient(1);

        ParallelOk parallelOk = new ParallelOk(contractAddress, client, client.getCryptoSuite().createKeyPair());
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter("RawTransactions.txt"));
            for (int j = 0; j < loopCount; j++) {
                for (int i = 0; i < accountCount; i++) {
                    String rawTx = parallelOk.getSignedTransactionForTransfer(i + "", (i + 50) % accountCount + "", new BigInteger("1")) + "
";
                    writer.write(rawTx);
                }
            }
            System.out.println("Done!");
            writer.close();
        } catch (IOException e) {
            System.out.println("An error occurred: " + e.getMessage());
        }
        sdk.stopAll();
        System.exit(0);
    }
}

运行代码后,会生成一个名为RawTransactions.txt的文件,里面每一行都是一个组装好的交易。

通过RPC发送交易

RawTransactions.txt中选取一行填入下方params中,即可发送RPC请求sendRawTransaction

bash
curl -X POST --data '{"jsonrpc":"2.0","method":"sendRawTransaction","params":[1,"f8d3a003922ee720bb7445e3a914d8ab8f507d1a647296d563100e49548d83fd98865c8411e1a3008411e1a3008201f894d6c8a04b8826b0a37c6d4aa0eaa8644d8e35b79f80a466c9913900000000000000000000000000000000000000000000000000000000000000040101a466c9913900000000000000000000000000000000000000000000000000000000000000041ba08e0d3fae10412c584c977721aeda88df932b2a019f084feda1e0a42d199ea979a016c387f79eb85078be5db40abe1670b8b480a12c7eab719bedee212b7972f775"],"id":1}' http://127.0.0.1:8545

可以使用Jmeter进行性能测试。

**注意:相同哈希的交易只能发送一次,BCOS不允许重复发送。**也就是说,文件中每一个交易都只能使用一次。

性能测试

如下配置Jmeter。HTTP Request如下图,注意配置节点的IP和端口:

image-20230613183721524

CSV Data Set Config如下图:

image-20230613183746533

然后添加Summary Report和View Results Tree。

配置好Thread Group中的Number of Threads和Loop Count后即可开始性能测试。

v3.2.0及以后不再需要enableParallel()的原因

在java-sdk-demo的Release v3.2.0中,其给出了不再需要enableParallel()。

image-20230613112406512

深入下看PR #146,可以看到在Java测试代码中也不再调用enableParallel()接口。

image-20230613112528048

具体不再需要调用enableParallel()接口的更深层次原因,就先不详细追踪。