Browse Source

增加了SpeedTest 和PrintTime

410 2 years ago
parent
commit
93ba957525
1 changed files with 101 additions and 0 deletions
  1. 101 0
      web3/api/api.go

+ 101 - 0
web3/api/api.go

@@ -0,0 +1,101 @@
+package api
+
+import (
+	"fmt"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/common/hexutil"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/crypto"
+	"math"
+	"math/big"
+	"reflect"
+	"time"
+)
+
+func SignTransaction(nonce uint64, toAddressStr string, value *big.Int, gasLimit uint64, gasPrice *big.Int, data string, privateKeyHex string) (string, string, error) {
+	toAddress := common.HexToAddress(toAddressStr)
+
+	// 获取私钥对象
+	privateKey, err := crypto.HexToECDSA(privateKeyHex)
+	if err != nil {
+		return "nil", "nil", err
+	}
+
+	// 创建一个 Signer 对象
+	chainID := big.NewInt(1116) // 假设使用 Chain ID 为 1 的链
+	signer := types.NewEIP155Signer(chainID)
+
+	// 创建交易对象
+	tx := types.NewTransaction(nonce, toAddress, value, gasLimit, gasPrice, []byte(data))
+
+	// 对交易进行签名
+	signedTx, err := types.SignTx(tx, signer, privateKey)
+	if err != nil {
+		return "nil", "nil", err
+	}
+	rawData, _ := signedTx.MarshalBinary()
+	txNew := new(types.Transaction)
+	txNew.UnmarshalBinary((rawData))
+	return signedTx.Hash().Hex(), hexutil.Encode(rawData), nil
+}
+
+func PrintTime(args ...interface{}) {
+	t := time.Now().Format("2006-01-02 15:04:05.000000")
+	fmt.Print(t)
+	for _, arg := range args {
+		if f, ok := arg.(float64); ok {
+			fmt.Printf(" %.6f", f)
+		} else {
+			fmt.Print(" ", arg)
+		}
+	}
+	fmt.Println()
+}
+
+func SpeedTest(function interface{}, args ...interface{}) {
+	// 打印函数名和参数
+	PrintTime("functionName:", reflect.TypeOf(function).Name(), "args:", args)
+
+	// 转换函数类型为可调用的函数
+	fn := reflect.ValueOf(function)
+
+	// 执行一次函数以确保正确性
+	result := fn.Call(convertArgs(args))
+	PrintTime("return:", result)
+
+	// 初始化计时器和统计数据
+	minTime := time.Duration(math.MaxInt64)
+	maxTime := time.Duration(0)
+	initTime := time.Now()
+	count := 0
+
+	// 循环执行函数并计算执行时间
+	for time.Since(initTime) < time.Second {
+		lastTime := time.Now()
+		fn.Call(convertArgs(args))
+
+		chaTime := time.Since(lastTime)
+
+		// 更新最小和最大时间
+		if chaTime < minTime {
+			minTime = chaTime
+		}
+		if chaTime > maxTime {
+			maxTime = chaTime
+		}
+
+		count++
+	}
+
+	// 打印统计结果
+	PrintTime("avgTimes", count, "minTime", minTime.Seconds(), "maxTime", maxTime.Seconds())
+	// SpeedTest(SignTransaction, nonce, toAddress, value, gasLimit, gasPrice, data, privateKeyHex)
+}
+
+func convertArgs(args []interface{}) []reflect.Value {
+	values := make([]reflect.Value, len(args))
+	for i, arg := range args {
+		values[i] = reflect.ValueOf(arg)
+	}
+	return values
+}