Skip to content

Commit 46e9515

Browse files
committed
Add gas cost for unpacking any message
1 parent 5f0b5ef commit 46e9515

File tree

2 files changed

+88
-4
lines changed

2 files changed

+88
-4
lines changed

benchmarks/bench_test.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,21 @@ import (
55
"testing"
66
"time"
77

8+
"cosmossdk.io/x/tx/signing"
89
abci "github.com/cometbft/cometbft/abci/types"
910
dbm "github.com/cosmos/cosmos-db"
11+
"github.com/cosmos/gogoproto/proto"
1012
"github.com/stretchr/testify/require"
1113
"github.com/syndtr/goleveldb/leveldb/opt"
1214

15+
"github.com/cosmos/cosmos-sdk/codec"
16+
"github.com/cosmos/cosmos-sdk/codec/address"
17+
"github.com/cosmos/cosmos-sdk/codec/types"
18+
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
1319
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
20+
"github.com/cosmos/cosmos-sdk/std"
1421
sdk "github.com/cosmos/cosmos-sdk/types"
22+
"github.com/cosmos/cosmos-sdk/x/authz"
1523
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
1624

1725
wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types"
@@ -119,6 +127,80 @@ func BenchmarkTxSending(b *testing.B) {
119127
}
120128
}
121129

