PlatON提供了与传统rpc调用不同的区块链压测方式,在插件节点内部构造交易,通过p2p的方式随机向整个链广播交易。交易支持EVM,WASM合约交易与普通转账.压测插件已内置到节点本身,通过在启动节点的命令中增加 --rpcapi txgen
来开启压测插件的支持。
见目录或如下地址
https://github.com/PlatONnetwork/PlatON-Go
分支
benchmark-test
文件
eth/api_tps_cal.go
eth/api_tx_maker.go
注:插件会随着优化不断更新
- 插件节点会在固定的间隔时间内构造批量交易并发送。
- 交易的发送者会从当前的总账户中循环选取,交易的接受者则是从当前的总账户中随机随选。
- 记录每个账户交易发送的交易的nonce和回执的nonce,如果超过一定时间没有收到回执,会重发该交易.
- 合约交易的构造主要支持两种方式:
- 固定参数,每次调用该合约的参数都是相同
- 动态参数,根据用户配置的参数动态生成参数,该功能目前仅支持erc20与kv合约
- 交易构造完成后会选择任意5个对端节点以p2p方式广播交易.
- 在交易发送的过程中会记录每笔交易的发送时间,交易延迟 = 交易被打包的区块头的时间-交易的发送时间。平均交易延迟时间,区块头时间在这个时间段内的所有交易的的交易延迟的平均值。
- 在创世文件中配置好此次所有需要参与转账的账户,账户中需要配置足够多的钱,启动链
- 部署合约,待部署合约部署完成后,更新插件配置文件并分发到每个交易插件节点
- 根据配置文件启动插件开始压测
- 压测完成生成压测数据统计并计算
插件配置文件说明
{
//wasm合约配置
"wasm": [
{
//部署合约的交易hash,调用txgen_deployContracts后自动生成
"deploy_contract_tx_hash": "0xfd4ba0e7e37d78004028659f9ea0d7cd112d773c045a8518bd2be68142438303",
//部署此合约需要的gas
"deploy_gas_limit": 83179,
//合约的类型
"contracts_type": "Donothing",
//合约的名称
"name": "wasm_code",
//合约的内容
"contracts_code": "0xabc",
//合约的地址,调用txgen_updateConfig后自动生成
"contracts_address": "lax1u3a23l4ymylef3257yhfkdyxyaekvtaun6rvpy",
//此合约在所有wasm合约中的权重,发送wasm合约时会根据权重值随机选择合约发送
"call_weights": 0,
//合约调用时的参数类型,0为固定参数,1为动态生成参数
"call_kind": 0,
"call_config": [
{
//合约调用时的gas消耗
"call_gas_limit": 25514,
//合约调用时的参数,如果call_kind为1,则启用此参数
"call_input": "c988751e30bc23ebbc78",
//合约调用时的参数,如果call_kind为0,则根据如下参数来动态生成调用参数
"parameters": []
}
]
}
],
//evm合约配置,参数同wasm
"evm": [],
//参与交易的用户
"tx": [
{
//私钥
"private_key": "8b2a0625f5272a2655e79a90fa14b315603f8fa3a75c90d54ed85c3e044e6e71",
//地址
"address": "lax19pv24mwfxpkyvcxeqjw75x94wugq82y94eqe56"
}
]
}
部署要测试的合约,调用后会在配置文件中更新合约的交易hash
- prikey string 发起合约部署的私钥,此私钥必须有钱
- configPath string 插件配置文件
无
// Request
curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"txgen_deployContracts","params":["8b2a0625f5272a2655e79a90fa14b315603f8fa3a75c90d54ed85c3e044e6e71","/opt/private_keys.json"],"id":1}' http://localhost:6691
// Result
{"jsonrpc":"2.0","id":1,"result":null}
更新配置文件,调用后会在配置文件中更新合约信息
- configPath string 插件配置文件
无
// Request
curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"txgen_updateConfig","params":["/opt/private_keys.json"],"id":1}' http://localhost:6691
// Result
{"jsonrpc":"2.0","id":1,"result":null}
启动交易插件,对外广播交易
- normalTx,evmTx,wasmTx uint,这三个参数控制普通转账,evm,wasm合约调用的发送比例,例如1,1,1,插件会循环发送1笔普通转账,1笔evm合约调用,1笔wasm合约调用.
- totalTxPer uint ,每次发送多少笔交易
- activeTxPer uint ,每次发送的交易中,活跃账户发送的交易占多少笔,不能大于totalTxPer
- txFrequency uint,控制发送的频率,单位ms,每隔多少ms广播一次交易
- activeSender uint,活跃账户的数量,活跃账户的数量不能大于此插件参与交易构造的账户的数量
- sendingAmount uint64,转账交易的转账金额
- configPath string,插件配置文件地址
- start, end uint,此插件参与交易构造的账户
- waitAccountReceiptTime uint,最大等待交易回执的时间,单位s,如果超过该时间,交易会重新发送
无
// Request
curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"txgen_start","params":[1,0,0,306,0,100,0,1,"/opt/platon/private_key.json",5,2667,10],"id":1}' http://127.0.0.1:6789
// Result
{"jsonrpc":"2.0","id":1,"result":null}
停止压测,并将压测统计的原始数据输出到指定文件中
- resPath string 压测统计数据输出文件地址
无
// Request
curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"txgen_stop","params":["/opt/platon/res.json"],"id":1}' http://localhost:6789
// Result
{"jsonrpc":"2.0","id":1,"result":null}
根据txgen_Stop中输出的文件计算tps,交易延迟统计数据
- resPaths []string, 所有压测节点的统计的原始数据
- output string,计算后的tps与交易延迟,生成位置
- time int ,时间间隔,每隔固定的时间统计该时间段内的平均tps和交易延迟
无
// Request
curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"txgen_calRes","params":[["/home/juzix/res.json","/home/juzix/res2.json","/home/juzix/res3.json"],"/home/juzix/交易延迟.xlsx",10],"id":1}' http://localhost:6789
// Result
{"jsonrpc":"2.0","id":1,"result":null}