「以太坊」性能测试教程

Posted 趣链科技

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「以太坊」性能测试教程相关的知识,希望对你有一定的参考价值。

前言

HyperBench 为区块链提供了一套通用的性能测试方案,能够适配多种不同的区块链平台,基于脚本和虚拟机可以灵活快速地构建区块链性能测试用例,秉承高效、灵活、可扩展的设计理念,为区块链性能测试标准化、易用化助力,促进区块链技术发展,更好地为区块链业务赋能。

本篇我们主要为大家介绍如何使用HyperBench去测试以太坊。

快速开始

【前置要求】

编译HyperBench需要go版本为1.11及以上版本,使用下方wget命令即可下载go官网安装包:

wget https://golang.google.cn/dl/go1.17.7.linux-amd64.tar.gz

下载完成后将压缩包解压至/usr/local/;

tar -zxvf go1.17.7.linux-amd64.tar.gz -C /usr/local

解压完成后 vim 打开/etc/profile 文件,添加go相关环境变量;


vim /etc/profile

export GOROOT=/usr/local/go 
export GOPATH=/usr/local/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

添加完成后 使用source命令使变量配置生效;


source /etc/profile          --使变量配置生效    
go version                   --查看golang的版本
#使用go version命令查看go是否安装完成
go version go1.17.7 linux/amd64        --打印输出

完成go环境配置后,首先使用go env命令为go添加一个国内的代理,这里是为了使go在安装一些依赖时可以更快的安装完成;

go env -w GOPROXY=https://goproxy.cn,direct

在编译HyperBench之前需要使用go get命令安装packr二进制,packr会在编译HyperBench时使用到,所以需要提前安装好;

go get -u github.com/gobuffalo/packr/v2/packr2

【编译安装HyperBench】

环境准备完成,那么接下来为大家介绍HyperBench源代码的clone以及编译。

首先源码可以通过github中HyperBench开源项目库clone到本地,项目可以使用https://github.com/hyperbench 进入,项目中可以看到三个库,本次视频使用到的库为hyperbench、hyperbench-plugins,进入到HyperBench仓库,在code菜单中选择https,点击地址右侧复制按钮。

接下来开始clone与编译HyperBench:

#首先创建一个hyperbench的运行目录并进入到目录
mkdir /opt/hyperbench 
cd /opt/hyperbench
#然后使用git命令将hyperbench源码clone到本地
#这边为了方便演示所有的源码都已经clone好了,所以就只展示下
git clone https://github.com/hyperbench/hyperbench.git

#clone完成后进入到hyperbench源码目录
cd hyperbench

#使用make build命令编译hyperbench
make build

#编译完成后使用help来查看编译是否成功
./hyperbench --help
#如果有输出hyperbench命令使用说明则代表编译成功
Usage:
  hyperbench [command]

Examples:
hyperbench --doc ./doc (generate document to specify path)

Available Commands:
  completion  Generate the autocompletion script for the specified shell
  help        Help about any command
  init        init a stress test dir
  new         initialize a test plan
  start       start a benchmark
  version     get code version
  worker      start as a worker server

Flags:
      --debug        enable debug mode
      --doc string   use to create doc and specify the doc path
  -h, --help         help for hyperbench

Use "hyperbench [command] --help" for more information about a command.


HyperBench主程序编译完成后,还需要编译HyperBench的区块链适配插件


#进入到前面所创建的hyperbench目录
cd /opt/hyperbench
#使用git命令将hyperbench-plugins源码clone本地
git clone https://github.com/hyperbench/hyperbench-plugins.git


#clone完成后进入到hyperbench-plugins目录
cd hyperbench-plugins
#目录中可以看到hyperbench所适配的各个区块链平台
#本次视频是介绍hyperbench对以太坊区块链平台的测试,所以进入以太坊目录
cd eth/
#进入目录后使用make build命令编译插件
make build
#编译完成后可以在当前目录看到eth.so文件
#需要将eth.so文件copy到hyperbench主程序所在的目录
cp eth.so ../../hyperbench/eth.so

【编译安装并配置启动geth】

HyperBench主程序与插件编译完成后,我们还需要搭建一条以太坊私有链以作测试:

#首先创建一个geth目录
mkdir /opt/geth/
#进入目录
cd /opt/geth/
#进入到github上以太坊项目库
#使用git命令clone 以太坊源码
git clone https://github.com/ethereum/go-ethereum.git
#clone完成后进入源码目录
cd ethereum
#使用make命令编译geth主程序
make geth
#进入到build/bin/目录就能看到geth主程序
cd ./build/bin/
#使用./geth version查看编译是否成功
./geth version
#成功输出了版本信息则代表编译成功
#然后将geth文件copy到/usr/local/bin/目录,这样就可以在任何目录下执行geth命令
cp ./geth /usr/local/bin/

