FISCO BCOS 并行交易合约使用与测试
前提:已经部署好了BCOS节点并安装了内置^0.4
版本的solidity
编译器的控制台。
合约部署与调用
参考:FISCO BCOS可并行合约开发框架(附实操教程)- Step 4
下载FISCO-BCOS/java-sdk-demo的Release v2.8.0源码。
下载完成后,sol合约文件位于目录下java-sdk-demo-2.8.0/src/main/java/org/fisco/bcos/sdk/demo/contract/sol/
下。
将上述目录下的所有文件拷贝至BCOS控制台的contracts/solidity/
目录下。
启动控制台,执行如下命令部署合约:
[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():
[group:1]> call ParallelOk 0xdb2e313b0d9ad3d4ef6fba3ceec5b3c6ccb345e1 set "jimmyshi" 100000
发送并行交易 transfer():
[group:1]> call ParallelOk 0xdb2e313b0d9ad3d4ef6fba3ceec5b3c6ccb345e1 transfer "jimmyshi" "jinny" 80000
查看交易执行结果 balanceOf():
[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代码:
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:
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和端口:
CSV Data Set Config如下图:
然后添加Summary Report和View Results Tree。
配置好Thread Group中的Number of Threads和Loop Count后即可开始性能测试。
v3.2.0及以后不再需要enableParallel()的原因
在java-sdk-demo的Release v3.2.0中,其给出了不再需要enableParallel()。
深入下看PR #146,可以看到在Java测试代码中也不再调用enableParallel()接口。
具体不再需要调用enableParallel()接口的更深层次原因,就先不详细追踪。