130+
func BenchmarkUnpackAny(b *testing.B) {
131+
interfaceRegistry, err := types.NewInterfaceRegistryWithOptions(types.InterfaceRegistryOptions{
132+
ProtoFiles: proto.HybridResolver,
133+
SigningOptions: signing.Options{
134+
AddressCodec: address.Bech32Codec{
135+
Bech32Prefix: sdk.GetConfig().GetBech32AccountAddrPrefix(),
136+
},
137+
ValidatorAddressCodec: address.Bech32Codec{
138+
Bech32Prefix: sdk.GetConfig().GetBech32ValidatorAddrPrefix(),
139+
},
140+
},
141+
})
142+
require.NoError(b, err)
143+
144+
cdc := codec.NewProtoCodec(interfaceRegistry)
145+
std.RegisterInterfaces(interfaceRegistry)
146+
147+
mustCreateAny := func(b *testing.B, v proto.Message) *codectypes.Any {
148+
b.Helper()
149+
any, err := codectypes.NewAnyWithValue(v)
150+
require.NoError(b, err)
151+
return any
152+
}
153+
154+
createNested := func(b *testing.B, depth int) *codectypes.Any {
155+
b.Helper()
156+
// create nested MsgExecs
157+
nested := authz.NewMsgExec(sdk.AccAddress{}, []sdk.Msg{})
158+
for i := 0; i < depth; i++ {
159+
nested = authz.NewMsgExec(sdk.AccAddress{}, []sdk.Msg{&nested})
160+
}
161+
162+
return mustCreateAny(b, &nested)
163+
}
164+
165+
cases := map[string]struct {
166+
msg *codectypes.Any
167+
expErr bool
168+
}{
169+
"garbage any": {
170+
msg: &codectypes.Any{
171+
TypeUrl: "aslasdf", // TODO: use a real type URL
172+
Value: []byte("oiuwurjtlwerlwmt032498u50j3oehr943q;l348u58q=-afvu89 290i32-1[1]"),
173+
},
174+
expErr: true,
175+
},
176+
"single MsgExec": {
177+
msg: createNested(b, 1),
178+
},
179+
"10000 MsgExec": {
180+
msg: createNested(b, 10000),
181+
},
182+
"100000 MsgExec": {
183+
msg: createNested(b, 100000),
184+
},
185+
}
186+
187+
for name, tc := range cases {
188+
b.Run(name, func(b *testing.B) {
189+
b.Logf("%s msg size %v", name, len(tc.msg.Value))
190+
b.ResetTimer()
191+
for i := 0; i < b.N; i++ {
192+
var msg sdk.Msg
193+
err := cdc.UnpackAny(tc.msg, &msg)
194+
if tc.expErr {
195+
require.Error(b, err)
196+
} else {
197+
require.NoError(b, err)
198+
}
199+
}
200+
})
201+
}
202+
}
203+
122204
func bankSendMsg(info *AppInfo) ([]sdk.Msg, error) {
123205
// Precompute all txs
124206
rcpt := sdk.AccAddress(secp256k1.GenPrivKey().PubKey().Address())

x/wasm/keeper/handler_plugin_encoders.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ type (
2929
CustomEncoder func(sender sdk.AccAddress, msg json.RawMessage) ([]sdk.Msg, error)
3030
DistributionEncoder func(sender sdk.AccAddress, msg *wasmvmtypes.DistributionMsg) ([]sdk.Msg, error)
3131
StakingEncoder func(sender sdk.AccAddress, msg *wasmvmtypes.StakingMsg) ([]sdk.Msg, error)
32-
AnyEncoder func(sender sdk.AccAddress, msg *wasmvmtypes.AnyMsg) ([]sdk.Msg, error)
32+
AnyEncoder func(ctx sdk.Context, sender sdk.AccAddress, msg *wasmvmtypes.AnyMsg) ([]sdk.Msg, error)
3333
WasmEncoder func(sender sdk.AccAddress, msg *wasmvmtypes.WasmMsg) ([]sdk.Msg, error)
3434
IBCEncoder func(ctx sdk.Context, sender sdk.AccAddress, contractIBCPortID string, msg *wasmvmtypes.IBCMsg) ([]sdk.Msg, error)
3535
)
@@ -40,7 +40,7 @@ type MessageEncoders struct {
4040
Distribution func(sender sdk.AccAddress, msg *wasmvmtypes.DistributionMsg) ([]sdk.Msg, error)
4141
IBC func(ctx sdk.Context, sender sdk.AccAddress, contractIBCPortID string, msg *wasmvmtypes.IBCMsg) ([]sdk.Msg, error)
4242
Staking func(sender sdk.AccAddress, msg *wasmvmtypes.StakingMsg) ([]sdk.Msg, error)
43-
Any func(sender sdk.AccAddress, msg *wasmvmtypes.AnyMsg) ([]sdk.Msg, error)
43+
Any func(ctx sdk.Context, sender sdk.AccAddress, msg *wasmvmtypes.AnyMsg) ([]sdk.Msg, error)
4444
Wasm func(sender sdk.AccAddress, msg *wasmvmtypes.WasmMsg) ([]sdk.Msg, error)
4545
Gov func(sender sdk.AccAddress, msg *wasmvmtypes.GovMsg) ([]sdk.Msg, error)
4646
}
@@ -102,7 +102,7 @@ func (e MessageEncoders) Encode(ctx sdk.Context, contractAddr sdk.AccAddress, co
102102
case msg.Staking != nil:
103103
return e.Staking(contractAddr, msg.Staking)
104104
case msg.Any != nil:
105-
return e.Any(contractAddr, msg.Any)
105+
return e.Any(ctx, contractAddr, msg.Any)
106106
case msg.Wasm != nil:
107107
return e.Wasm(contractAddr, msg.Wasm)
108108
case msg.Gov != nil:
@@ -206,12 +206,14 @@ func EncodeStakingMsg(sender sdk.AccAddress, msg *wasmvmtypes.StakingMsg) ([]sdk
206206
}
207207

208208
func EncodeAnyMsg(unpacker codectypes.AnyUnpacker) AnyEncoder {
209-
return func(sender sdk.AccAddress, msg *wasmvmtypes.AnyMsg) ([]sdk.Msg, error) {
209+
return func(ctx sdk.Context, sender sdk.AccAddress, msg *wasmvmtypes.AnyMsg) ([]sdk.Msg, error) {
210210
codecAny := codectypes.Any{
211211
TypeUrl: msg.TypeURL,
212212
Value: msg.Value,
213213
}
214214
var sdkMsg sdk.Msg
215+
216+
ctx.GasMeter().ConsumeGas((700000*uint64(len(msg.Value)))/types.DefaultGasMultiplier, "unpacking AnyMsg")
215217
if err := unpacker.UnpackAny(&codecAny, &sdkMsg); err != nil {
216218
return nil, errorsmod.Wrap(types.ErrInvalidMsg, fmt.Sprintf("Cannot unpack proto message with type URL: %s", msg.TypeURL))
217219
}

0 commit comments

Comments
 (0)