接下来需要创建geth初始化文件,本次教程重点在HyperBench,所以就不详细介绍geth的配置了。

初始化文件中需要注意的是alloc配置项,此配置项是以太坊区块链私链的创世账户,如果初始化时没有创建创世账户并且分配一定的原生币,那在后续测试中的转账交易就无法完成转账。

如果自己在测试中没有创世账户的话,可以使用本次教程提供的账户:


vim genesis.json


  "config": 
    "chainId": 777,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0,
    "constantinopleBlock": 0,
    "petersburgBlock": 0,
    "istanbulBlock": 0,
    "ethash": 
  ,
  "nonce": "0x0",
  "timestamp": "0x5ddf8f3e",
  "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "gasLimit": "0x2540be400",
  "difficulty": "0x00002",
  "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x0000000000000000000000000000000000000000",
  "alloc": 
        "0x4e5786bf8546e60ca38aa68eb8dc82b1b24d26f3": 
            "balance": "100000000000000000000000000000000"
        
   ,
  "number": "0x0",
  "gasUsed": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"

创建geth数据目录,并初始化目录

mkdir /opt/geth1/
#执行初始化命令
./geth --datadir /opt/geth1/ init ./genesis.json
#执行返回如下则为成功
INFO [10-18|10:41:55.859] Maximum peer count                       ETH=50 LES=0 total=50
INFO [10-18|10:41:55.860] Smartcard socket not found, disabling    err="stat /run/pcscd/pcscd.comm: no such file or directory"
INFO [10-18|10:41:55.864] Set global gas cap                       cap=50,000,000
INFO [10-18|10:41:55.865] Allocated cache and file handles         database=/opt/geth1/geth/chaindata cache=16.00MiB handles=16
INFO [10-18|10:41:56.236] Opened ancient database                  database=/opt/geth1/geth/chaindata/ancient/chain readonly=false
INFO [10-18|10:41:56.236] Writing custom genesis block
INFO [10-18|10:41:56.238] Persisted trie from memory database      nodes=1 size=153.00B time="171.63µs" gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [10-18|10:41:56.239] Successfully wrote genesis state         database=chaindata                               hash=ced4ca..c9a1f8
INFO [10-18|10:41:56.239] Allocated cache and file handles         database=/opt/geth1/geth/lightchaindata          cache=16.00MiB handles=16
INFO [10-18|10:41:56.513] Opened ancient database                  database=/opt/geth1/geth/lightchaindata/ancient/chain readonly=false
INFO [10-18|10:41:56.513] Writing custom genesis block
INFO [10-18|10:41:56.514] Persisted trie from memory database      nodes=1 size=153.00B time="91.645µs" gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [10-18|10:41:56.515] Successfully wrote genesis state

初始化完成后,在/opt/geth1/keystore/目录下新增文件

这个文件是在genesis.sjon配置中的创世账户的私钥,默认分配了余额

vim UTC--2022-10-17T08-41-53.685200708Z--4e5786bf8546e60ca38aa68eb8dc82b1b24d26f3
#文件内容
"address":"4e5786bf8546e60ca38aa68eb8dc82b1b24d26f3","crypto":"cipher":"aes-128-ctr","ciphertext":"f26e27f300b7ba46e968f8c656e534cbb706a15c825eb351d2ba4690d1b6bf26","cipherparams":"iv":"bbb9f922fc48bcb2c1fb566453f328d8","kdf":"scrypt","kdfparams":"dklen":32,"n":262144,"p":1,"r":8,"salt":"f0ffc7fa97c82b94c2fcea53127ea3b8d5110c020830089283173e9d998cb8d9","mac":"2b6bdb9ae958ff55516ac313f4b68d5a8c66df018103903d1348a7158fe1fd2c","id":"654e1fa7-9c06-4643-bc3d-26b6186ff2cf","version":3


启动geth

#使用geth命令启动以太坊私链vim sc
nohup geth --datadir "/opt/geth1/" --http --http.addr=0.0.0.0 --http.port 8545 --authrpc.port 8552 --http.corsdomain "*" --http.api "eth,net,web3,personal,admin,txpool,debug,miner" --nodiscover --maxpeers 30 --networkid 1981 --port 30303 --allow-insecure-unlock  2>> /opt/geth1/geth.log &
#启动命令中需要注意的是 --http.port 后续再hyperbench配置中会使用到

