分享一下我是如何对以太坊兼容链进行性能测试的 这是第一步:准备账户资金和合约数据
项目地址:https://github.com/sunchengzhu/eth-prepare
相关文章:以太坊兼容链性能测试2—性能数据统计、以太坊兼容链性能测试3—开展测试
先给从助记词第1个账户一个个转给第一批账户,如间隔500个,即给助记词第500、1000、1500...个账户转账。再在多进程中由这第一批账户转给其间隔段的账户,如第500个账户会转给第500~999个账户,这样就能完成所有账户的充值。
为什么要设置这个第一批账户呢?
如果所有转账都由第1个账户发起,那么在不同的进程中可能会取到同样的nonce值,导致交易失败。
为什么要给这么多账户充值?例子中配置了1w个账户
安装依赖包
npm install
编译合约
npx hardhat compile
在项目根目录下新建.env文件,配置环境变量,可以参考如下配置:
从助记词MNEMONIC
生成的第一个账户分发FTM,给助记词生成的ACCOUNTSNUM
个账户每个都充值DEPOSITAMOUNT
个FTM,充值之后检查这ACCOUNTSNUM
个账户是否都有至少MINAMOUNT
个FTM。
MNEMONIC='strike gather blush lens excite ridge flock random empty remember text universe'
COUNT=500
ACCOUNTSNUM=10000
DEPOSITAMOUNT=0.01
MINAMOUNT=0.001
部署批量转账合约并将合约地址加到配置中
如果给一个个账户转FTM的话非常低效,通过合约批量转账好点,考虑到交易体大小有限制,一次交易最多给50个账户转。
npx hardhat test --grep "deploy BatchTransfer" --network fantom_testnet
给第一批账户转入FTM
从助记词第一个账户给间隔COUNT
的账户转入DEPOSITAMOUNT
×COUNT
×1.1个FTM。之所以是DEPOSITAMOUNT
×COUNT
×1.1个FTM而不是DEPOSITAMOUNT
×COUNT
个FTM,是为了让第一批账户有钱支付手续费。
npx hardhat test --grep "recharge" --network fantom_testnet
多进程分发FTM(默认4个进程)
从第一批账户通过批量转账合约给所有账户充值
bash run.sh deposit fantom_testnet
多进程检查账户余额
bash run.sh afterDeposit fantom_testnet
这里最好把COUNT改成较小的值比如5,不然hardhat生成COUNT数的sigenrs这步会比较慢,影响case执行速度。
以往我在测试联盟链的时候会用和这个类似的合约进行压测,因为联盟链比较多的是存证场景,在链上存东西,这里我主要是部署一个有简单函数的合约,后续调用eth_call
接口压测。
部署合约
npx hardhat test --grep "deploy SimpleStorage" --network fantom_testnet
保存合约地址和data
,后面压测要用
simpleStorage address: 0x6Fc1E7631D24b6173d975a892ba5563E8C04CB9f
tx data: 0x20965255
用eth_call
调用一下合约的getValue
函数
curl https://rpc.testnet.fantom.network \
-X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_call","params":[{"from":"0x045346bE7C2915F96c9261BEE90d3FF9005a6c2b","to":"0x6Fc1E7631D24b6173d975a892ba5563E8C04CB9f","data":"0x20965255"}, "latest"],"id":1}'
看etherscan gastracker上的排名,现在在公链上最多的场景还是token转换。所以这里我们也部署uniswap V2合约进行压测,我们选取swapExactETHForTokens
函数进行压测,用账户的资金(1000wei)换token,这样比较简单,因为我们对每个账户已经进行了充值都有资金,只需要一开始给这个token增加流动性即可。如果要压测swapExactTokensForETH
函数的话,每个账户都需要充值该token以及执行approve
授权uniswap路由合约操作token。
部署合约并执行一次swapExactTokensForETH
获取data
npx hardhat test --grep "deployAndSwap" --network fantom_testnet
保存uniswap路由合约地址和data,后面压测要用
uniAddress: '0x7C7087d81c5f4Bd7EA30A5e13095414395DfD4F1'
data: 0x7ff36ab50000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008000000000000000000000000079026e949ba3ef5c854186244d1597a369bc326d00000000000000000000000000000000000000000000000000005af3107a3fff0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a6465996d9b1c6e82a65d4503d07ee1f68ed3a34000000000000000000000000a37614c751f37cbc54c5223254e8695024fa36c7
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!