首页 > 其他分享 >jmeter自定义函数开发—Web3钱包生成工具

jmeter自定义函数开发—Web3钱包生成工具

时间:2024-07-09 19:20:21浏览次数:9  
标签:return String 自定义 privateKey maven Web3 import jmeter

之前使用Jmeter进行接口测试时,有生成钱包地址的需求,于是有时间就简单写了个自定义函数

环境说明

JDK1.8.0,Jmeter 5.4.3,maven构建工具

实现代码

新建一个简单的maven项目即可,以下是pom.xml配置

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.qgc</groupId>
  <artifactId>walletTools</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>walletTools</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.jmeter</groupId>
      <artifactId>ApacheJMeter_functions</artifactId>
      <version>5.4.3</version>
    </dependency>
      <!-- web3J依赖 -->
      <dependency>
          <groupId>org.web3j</groupId>
          <artifactId>core</artifactId>
          <version>5.0.0</version>
      </dependency>
    <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-ext-jdk15on -->
<!--    <dependency>-->
<!--      <groupId>org.bouncycastle</groupId>-->
<!--      <artifactId>bcprov-ext-jdk15on</artifactId>-->
<!--      <version>1.70</version>-->
<!--    </dependency>-->
      <dependency>
          <groupId>org.bouncycastle</groupId>
          <artifactId>bcprov-jdk15on</artifactId>
          <version>1.70</version>
      </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>
View Code

实现代码,可以自行调整相关参数,type实现了3种返回方式,其中1 随机返回私钥,2 随机返回地址,3 返回指定私钥的地址

package com.qgc.functions;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.functions.InvalidVariableException;
import org.apache.jmeter.samplers.Sampler;
import org.web3j.crypto.*;
import org.apache.jmeter.functions.AbstractFunction;

public class App extends AbstractFunction {

    //定义一个obect对象去接受传入变量值
    private Object[] values;
    //存储第一个和第二个参数
    private CompoundVariable type, privateKey;

