• 区块链安全应用-------压力测试


      基于已有的链进行测试(build_chain默认建的链 四个节 点):

    第一步:搭链

    1. 安装依赖 在ubuntu操作系统中,操作步骤如下:

    sudo apt install -y openssl curl

    2. 创建操作目录, 下载安装脚本

    1. ## 创建操作目录
    2. cd ~ && mkdir -p fisco && cd fisco
    3. ## 下载脚本
    4. curl -LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v2.7.1/build_chain.sh
    5. chmod +x build_chain.sh
    6. #搭链
    7. bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545 –e ./fisco-bcos

    3. 启动链

    bash nodes/127.0.0.1/start_all.sh

    第二步:配置网络配置文件

    在networks/fisco-bcos/test/创建fisco-bcos2.json配置网络适配文件:

    1. {
    2. "caliper": {
    3. "blockchain": "fisco-bcos"
    4. },
    5. "fisco-bcos": {
    6. "config": {
    7. "privateKey": "bcec428d5205abe0f0cc8a734083908d9eb8563e31f943d760786edf42ad67dd",
    8. "account": "0x0ff8981ebc130c7874ac7093a4d0c0e3d4f36b08"
    9. },
    10. "network": {
    11. "nodes": [
    12. {
    13. "ip": "127.0.0.1",
    14. "rpcPort": "8545",
    15. "channelPort": "20200"
    16. },
    17. {
    18. "ip": "127.0.0.1",
    19. "rpcPort": "8546",
    20. "channelPort": "20201"
    21. },
    22. {
    23. "ip": "127.0.0.1",
    24. "rpcPort": "8547",
    25. "channelPort": "20202"
    26. },
    27. {
    28. "ip": "127.0.0.1",
    29. "rpcPort": "8548",
    30. "channelPort": "20203"
    31. }
    32. ],
    33. "authentication": {
    34. "key":"/home/myy/Desktop/fisco-bcos/nodes/127.0.0.1/sdk/sdk.key",
    35. "cert": "/home/myy/Desktop/fisco-bcos/nodes/127.0.0.1/sdk/sdk.crt",
    36. "ca": "/home/myy/Desktop/fisco-bcos/nodes/127.0.0.1/sdk/ca.crt"
    37. },
    38. "groupID": 1,
    39. "timeout": 100000
    40. },
    41. "smartContracts": [
    42. {
    43. "id": "helloworld",
    44. "path": "src/fisco-bcos/helloworld/HelloWorld.sol",
    45. "language": "solidity",
    46. "version": "v0"
    47. }
    48. ]
    49. },
    50. "info": {
    51. "Version": "2.0.0",
    52. "Size": "4 Nodes",
    53. "Distribution": "Single Host"
    54. }
    55. }

    第三步,对本地四节点链进行测试

    npx caliper benchmark run --caliper-workspace caliper-benchmarks --caliper-benchconfig benchmarks/samples/fisco-bcos/helloworld/config.yaml --caliper-networkconfig networks/fisco-bcos/test/fisco-bcos2.json

    测试和进程资源状态都可以监测,但在本地监测中,无法监测每个节点的资源状态。

    第四步:停止节点

    bash nodes/127.0.0.1/stop_all.sh

     

    如何改成预编译的智能合约进行测试?

    测试文件参数介绍 参数 含义

    • test.name 要在报告中显示的benchmark的短名称。
    • test.description 要在报告中显示的benchmark的详细说明。
    • test.workers 与工作线程相关的对象的配置。
    • test.workers.type (暂未投入使用)
    • test.workers.number 指定用于执行工作负载的工作进程数。
    • test.rounds 对象回合数组,一个数组下可以有多轮不同的测试任务。
    • test.rounds[i].label 该轮测试的名称,通常对应于该轮要提交的测试的类型。
    • test.rounds[i].txNumber应在该轮任务提交的任务数。
    • test.rounds[i].txDuration 该轮提交任务数的用时(单位,秒)。
    • test.rounds[i].rateControl 描述该轮的速率控制策略。
    • test.rounds[i].workload 描述该轮的工作负载模块。
    • test.rounds[i].workload.module 该轮基准测试工作负载模块实现的路径。
    • test.rounds[i].workload.arguments 作为配置,传递给该轮工作负载模块的参数 

    通过Java SDK进行压力测试

    配置工程链基本环境后,介绍具体测试步骤和要点。

    • 1. 编写合约:HelloWorld合约。
    • 2. 编译智能合约,将其转为Java文件,从上述WeBASE-Front中,也能编译并导出Java文件。
    • 3. 将编译生成的Java文件导入工程中,如HelloWorld.java。
    • 4. 基于上述文件,调用合约功能和接口,编写相关测试案例,例如:ContractTest。
    • 5. 基于Spring提供的gradle插件,我们可以通过”./gradlew test”命令来运行所有测试案例。
    • 6. 如果需要持续集成,可以在配置和初始化FISCO BCOS后,将步骤5命令加入自动化脚本中。

    第一步:安装JDK

    1. # 安装open JDK 11
    2. sudo apt install openjdk-11-jdk
    3. # 验证Java版本
    4. java --version
    5. # 输出以下内容:
    6. #openjdk 11.0.22 2024-01-16
    7. #OpenJDK Runtime Environment (build 11.0.22+7-post-Ubuntu-0ubuntu220.04.1)
    8. #OpenJDK 64-Bit Server VM (build 11.0.22+7-post-Ubuntu-0ubuntu220.04.1, mixed
    9. mode, sharing)

    第二步:编译源码 

    1. # 下载源码
    2. git clone https://github.com/FISCO-BCOS/java-sdk-demo
    3. cd java-sdk-demo
    4. git checkout main-2.0
    5. # 编译源码
    6. ./gradlew build

     

    第三步. 配置Demo

    使用Java SDK Demo之前,需要首先要Java SDK,包括证书拷贝以及端口配置,详细请参考这里

    1. # 拷贝证书(假设SDK证书位于~/fisco/nodes/127.0.0.1/sdk目录,请根据实际情况更改路径)
    2. cd dist
    3. cp -r /root/fisco/nodes/127.0.0.1/sdk/* conf
    4. # 拷贝配置文件
    5. # 注:
    6. #   默认搭建的FISCO BCOS区块链系统Channel端口是20200,若修改了该端口,请同步修改config.toml中的[network.peers]配置选项
    7. $ cp conf/config-example.toml conf/config.toml
    8. #由于我的区块链环境具有四个节点,所以应该修改java-sdk-demo/dist/conf/config.toml下的network.peers配置
    9. peers=["127.0.0.1:20200", "127.0.0.1:20201","127.0.0.1:20202","127.0.0.1:20203"]

     

    第四步. 执行示例压力测试程序

    Java SDK Demo提供了一系列压测程序,包括串行转账合约压测、并行转账合约压测、AMOP压测等, 具体使用方法如下:

    1. # 进入dist目录
    2. $ cd dist
    3. mkdir -p contracts/solidity
    4. # 将需要转换为java代码的sol文件拷贝到dist/contracts/solidity路径下
    5. # 转换sol, 其中${packageName}是生成的java代码包路径
    6. # 生成的java代码位于 /dist/contracts/sdk/java目录下
    7. $ java -cp "apps/*:lib/*:conf/" org.fisco.bcos.sdk.demo.codegen.DemoSolcToJava
    8. ${packageName}
    9. # 压测串行转账合约:
    10. # count: 压测的交易总量
    11. # tps: 压测QPS
    12. # groupId: 压测的群组ID
    13. java -cp 'conf/:lib/*:apps/*' org.fisco.bcos.sdk.demo.perf.PerformanceOk [count]
    14. [tps] [groupId]
    15. # 压测并行转账合约
    16. # --------------------------
    17. # 基于Solidity并行合约parallelok添加账户:
    18. # groupID: 压测的群组ID
    19. # count: 压测的交易总量
    20. # tps: 压测QPS
    21. # file: 保存生成账户的文件名
    22. $ java -cp 'conf/:lib/*:apps/*' org.fisco.bcos.sdk.demo.perf.ParallelOkPerf
    23. [parallelok] [groupID] [add] [count] [tps] [file]
    24. # 基于Precompiled并行合约precompiled添加账户
    25. # (参数含义同上)
    26. java -cp 'conf/:lib/*:apps/*' org.fisco.bcos.sdk.demo.perf.ParallelOkPerf
    27. [precompiled] [groupID] [add] [count] [tps] [file]
    28. # --------------------------
    29. # 基于Solidity并行合约parallelok发起转账交易压测
    30. # groupID: 压测的群组ID
    31. # count: 压测的交易总量
    32. # tps: 压测的QPS
    33. # file: 转账用户文件
    34. $ java -cp 'conf/:lib/*:apps/*' org.fisco.bcos.sdk.demo.perf.ParallelOkPerf
    35. [parallelok] [groupID] [transfer] [count] [tps] [file]
    36. # 基于Precompiled并行合约Precompiled发起转账压测
    37. $ java -cp 'conf/:lib/*:apps/*' org.fisco.bcos.sdk.demo.perf.ParallelOkPerf
    38. [precompiled] [groupID] [transfer] [count] [tps] [file]
    1. # CRUD合约压测
    2. # 压测CRUD insert
    3. # count: 压测的交易总量
    4. # tps: 压测QPS
    5. # groupId: 压测群组
    6. $ java -cp 'conf/:lib/*:apps/*' org.fisco.bcos.sdk.demo.perf.PerformanceTable
    7. [insert] [count] [tps] [groupId]
    8. # 压测CRUD update
    9. # (参数解释同上)
    10. $ java -cp 'conf/:lib/*:apps/*' org.fisco.bcos.sdk.demo.perf.PerformanceTable
    11. [update] [count] [tps] [groupId]
    12. # 压测CRUD remove
    13. # (参数解释同上)
    14. $ java -cp 'conf/:lib/*:apps/*' org.fisco.bcos.sdk.demo.perf.PerformanceTable
    15. [remove] [count] [tps] [groupId]
    16. # 压测CRUD query
    17. # (参数解释同上)
    18. $ java -cp 'conf/:lib/*:apps/*' org.fisco.bcos.sdk.demo.perf.PerformanceTable
    19. [query] [count] [tps] [groupId]

     以上对压测合约进行解释,如已经生成配置文件了,就可以直接运行下面的代码

    然后下面是对合约进行运行

    1. cd ~/java-sdk-demo/dist
    2. java -cp 'conf/:lib/*:apps/*' org.fisco.bcos.sdk.demo.perf.PerformanceOk [count]
    3. [tps] [groupId]
    4. java -cp 'conf/:lib/*:apps/*' org.fisco.bcos.sdk.demo.perf.PerformanceOk 10000 1000 1
    5. #200000代表总测试量为10000   1000代表每秒向区块链系统发送1000次请求   1代表区块链系统的groupId

    出现以下错误是因为搭链没有启动要先启动链 

    bash start_all.sh

     

    自定义压测代码

    压测自定义合约的开发均在Java SDK Demo中进行,我们需要开发三个文件,分别是: 待压测的智能合约:HelloWorld.sol

    待压测的智能合约所编译出的Java类:HelloWorld.java

    压力测试程序:PerformanceHelloWorld.java

    项目的存放路径

    首先编译Helloworld.sol文件

    创建 contracts/solidity文件

    1. cd ~/java-sdk-demo/dist
    2. mkdir -p contracts/solidity

    生成Helloworld.sol文件 

    1. cd contracts/solidity
    2. vim HelloWorld.sol
    3. #生成以上Helloworld智能合约完成简单的获取和设置name功能
    1. pragma solidity >=0.4.24 <0.6.11;
    2. contract HelloWorld {
    3. string public name;
    4. constructor() public {
    5. name = "Hello, World!";
    6. }
    7. function get() public view returns (string memory) {
    8. return name;
    9. }
    10. function set(string memory n) public {
    11. name = n;
    12. }
    13. }

  • 相关阅读:
    修炼k8s+flink+hdfs+dlink(四:k8s(一)概念)
    vue3 html2canvas 网络图片 空白 及使用
    [李宏毅老师深度学习视频] 机器学习深度学习基本内容【手写笔记】
    Python正则表达式操作(re模块使用篇)
    网卡收发包过程
    LeetCode 0264. 丑数 II
    Mybatis之if标签判断boolean值
    【scikit-learn009】异常检测系列:单类支持向量机(OC-SVM)实战总结(看这篇就够了,已更新)
    童欣 室内三维场景的理解与建模
    k8s(Kubernetes)集群部署--使用 kubeadm方式部署
  • 原文地址:https://blog.csdn.net/2201_76041915/article/details/138066843