forked from cerc-io/laconicd-deprecated
tests: add message call benchmark (#717)
Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com>
This commit is contained in:
co-authored by
Federico Kunze Küllmer
parent
e04422b6ff
commit
7c7f3f02bb
@@ -32,6 +32,22 @@ func SetupContract(b *testing.B) (*KeeperTestSuite, common.Address) {
|
||||
return &suite, contractAddr
|
||||
}
|
||||
|
||||
func SetupTestMessageCall(b *testing.B) (*KeeperTestSuite, common.Address) {
|
||||
suite := KeeperTestSuite{}
|
||||
suite.DoSetupTest(b)
|
||||
|
||||
amt := sdk.Coins{ethermint.NewPhotonCoinInt64(1000000000000000000)}
|
||||
err := suite.app.BankKeeper.MintCoins(suite.ctx, types.ModuleName, amt)
|
||||
require.NoError(b, err)
|
||||
err = suite.app.BankKeeper.SendCoinsFromModuleToAccount(suite.ctx, types.ModuleName, suite.address.Bytes(), amt)
|
||||
require.NoError(b, err)
|
||||
|
||||
contractAddr := suite.DeployTestMessageCall(b)
|
||||
suite.Commit()
|
||||
|
||||
return &suite, contractAddr
|
||||
}
|
||||
|
||||
type TxBuilder func(suite *KeeperTestSuite, contract common.Address) *types.MsgEthereumTx
|
||||
|
||||
func DoBenchmark(b *testing.B, txBuilder TxBuilder) {
|
||||
@@ -97,6 +113,37 @@ func BenchmarkTokenMint(b *testing.B) {
|
||||
})
|
||||
}
|
||||
|
||||
func BenchmarkMessageCall(b *testing.B) {
|
||||
suite, contract := SetupTestMessageCall(b)
|
||||
|
||||
input, err := types.TestMessageCall.ABI.Pack("benchmarkMessageCall", big.NewInt(10000))
|
||||
require.NoError(b, err)
|
||||
nonce := suite.app.EvmKeeper.GetNonce(suite.address)
|
||||
msg := types.NewTx(suite.app.EvmKeeper.ChainID(), nonce, &contract, big.NewInt(0), 25000000, big.NewInt(1), nil, nil, input, nil)
|
||||
|
||||
msg.From = suite.address.Hex()
|
||||
err = msg.Sign(ethtypes.LatestSignerForChainID(suite.app.EvmKeeper.ChainID()), suite.signer)
|
||||
require.NoError(b, err)
|
||||
|
||||
b.ResetTimer()
|
||||
b.StartTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
ctx, _ := suite.ctx.CacheContext()
|
||||
|
||||
// deduct fee first
|
||||
txData, err := types.UnpackTxData(msg.Data)
|
||||
require.NoError(b, err)
|
||||
|
||||
fees := sdk.Coins{sdk.NewCoin(suite.EvmDenom(), sdk.NewIntFromBigInt(txData.Fee()))}
|
||||
err = authante.DeductFees(suite.app.BankKeeper, suite.ctx, suite.app.AccountKeeper.GetAccount(ctx, msg.GetFrom()), fees)
|
||||
require.NoError(b, err)
|
||||
|
||||
rsp, err := suite.app.EvmKeeper.EthereumTx(sdk.WrapSDKContext(ctx), msg)
|
||||
require.NoError(b, err)
|
||||
require.False(b, rsp.Failed())
|
||||
}
|
||||
}
|
||||
|
||||
func DoBenchmarkDeepContextStack(b *testing.B, depth int) {
|
||||
begin := []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
|
||||
end := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
|
||||
|
||||
@@ -311,6 +311,61 @@ func (suite *KeeperTestSuite) TransferERC20Token(t require.TestingT, contractAdd
|
||||
return ercTransferTx
|
||||
}
|
||||
|
||||
// DeployTestMessageCall deploy a test erc20 contract and returns the contract address
|
||||
func (suite *KeeperTestSuite) DeployTestMessageCall(t require.TestingT) common.Address {
|
||||
ctx := sdk.WrapSDKContext(suite.ctx)
|
||||
chainID := suite.app.EvmKeeper.ChainID()
|
||||
|
||||
data := types.TestMessageCall.Bin
|
||||
args, err := json.Marshal(&types.TransactionArgs{
|
||||
From: &suite.address,
|
||||
Data: (*hexutil.Bytes)(&data),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
res, err := suite.queryClient.EstimateGas(ctx, &types.EthCallRequest{
|
||||
Args: args,
|
||||
GasCap: uint64(config.DefaultGasCap),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
nonce := suite.app.EvmKeeper.GetNonce(suite.address)
|
||||
|
||||
var erc20DeployTx *types.MsgEthereumTx
|
||||
if suite.dynamicTxFee {
|
||||
erc20DeployTx = types.NewTxContract(
|
||||
chainID,
|
||||
nonce,
|
||||
nil, // amount
|
||||
res.Gas, // gasLimit
|
||||
nil, // gasPrice
|
||||
suite.app.FeeMarketKeeper.GetBaseFee(suite.ctx),
|
||||
big.NewInt(1),
|
||||
data, // input
|
||||
ðtypes.AccessList{}, // accesses
|
||||
)
|
||||
} else {
|
||||
erc20DeployTx = types.NewTxContract(
|
||||
chainID,
|
||||
nonce,
|
||||
nil, // amount
|
||||
res.Gas, // gasLimit
|
||||
nil, // gasPrice
|
||||
nil, nil,
|
||||
data, // input
|
||||
nil, // accesses
|
||||
)
|
||||
}
|
||||
|
||||
erc20DeployTx.From = suite.address.Hex()
|
||||
err = erc20DeployTx.Sign(ethtypes.LatestSignerForChainID(chainID), suite.signer)
|
||||
require.NoError(t, err)
|
||||
rsp, err := suite.app.EvmKeeper.EthereumTx(ctx, erc20DeployTx)
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, rsp.VmError)
|
||||
return crypto.CreateAddress(suite.address, nonce)
|
||||
}
|
||||
|
||||
func TestKeeperTestSuite(t *testing.T) {
|
||||
suite.Run(t, new(KeeperTestSuite))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user