#启动命令中需要注意的是 --http.port 后续再hyperbench配置中会使用到


#进入geth数据目录
cd /opt/geth1/
#使用命令进入geth控制台
geth attach ./geth.ipc
#执行eth.acccounts查看当前链上账户
>eth.accounts
["4e5786bf8546e60ca38aa68eb8dc82b1b24d26f3"]
#如正确输出账户地址则代表启动成功

确认启动成功后,需要新增一个账户

#新增账户时为了方便测试,需要创建没有密码的账户
personal.newAccount("")

至此我们已经完成了以太坊私链的配置,结下来仅需配置HyperBench测试脚本启动我们的测试,详细完整的操作可在 ↓演示视频↓ 中进行学习!

视频教程

https://v.qq.com/x/page/g3364pal2qb.html

【License】

HyperBench目前使用Apache 2.0许可证。具体请参见 github LICENSE文件👇

✨ 开源小贴士 ✨

对HyperBench感兴趣的小伙伴,可添加微信小助手18458407117,进入技术交流群讨论.

HyperBench github

https://github.com/hyperbench/hyperbench

HyperBench quickstart

https://github.com/hyperbench/hyperbench/blob/master/README.md

以太坊开发教程

以太坊开发教程

一、以太坊环境搭建

线上测试不需要额外代码就可以自动部署,学习的时候可以节约大量时间。但是最后我们的项目还是要落地到我们自己的节点中,所以后面会有本地配置流程
我这里使用的是以太坊提供的Remix

1.配置编译参数

左侧菜单第二项为编译菜单
可以设置编译器版本,bilibili教程中所教的代码语法为0.4.x版本的语法,所以这里我们选择0.4.x版本的
编译器

2.部署并调试

左侧菜单第三项为调试菜单
可以部署并调试智能合约,环境我们这里选择JavaScript的虚拟机。

3.本地配置流程

安装linux虚拟机
后面的测试用环境对windows的支持并不友好,经常会出现命名冲突,windows10新版自带的linux子
系统不能完全满足开发需要,偶尔有兼容性上的一些问题。这里建议windows平台的朋友装一个linux
虚拟机,mac平台的朋友可以跳过这一步。
这里我使用的是VMware workstation 16虚拟机平台和Ubuntu20的系统镜像。

3.1 配置虚拟机

这里选择之前下载的ubuntu20系统镜像

这里注意选择自定义硬件


将网络连接模式改为桥接

根据自己设备的情况分配处理器、内存和硬盘,建议内存大于等于4g,处理器大于等于本机处理
器线程数的1/2,硬盘大于等于30g。(因为调试时需要本机挖矿来生成区块链,所以处理器算力,内存大小很重要)
一直下一步,直到虚拟机部署并自动安装系统。
安装系统过程中最好断开网络连接,这样安装会快一些

3.2 配置镜像源(可选)

这一步的目的是加快ubuntu软件安装和更新的速度,不需要的同学可以跳过。
教程
清华镜像源官网

3.3 虚拟机配置

设置语言为中文(可选),设置方法:
打开应用抽屉

打开设置


选择地区和语言

手动安装语言


安装/删除语言

勾选简体中文,点击apply

等安装完成后,点击

修改这两项为中文

4 安装Node.js

在桌面上右键打开终端,输入命令

sudo apt install nodejs -y 
sudo apt install npm -y

换源

sudo npm install -g cnpm --registry=https://registry.npm.taobao.org

等待安装结束(终端下面会显示进度条)

5 安装truffle

安装truffle(根据网络情况可能需要很久)

sudo cnpm install -g truffle

在本地项目目录下打开新终端,输入

truffle version

出现如下输出证明truffle安装成功

建立项目模版

在本地项目目录下打开终端,输入

truffle unbox vue-box

正常情况等待一段时间会输出如下内容,表示模版建立成功
默认模版是针对mac系统的,linux系统可能会报一些warnning但不影响正常使用

如果遇到如下报错,需要梯子,详情见搞一个梯子。

6 安装vue

安装vue

sudo cnpm install -g vue

安装vue脚手架

sudo cnpm install -g @vue/cli

测试安装是否成功

vue -V


启动脚手架可视化界面

vue ui


导入vue项目所在目录,即项目目录下的vapp

7 使用一个IDE

这里我按照习惯用的是VScode,bilibili教程中有其他支持solidity语法提示的IDE可供选择。以下是VScode的配置方法
下载并安装VScode
如果是在ubuntu的firefox浏览器中下载,这一步记得选择保存

