Skip to content

Commit 5142d35

Browse files
committed
chore(ism): charge gas for signature verification
1 parent 1e9baff commit 5142d35

4 files changed

Lines changed: 44 additions & 20 deletions

File tree

x/core/01_interchain_security/types/merkle_root_multisig.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ import (
66
"fmt"
77
"slices"
88

9+
storetypes "cosmossdk.io/store/types"
910
"github.com/bcp-innovations/hyperlane-cosmos/util"
11+
sdk "github.com/cosmos/cosmos-sdk/types"
1012
"github.com/ethereum/go-ethereum/crypto"
1113
)
1214

@@ -20,7 +22,7 @@ func (m *MerkleRootMultisigISM) ModuleType() uint8 {
2022
return INTERCHAIN_SECURITY_MODULE_TYPE_MERKLE_ROOT_MULTISIG
2123
}
2224

23-
func (m *MerkleRootMultisigISM) Verify(_ context.Context, rawMetadata []byte, message util.HyperlaneMessage) (bool, error) {
25+
func (m *MerkleRootMultisigISM) Verify(ctx context.Context, rawMetadata []byte, message util.HyperlaneMessage) (bool, error) {
2426
metadata, err := NewMerkleRootMultisigMetadata(rawMetadata)
2527
if err != nil {
2628
return false, err
@@ -32,6 +34,9 @@ func (m *MerkleRootMultisigISM) Verify(_ context.Context, rawMetadata []byte, me
3234

3335
digest := metadata.Digest(&message)
3436

37+
// Charge Cosmos gas for each signature verification.
38+
sdk.UnwrapSDKContext(ctx).GasMeter().ConsumeGas(storetypes.Gas(1000*len(metadata.Signatures)), "ism signature verification")
39+
3540
return VerifyMultisig(m.Validators, m.Threshold, metadata.Signatures, digest)
3641
}
3742

x/core/01_interchain_security/types/merkle_root_multisig_test.go

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ package types_test
33
import (
44
"fmt"
55

6+
i "github.com/bcp-innovations/hyperlane-cosmos/tests/integration"
67
"github.com/bcp-innovations/hyperlane-cosmos/util"
78
"github.com/bcp-innovations/hyperlane-cosmos/x/core/01_interchain_security/types"
8-
sdk "github.com/cosmos/cosmos-sdk/types"
99
. "github.com/onsi/ginkgo/v2"
1010
. "github.com/onsi/gomega"
1111
)
@@ -33,6 +33,12 @@ TEST CASES - merkle_root_multisig.go
3333
*/
3434

3535
var _ = Describe("merkle_root_multisig.go", Ordered, func() {
36+
var s *i.KeeperTestSuite
37+
38+
BeforeEach(func() {
39+
s = i.NewCleanChain()
40+
})
41+
3642
It("Validate (invalid) invalid validators", func() {
3743
// Arrange
3844
validators := []string{
@@ -158,7 +164,7 @@ var _ = Describe("merkle_root_multisig.go", Ordered, func() {
158164
metadata := bytesFromHexString("")
159165

160166
// Act
161-
verify, err := merkleRootMultisigIsm.Verify(sdk.Context{}, metadata, util.HyperlaneMessage{})
167+
verify, err := merkleRootMultisigIsm.Verify(s.Ctx(), metadata, util.HyperlaneMessage{})
162168

163169
// Assert
164170
Expect(err.Error()).To(Equal("invalid metadata length: got 0, expected at least 1096 bytes"))
@@ -202,7 +208,7 @@ var _ = Describe("merkle_root_multisig.go", Ordered, func() {
202208
metadata.Signatures = signatures
203209

204210
// Act
205-
verify, err := merkleRootMultisigIsm.Verify(sdk.Context{}, metadata.Bytes(), message)
211+
verify, err := merkleRootMultisigIsm.Verify(s.Ctx(), metadata.Bytes(), message)
206212

207213
// Assert
208214
Expect(err.Error()).To(Equal("invalid signatures length in metadata"))
@@ -245,7 +251,7 @@ var _ = Describe("merkle_root_multisig.go", Ordered, func() {
245251
metadata.Signatures = signatures
246252

247253
// Act
248-
verify, err := merkleRootMultisigIsm.Verify(sdk.Context{}, metadata.Bytes(), message)
254+
verify, err := merkleRootMultisigIsm.Verify(s.Ctx(), metadata.Bytes(), message)
249255

250256
// Assert
251257
Expect(err.Error()).To(Equal("invalid signed index"))
@@ -288,7 +294,7 @@ var _ = Describe("merkle_root_multisig.go", Ordered, func() {
288294
metadata.Signatures = signatures
289295

290296
// Act
291-
verify, err := merkleRootMultisigIsm.Verify(sdk.Context{}, metadata.Bytes(), message)
297+
verify, err := merkleRootMultisigIsm.Verify(s.Ctx(), metadata.Bytes(), message)
292298

293299
// Assert
294300
Expect(err.Error()).To(Equal("threshold can not be reached"))
@@ -329,7 +335,7 @@ var _ = Describe("merkle_root_multisig.go", Ordered, func() {
329335
metadata.Signatures = signatures
330336

331337
// Act
332-
verify, err := merkleRootMultisigIsm.Verify(sdk.Context{}, metadata.Bytes(), message)
338+
verify, err := merkleRootMultisigIsm.Verify(s.Ctx(), metadata.Bytes(), message)
333339

334340
// Assert
335341
Expect(err.Error()).To(Equal("failed to recover validator signature: invalid signature recovery id"))
@@ -372,7 +378,7 @@ var _ = Describe("merkle_root_multisig.go", Ordered, func() {
372378
metadata.Signatures = signatures
373379

374380
// Act
375-
verify, err := merkleRootMultisigIsm.Verify(sdk.Context{}, metadata.Bytes(), message)
381+
verify, err := merkleRootMultisigIsm.Verify(s.Ctx(), metadata.Bytes(), message)
376382

377383
// Assert
378384
Expect(err).To(BeNil())
@@ -422,7 +428,7 @@ var _ = Describe("merkle_root_multisig.go", Ordered, func() {
422428
metadata.Signatures = duplicatedSignatures
423429

424430
// Act
425-
verify, err := merkleRootMultisigIsm.Verify(sdk.Context{}, metadata.Bytes(), message)
431+
verify, err := merkleRootMultisigIsm.Verify(s.Ctx(), metadata.Bytes(), message)
426432

427433
// Assert
428434
Expect(err).To(BeNil())
@@ -473,11 +479,12 @@ var _ = Describe("merkle_root_multisig.go", Ordered, func() {
473479
metadata.Signatures = signatures
474480

475481
// Act
476-
verify, err := merkleRootMultisigIsm.Verify(sdk.Context{}, metadata.Bytes(), message)
482+
verify, err := merkleRootMultisigIsm.Verify(s.Ctx(), metadata.Bytes(), message)
477483

478484
// Assert
479485
Expect(err).To(BeNil())
480486
Expect(verify).To(BeTrue())
487+
Expect(int(s.Ctx().GasMeter().GasConsumed())).To(Equal(3000))
481488
})
482489

483490
// Verifies metadata and messages submitted by a Hyperlane Relayer.
@@ -497,7 +504,8 @@ var _ = Describe("merkle_root_multisig.go", Ordered, func() {
497504
}
498505

499506
// Act
500-
verify, err := merkleRootMultiSig.Verify(sdk.Context{}, validMetadata, validMessage)
507+
verify, err := merkleRootMultiSig.Verify(s.Ctx(), validMetadata, validMessage)
508+
Expect(int(s.Ctx().GasMeter().GasConsumed())).To(Equal(1000))
501509

502510
// Assert
503511
Expect(err).To(BeNil())

x/core/01_interchain_security/types/message_id_multisig.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ import (
66
"fmt"
77
"slices"
88

9+
storetypes "cosmossdk.io/store/types"
910
"github.com/bcp-innovations/hyperlane-cosmos/util"
11+
sdk "github.com/cosmos/cosmos-sdk/types"
1012
)
1113

1214
var _ HyperlaneInterchainSecurityModule = &MessageIdMultisigISM{}
@@ -19,14 +21,17 @@ func (m *MessageIdMultisigISM) ModuleType() uint8 {
1921
return INTERCHAIN_SECURITY_MODULE_TYPE_MESSAGE_ID_MULTISIG
2022
}
2123

22-
func (m *MessageIdMultisigISM) Verify(_ context.Context, rawMetadata []byte, message util.HyperlaneMessage) (bool, error) {
24+
func (m *MessageIdMultisigISM) Verify(ctx context.Context, rawMetadata []byte, message util.HyperlaneMessage) (bool, error) {
2325
metadata, err := NewMessageIdMultisigMetadata(rawMetadata)
2426
if err != nil {
2527
return false, err
2628
}
2729

2830
digest := metadata.Digest(&message)
2931

32+
// Charge Cosmos gas for each signature verification.
33+
sdk.UnwrapSDKContext(ctx).GasMeter().ConsumeGas(storetypes.Gas(1000*len(metadata.Signatures)), "ism signature verification")
34+
3035
return VerifyMultisig(m.Validators, m.Threshold, metadata.Signatures, digest)
3136
}
3237

x/core/01_interchain_security/types/message_id_multisig_test.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ package types_test
33
import (
44
"fmt"
55

6+
i "github.com/bcp-innovations/hyperlane-cosmos/tests/integration"
67
"github.com/bcp-innovations/hyperlane-cosmos/util"
78
"github.com/bcp-innovations/hyperlane-cosmos/x/core/01_interchain_security/types"
8-
sdk "github.com/cosmos/cosmos-sdk/types"
99
. "github.com/onsi/ginkgo/v2"
1010
. "github.com/onsi/gomega"
1111
)
@@ -31,6 +31,12 @@ TEST CASES - message_id_multisig.go
3131
*/
3232

3333
var _ = Describe("message_id_multisig.go", Ordered, func() {
34+
var s *i.KeeperTestSuite
35+
36+
BeforeEach(func() {
37+
s = i.NewCleanChain()
38+
})
39+
3440
It("Validate (invalid) invalid validators", func() {
3541
// Arrange
3642
validators := []string{
@@ -155,7 +161,7 @@ var _ = Describe("message_id_multisig.go", Ordered, func() {
155161
metadata := bytesFromHexString("")
156162

157163
// Act
158-
verify, err := messageIdMultisigIsm.Verify(sdk.Context{}, metadata, util.HyperlaneMessage{})
164+
verify, err := messageIdMultisigIsm.Verify(s.Ctx(), metadata, util.HyperlaneMessage{})
159165

160166
// Assert
161167
Expect(err.Error()).To(Equal("invalid metadata length: got 0, expected at least 68 bytes"))
@@ -197,7 +203,7 @@ var _ = Describe("message_id_multisig.go", Ordered, func() {
197203
metadata.Signatures = signatures
198204

199205
// Act
200-
verify, err := merkleRootMultisigIsm.Verify(sdk.Context{}, metadata.Bytes(), message)
206+
verify, err := merkleRootMultisigIsm.Verify(s.Ctx(), metadata.Bytes(), message)
201207

202208
// Assert
203209
Expect(err.Error()).To(Equal("invalid signatures length in metadata"))
@@ -237,7 +243,7 @@ var _ = Describe("message_id_multisig.go", Ordered, func() {
237243
metadata.Signatures = signatures
238244

239245
// Act
240-
verify, err := messageIdMultisigIsm.Verify(sdk.Context{}, metadata.Bytes(), message)
246+
verify, err := messageIdMultisigIsm.Verify(s.Ctx(), metadata.Bytes(), message)
241247

242248
// Assert
243249
Expect(err.Error()).To(Equal("threshold can not be reached"))
@@ -275,7 +281,7 @@ var _ = Describe("message_id_multisig.go", Ordered, func() {
275281
metadata.Signatures = signatures
276282

277283
// Act
278-
verify, err := messageIdMultisigIsm.Verify(sdk.Context{}, metadata.Bytes(), message)
284+
verify, err := messageIdMultisigIsm.Verify(s.Ctx(), metadata.Bytes(), message)
279285

280286
// Assert
281287
Expect(err.Error()).To(Equal("failed to recover validator signature: invalid signature recovery id"))
@@ -315,7 +321,7 @@ var _ = Describe("message_id_multisig.go", Ordered, func() {
315321
metadata.Signatures = signatures
316322

317323
// Act
318-
verify, err := messageIdMultisigIsm.Verify(sdk.Context{}, metadata.Bytes(), message)
324+
verify, err := messageIdMultisigIsm.Verify(s.Ctx(), metadata.Bytes(), message)
319325

320326
// Assert
321327
Expect(err).To(BeNil())
@@ -362,7 +368,7 @@ var _ = Describe("message_id_multisig.go", Ordered, func() {
362368
metadata.Signatures = duplicatedSignatures
363369

364370
// Act
365-
verify, err := messageIdMultisigIsm.Verify(sdk.Context{}, metadata.Bytes(), message)
371+
verify, err := messageIdMultisigIsm.Verify(s.Ctx(), metadata.Bytes(), message)
366372

367373
// Assert
368374
Expect(err).To(BeNil())
@@ -409,7 +415,7 @@ var _ = Describe("message_id_multisig.go", Ordered, func() {
409415
metadata.Signatures = signatures
410416

411417
// Act
412-
verify, err := messageIdMultisigIsm.Verify(sdk.Context{}, metadata.Bytes(), message)
418+
verify, err := messageIdMultisigIsm.Verify(s.Ctx(), metadata.Bytes(), message)
413419

414420
// Assert
415421
Expect(err).To(BeNil())

0 commit comments

Comments
 (0)