    @Override
    /**
     * 执行方法
     * @param sampleResult
     * @param sampler
     * @return
     * @throws InvalidVariableException
     */
    public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {
        //接住第一个参数值
        type = (CompoundVariable) values[0];
        privateKey = (CompoundVariable) values[1];

        if (type.execute().equals("3")){
            try {
                String address = getKeyAddress(privateKey.execute());
                return address;
            }
            catch (Exception e){
                e.printStackTrace();
            }

        }
        else {
            try {
                String str = getRandomAddress(type.execute());
                return str;
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    /**
     * 设置参数,接受用户传递的参数
     * @param collection
     * @throws InvalidVariableException
     */
    public void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {
        //检查参数是否合法
        checkParameterCount(collection,2);
        //转换成数组
        values = collection.toArray();
    }

    @Override
    /**
     * 函数名称
     * @return
     */
    public String getReferenceKey() {
        return "__qgcWalletApp";
    }

    @Override
    /**
     * 函数描述,获取参数描述
     * @return
     */
    public List<String> getArgumentDesc() {
        List desc = new ArrayList();
        //界面上显示两行参数描述
        desc.add("type(1随机返回私钥,2随机返回地址,3返回指定私钥的地址)");
        desc.add("privateKey(type为3的时候传)");
        return desc;
    }

    public static String getKeyAddress(String privateKey) throws Exception {// 通过私钥生成公钥和地址
        if (privateKey !=null || privateKey.equals("")){
            String address = null;
            try {
                ECKeyPair keyPair = ECKeyPair.create(new BigInteger(privateKey, 16));
                address = "0x" + Keys.getAddress(keyPair.getPublicKey());
            }
            catch (Exception e){
                throw new InvalidVariableException(e);
            }
            finally {
                return address;
            }
        }
        else {
            System.out.println("privateKey不合法!");
            return null;
        }
    }

    public static String getRandomAddress(String type) throws Exception {
            // 生成随机的ECKeyPair
            ECKeyPair ecKeyPair = Keys.createEcKeyPair();
            // 根据ECKeyPair生成Credentials对象
            Credentials credentials = Credentials.create(ecKeyPair);
            // 输出生成的私钥和地址
            if (type.equals("1")){
            String privateKey = credentials.getEcKeyPair().getPrivateKey().toString(16);
                return privateKey;
            }
            else if (type.equals("2")){
                String address = credentials.getAddress();
                return address;
            }
            else {
                return null;
            }
    }
}
View Code

插件准备

使用maven打包后,把jar包复制到apache-jmeter-5.4.3安装目录下\lib\ext

Jmeter使用

jmeter重启后,应该在取样器中能看见函数助手中找到该选项

 使用效果如下,后面有时间再做一个私钥签名的函数。

 

标签:return,String,自定义,privateKey,maven,Web3,import,jmeter
From: https://www.cnblogs.com/qgc1995/p/18290557

相关文章

  • 定制化正则化:在Mojo模型中动态应用自定义方法
    定制化正则化:在Mojo模型中动态应用自定义方法在机器学习模型的训练过程中,正则化是一种用于防止过拟合的技术,它通过在损失函数中添加一个额外的惩罚项来实现。Mojo模型,作为H2O.ai提供的一种模型部署格式,主要用于模型的序列化和预测。虽然Mojo模型本身不支持在模型部署后动态......
  • jmeter分布式no-gui 测试报告
    1、远程测试https://jmeter.apache.org/usermanual/remote-test.html 2、 3、进行分布式压测是,服务器需要先启动jmeter-sever,启动jmeter-sever建议加上nobup,后开运行,停止服务时,先停master,在停slave,不然可能有问题。linux上具体的压测命令如下:只有一台服务时,若堡垒机可......
  • uni-app使用ucharts地图,自定义Tooltip鼠标悬浮显示内容并且根据@getIndex点击事件获
    项目场景:uni-app使用ucharts地图,自定义Tooltip鼠标悬浮显示内容并且根据@getIndex点击事件获取点击的地区下标和地区名例如:问题描述官方给的文档有限,需要自己下载地图json数据然后自己渲染和编写鼠标悬浮显示内容以及获取点击地址名称,官方只给了@getIndex事件获取下......
  • 【WCH蓝牙系列芯片】-CH9141模块AT指令增加自定义透传UUID服务
    -------------------------------------------------------------------------------------------------------------------------------------在使用沁恒的蓝牙串口透传芯片CH9141,这是一个自带固件,拿来接上串口就可以直接用的蓝牙模块芯片。支持串口AT配置和在从机模式下......
  • Simple WPF: WPF自定义一个可以定义步长的SpinBox
    最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园。通过WPF的按钮、文本输入框实现了一个简单的SpinBox数字输入用户组件并可以通过数据绑定数值和步长。本文中介绍了通过Xaml代码实现自定义组件的布局,依赖属性的定义和使用等知识点。完整代码见Github组合Xaml......
  • element-plus自定义弹框头背景色
    1.效果如下:弹框头部定制背景色;关闭按钮和标题对齐;鼠标悬浮关闭按钮颜色变浅。2.用到element-plus版本:  "element-plus":"2.7.6",3.具体思路:整个弹框的背景色改成蓝色,padding:0;header、body、footer背景色改成白色,字体黑色不变;padding给20px;关闭按钮高度......
  • 一起学Hugging Face Transformers(13)- 模型微调之自定义训练循环
    文章目录前言一、什么是训练循环1.训练循环的关键步骤2.示例3.训练循环的重要性二、使用HuggingFaceTransformers库实现自定义训练循环1.前期准备1)安装依赖2)导入必要的库2.加载数据和模型1)加载数据集2)加载预训练模型和分词器3)预处理数据4)创建数据加载器3......
  • 通信协议_C#实现自定义ModbusRTU主站
    背景知识:modbus协议介绍相关工具mbslave:充当从站。虚拟串口工具:虚拟出一对串口。VS2022。实现过程以及Demo打开虚拟串口工具:打开mbslave:此处从站连接COM1口。Demo实现创建DLL库,创建ModbusRTU类,进行实现:usingSystem;usingSystem.Collections.Generic;usi......
  • 前端JS特效第22集:html5音乐旋律自定义交互特效
    html5音乐旋律自定义交互特效,先来看看效果:部分核心的代码如下(全部代码在文章末尾):<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>ChimeTime™</title><linkrel="stylesheet"href="css/style.css......
  • Simple WPF: WPF 自定义按钮外形
    最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园。WPF的按钮提供了Template模板,可以通过修改Template模板中的内容对按钮的样式进行自定义,完整代码Github自取。使用Style定义扁平化的按钮样式定义一个ButtonStyleDictonary.xaml资源字典文件,在ControlTemplate......