等待下载完成
找到安装包所在目录,双击安装包,在弹出的SoftwareStore界面中点击安装
安装后在应用抽屉中就可以找到VScode

7.1 安装VScode插件

  • 中文语言包
  • JavaScript语法提示插件
  • solidity语法提示插件
  • vetur语法提示插件
  • 以及其他开发过程中需要的插件
    这些是我安装的插件以及插件的作者

8 编写代码

在VScode里打开项目所在文件夹就可以开始编写自己的代码啦,下面开始我们第一次本地运行私链和智能合约吧
第一次本地测试项目(前端)
配了半天环境了,终于是时候试试让我们的代码跑起来了。让我们看看现在我们的环境里都有什么,都能做到什么。
Node.js、truffle、vue、IDE,看起来前端需要的东西我们都有了。记得前面用truffle建的vue-box模
版么?我们试着跑起来吧。
启动测试网络

  • 用VScode打开项目
  • 点击终端-新终端,启动一个终端
  • 启动开发用区块链
truffle develop

编译智能合约

compile

部署智能合约

migrate

9 命令行方式进行交互

刚才我们实际上进入了truffle的命令行界面

实际上这个命令行是一个交互式的JavaScript窗口,这里输入的指令与JavaScript语法是完全一致
的。
比如输入

let token 
token = TutorialToken.deployed().then(instance => token = instance);

我们实际上使用了JavaScript里面的匿名函数获取了部署的TutorialToken智能合约的一个引用
token,接下来我们可以利用这个引用来调用智能合约了。
还记得之前启动网络之后输出的那些账号么?他们现在被保存在accounts这个对象中。

token.balanceOf(accounts[0]);

我们得到了0号账户中所拥有的货币数2ee0,化成十进制恰好是我们合约中生成的初始货币量12000

接下来我们转账到1号账户

token.transfer(accounts[1], 10) token.balanceOf(accounts[1])

我们可以看到余额是a,待办转账10个货币成功
其他truffle命令行中可以使用的对象和方法(实际上是Web3.js提供的)见以太坊中文文档官方文档

10 用网页来进行交互

命令行的界面我们自己用用可以,给用户们的界面可必须是图形化的。我们之前的vue项目这事就
派上用场了。
点击VScode当前终端旁边的+号,打开一个新终端
输入

cd vapp 
vue ui

我们进入了vue-cli的图形化界面
进入任务菜单,选择serve

点击运行,等待编译部署完成后点击启动app

我们就可以看到图形化的网页啦,至于怎么把这个网页变成我们想要的样子就要靠前端的朋友了。
虽然我们现在已经成功的在本地跑起了智能合约项目,但是我们其实跳过了一个步骤,那就是私链。我们现在的私链是利用truffle集成的Ganache一键部署的,这个私链是什么,长什么样,我们怎么操控还一无所知。所以接下来我们要弄一个自己的私链。

10 以太坊私链搭建

10.1 安装Go编译器、curl、file、git

sudo apt install build-essential curl file git -y

10.2 安装brew包管理器

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

配置环境变量,在同一个终端输入

test -d ~/.linuxbrew && eval $(~/.linuxbrew/bin/brew shellenv) 
test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv) 
test -r ~/.bash_profile && echo "eval \\$($(brew --prefix)/bin/brew shellenv)" >>~/.bash_profile echo "eval \\$($(brew --prefix)/bin/brew shellenv)" >>~/.profile

重启
测试并安装依赖
网络状态不好的话可能要等待很久,不要急

brew install hello

安装go编译器,总计475M,注意网络

brew install go

10.3 安装geth

这一步可能会遇到许多不确定的问题,下面提供3种方法,可以挨个试一下,我是方法二安装成功的

方法一:编译git源码

从ftp或官网下载geth项目压缩包
解压到linux的任意目录中
在解压出的目录中打开终端输入

make geth

具体请见教程

方法二: 利用brew包管理器安装

brew tap ethereum/ethereum 
brew install ethereum 
brew install geth

方法三:利用PPAs为apt包管理器添加源
注意:仅Ubuntu系统和debian系统包含apt包管理器,其他系统请优先尝试其他方法

sudo add-apt-repository -y ppa:ethereum/ethereum 
sudo apt update 
sudo apt install ethereum

10.4 安装solidity

这一步也可能会遇到许多不确定的问题,下面提供三种方法,我用的是方法三

方法一:利用brew包管理器

mac可用,linux目前有些问题

brew install solidity

方法二: 利用snap包管理器

linux可用

sudo snap install solc

方法三:利用PPAs为apt包管理器添加源

注意:仅Ubuntu系统和debian系统包含apt包管理器,其他系统请优先尝试其他方法

sudo add-apt-repository -y ppa:ethereum/ethereum 
sudo add-apt-repository ppa:ethereum/ethereum-dev 
sudo apt update 
sudo apt install solc

10.5 建立私链

定义私链初始化配置文件

  • 新建一个目录privateChain用于存放私链相关数据
  • 新建一个名为genesis.json的文件(可以用VScode,也可以直接用vi)
  • 将如下内容写入genesis文件

"config":  
	"chainId": 111, 
	"homesteadBlock": 0, 
	"eip150Block": 0, 
	"eip155Block": 0, 
	"eip158Block": 0, 
	"byzantiumBlock": 0, 
	"constantinopleBlock": 0, 
	"petersburgBlock": 0, 
	"istanbulBlock": 0 ,
"alloc": , 
"coinbase": "0x0000000000000000000000000000000000000000", "difficulty": "0x20000", 
"extraData": "", 
"gasLimit": "0x2fefd8", 
"nonce": "0x000000000000023d", 
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", 
"timestamp": "0x00" 

difficulty是指挖矿难度,配置低的机器建议调低难度,我这里使用的是默认值20000
gaslimit指单次操作消耗gas的限制
alloc中的内容为预分配的账户地址和余额
chainId指当前链的ID
nonce指区块链目标nonce值
coinbase指矿工基址

10.6 初始化区块链网络

在privateChain中打开终端,输入:

geth --datadir dataD init ./genesis.json

建立第一个节点
privateChain中打开终端,输入:
将–rpcaddr参数后面的地址换成本机ip地址,查看本机ip地址方法见查看本机ip地址

geth --datadir dataD --http --http.addr 192.168.126.129 --http.port 8989 --port 3000

geth命令的详细说明在github

10.7 使用钱包连接私链

后端开发过程中总不能一直依赖命令行与geth交互,那样虽然非常程序员,但是太浪费时间了,而且不直观。我们需要搞一个别人写好的图形化客户端——钱包。
目前常见的开发过程中使用的钱包有三种,MetaMask、Mist的变种myetherwallet、parity。
我们这里使用MetaMask作为我们的工具,MetaMask是一个浏览器插件,不需要像其他钱包那样依赖本地环境运行,非常方便。
安装教程

11 其他

11.1 搞一个梯子

由于众所周知的原因,我们通常无法访问托管在Azune或者google上的项目,很不巧ethereum的许多工具都托管在Azune和Google上。所以我们需要搞一个梯子。大家可以用自己的梯子,没有梯子的可以修改hosts。 以下是一种梯子和一种修改hosts的手段

  • 安装SSR客户端
    查看教程,根据方法2安装图形化的客户端并配置
    里面已经挂掉的项目安装包ftp上有备份,可以下载。
  • 修改hosts的方法
    mac教程 linux教程
    linux系统hosts替换方法: 找到目标hosts文件放到任意目录,在目录中打开终端,输入
sudo cp ./hosts /etc/hosts

后面开发过程中遇到的无法下载某一个工具的问题,可以试一试翻一下

11.2 查看本机ip地址

之前虚拟机硬件配置中如果选择了桥接,这里看到的就是与物理机同级的内网地址,可以与物理机互相访问,可以通过配置上级路由器实现公网访问。但如果选择了nat,这里看到的是以物理机为二级路由的下一级内网地址,物理机无法直接访问,也很难进行公网穿透。
打开终端输入:

ifconfig -a

找到如下字段,即为本机ip地址

12 一些或许有用的资料

brew官网
brew——GitHub
truffle文档
drizzle文档
drizzle文档
中文以太坊项目实战教程——文档
solidity教程——视频
从零构建以太坊教程——视频 !有非常多的错误,但是东西很全,只建议参考,不建议跟着做
在线solidityIDE-Remix
geth——GitHub
以太坊官方搜集的资料
web3.js英文文档
web3.js中文文档
vue官网
Mist——GitHub
EthFans指南!推荐
MetaMask下载
MetaMask文档

以上是关于「以太坊」性能测试教程的主要内容,如果未能解决你的问题,请参考以下文章

开源区块链系统aelf性能测试系列文章 AELF vs ETH - 01

区块链以太坊(Ethereum )高级进阶实战视频教程

免费下载全套最新03区块链以太坊理论视频教程+教学资料+学习课件+源代码+软件开发工具

区块链入门教程以太坊源码分析fast sync算法一

区块链教程以太坊源码分析以太坊随机数生成方式一

区块链系列教程