From 7388af912887de84d2b12399de7c80c096757f2e Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Wed, 7 Feb 2024 14:24:42 +0100 Subject: [PATCH 01/18] feat: adding protobuf msgs and rpc for VerifyMembershipProof --- modules/core/02-client/types/query.pb.go | 808 ++++++++++++++++++-- modules/core/02-client/types/query.pb.gw.go | 81 ++ proto/ibc/core/client/v1/query.proto | 35 + 3 files changed, 857 insertions(+), 67 deletions(-) diff --git a/modules/core/02-client/types/query.pb.go b/modules/core/02-client/types/query.pb.go index e13ddd06cef..5363cf5928b 100644 --- a/modules/core/02-client/types/query.pb.go +++ b/modules/core/02-client/types/query.pb.go @@ -11,6 +11,7 @@ import ( _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" + types1 "github.com/cosmos/ibc-go/v8/modules/core/23-commitment/types" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -960,6 +961,152 @@ func (m *QueryUpgradedConsensusStateResponse) GetUpgradedConsensusState() *types return nil } +// QueryVerifyMembershipProofRequest is the request type for the Query/VerifyMembershipProof RPC method +type QueryVerifyMembershipProofRequest struct { + // client unique identifier. + ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` + // the proof to be verified by the client. + Proof []byte `protobuf:"bytes,2,opt,name=proof,proto3" json:"proof,omitempty"` + // the height at which the proof is verified. + ProofHeight Height `protobuf:"bytes,3,opt,name=proof_height,json=proofHeight,proto3" json:"proof_height"` + // the commitment key path. + MerklePath types1.MerklePath `protobuf:"bytes,4,opt,name=merkle_path,json=merklePath,proto3" json:"merkle_path"` + // the value which is proven. + Value []byte `protobuf:"bytes,5,opt,name=value,proto3" json:"value,omitempty"` + // optional time delay + TimeDelay uint64 `protobuf:"varint,6,opt,name=time_delay,json=timeDelay,proto3" json:"time_delay,omitempty"` + // optional block delay + BlockDelay uint64 `protobuf:"varint,7,opt,name=block_delay,json=blockDelay,proto3" json:"block_delay,omitempty"` +} + +func (m *QueryVerifyMembershipProofRequest) Reset() { *m = QueryVerifyMembershipProofRequest{} } +func (m *QueryVerifyMembershipProofRequest) String() string { return proto.CompactTextString(m) } +func (*QueryVerifyMembershipProofRequest) ProtoMessage() {} +func (*QueryVerifyMembershipProofRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_dc42cdfd1d52d76e, []int{18} +} +func (m *QueryVerifyMembershipProofRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryVerifyMembershipProofRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryVerifyMembershipProofRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryVerifyMembershipProofRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryVerifyMembershipProofRequest.Merge(m, src) +} +func (m *QueryVerifyMembershipProofRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryVerifyMembershipProofRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryVerifyMembershipProofRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryVerifyMembershipProofRequest proto.InternalMessageInfo + +func (m *QueryVerifyMembershipProofRequest) GetClientId() string { + if m != nil { + return m.ClientId + } + return "" +} + +func (m *QueryVerifyMembershipProofRequest) GetProof() []byte { + if m != nil { + return m.Proof + } + return nil +} + +func (m *QueryVerifyMembershipProofRequest) GetProofHeight() Height { + if m != nil { + return m.ProofHeight + } + return Height{} +} + +func (m *QueryVerifyMembershipProofRequest) GetMerklePath() types1.MerklePath { + if m != nil { + return m.MerklePath + } + return types1.MerklePath{} +} + +func (m *QueryVerifyMembershipProofRequest) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func (m *QueryVerifyMembershipProofRequest) GetTimeDelay() uint64 { + if m != nil { + return m.TimeDelay + } + return 0 +} + +func (m *QueryVerifyMembershipProofRequest) GetBlockDelay() uint64 { + if m != nil { + return m.BlockDelay + } + return 0 +} + +// QueryVerifyMembershipProofResponse is the response type for the Query/VerifyMembershipProof RPC method +type QueryVerifyMembershipProofResponse struct { + // result identicating success or failure of proof verification. + Result bool `protobuf:"varint,1,opt,name=result,proto3" json:"result,omitempty"` +} + +func (m *QueryVerifyMembershipProofResponse) Reset() { *m = QueryVerifyMembershipProofResponse{} } +func (m *QueryVerifyMembershipProofResponse) String() string { return proto.CompactTextString(m) } +func (*QueryVerifyMembershipProofResponse) ProtoMessage() {} +func (*QueryVerifyMembershipProofResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_dc42cdfd1d52d76e, []int{19} +} +func (m *QueryVerifyMembershipProofResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryVerifyMembershipProofResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryVerifyMembershipProofResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryVerifyMembershipProofResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryVerifyMembershipProofResponse.Merge(m, src) +} +func (m *QueryVerifyMembershipProofResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryVerifyMembershipProofResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryVerifyMembershipProofResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryVerifyMembershipProofResponse proto.InternalMessageInfo + +func (m *QueryVerifyMembershipProofResponse) GetResult() bool { + if m != nil { + return m.Result + } + return false +} + func init() { proto.RegisterType((*QueryClientStateRequest)(nil), "ibc.core.client.v1.QueryClientStateRequest") proto.RegisterType((*QueryClientStateResponse)(nil), "ibc.core.client.v1.QueryClientStateResponse") @@ -979,78 +1126,93 @@ func init() { proto.RegisterType((*QueryUpgradedClientStateResponse)(nil), "ibc.core.client.v1.QueryUpgradedClientStateResponse") proto.RegisterType((*QueryUpgradedConsensusStateRequest)(nil), "ibc.core.client.v1.QueryUpgradedConsensusStateRequest") proto.RegisterType((*QueryUpgradedConsensusStateResponse)(nil), "ibc.core.client.v1.QueryUpgradedConsensusStateResponse") + proto.RegisterType((*QueryVerifyMembershipProofRequest)(nil), "ibc.core.client.v1.QueryVerifyMembershipProofRequest") + proto.RegisterType((*QueryVerifyMembershipProofResponse)(nil), "ibc.core.client.v1.QueryVerifyMembershipProofResponse") } func init() { proto.RegisterFile("ibc/core/client/v1/query.proto", fileDescriptor_dc42cdfd1d52d76e) } var fileDescriptor_dc42cdfd1d52d76e = []byte{ - // 1051 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x57, 0xcf, 0x6f, 0x1b, 0x45, - 0x14, 0xce, 0xa4, 0x69, 0xd4, 0x3e, 0xbb, 0x09, 0x9a, 0x26, 0xa9, 0xbb, 0x8d, 0x1c, 0x67, 0x83, - 0x68, 0x5a, 0x92, 0x9d, 0xc4, 0xa1, 0x49, 0x84, 0x84, 0x04, 0xa9, 0x54, 0xda, 0x4b, 0x29, 0x8b, - 0x10, 0x08, 0x09, 0x45, 0xbb, 0xeb, 0xc9, 0x66, 0x25, 0x7b, 0xc7, 0xf5, 0xec, 0x5a, 0x8a, 0xaa, - 0x5c, 0x7a, 0xe2, 0x06, 0x12, 0x12, 0x57, 0x24, 0x8e, 0x1c, 0x2a, 0x0e, 0x48, 0x5c, 0x39, 0x41, - 0x8e, 0x45, 0x70, 0xe0, 0x44, 0x51, 0xc2, 0x1f, 0x82, 0x3c, 0x33, 0x6b, 0xef, 0xda, 0xe3, 0x7a, - 0x8d, 0x42, 0x6f, 0xbb, 0xef, 0xe7, 0xf7, 0xbe, 0xf7, 0xfc, 0xde, 0x1a, 0xca, 0x81, 0xeb, 0x11, - 0x8f, 0xb5, 0x28, 0xf1, 0xea, 0x01, 0x0d, 0x23, 0xd2, 0xde, 0x24, 0x8f, 0x63, 0xda, 0x3a, 0xb2, - 0x9a, 0x2d, 0x16, 0x31, 0x8c, 0x03, 0xd7, 0xb3, 0x3a, 0x7a, 0x4b, 0xea, 0xad, 0xf6, 0xa6, 0x71, - 0xdb, 0x63, 0xbc, 0xc1, 0x38, 0x71, 0x1d, 0x4e, 0xa5, 0x31, 0x69, 0x6f, 0xba, 0x34, 0x72, 0x36, - 0x49, 0xd3, 0xf1, 0x83, 0xd0, 0x89, 0x02, 0x16, 0x4a, 0x7f, 0x63, 0x49, 0x13, 0x5f, 0x45, 0x92, - 0x06, 0xd7, 0x7d, 0xc6, 0xfc, 0x3a, 0x25, 0xe2, 0xcd, 0x8d, 0x0f, 0x88, 0x13, 0xaa, 0xdc, 0xc6, - 0xa2, 0x52, 0x39, 0xcd, 0x80, 0x38, 0x61, 0xc8, 0x22, 0x11, 0x98, 0x2b, 0xed, 0x9c, 0xcf, 0x7c, - 0x26, 0x1e, 0x49, 0xe7, 0x49, 0x4a, 0xcd, 0x6d, 0xb8, 0xf6, 0x61, 0x07, 0xd1, 0x5d, 0x91, 0xe3, - 0xa3, 0xc8, 0x89, 0xa8, 0x4d, 0x1f, 0xc7, 0x94, 0x47, 0xf8, 0x06, 0x5c, 0x96, 0x99, 0xf7, 0x83, - 0x5a, 0x09, 0x55, 0xd0, 0xea, 0x65, 0xfb, 0x92, 0x14, 0x3c, 0xa8, 0x99, 0xcf, 0x10, 0x94, 0x06, - 0x1d, 0x79, 0x93, 0x85, 0x9c, 0xe2, 0x1d, 0x28, 0x2a, 0x4f, 0xde, 0x91, 0x0b, 0xe7, 0x42, 0x75, - 0xce, 0x92, 0xf8, 0xac, 0x04, 0xba, 0xf5, 0x5e, 0x78, 0x64, 0x17, 0xbc, 0x5e, 0x00, 0x3c, 0x07, - 0x17, 0x9b, 0x2d, 0xc6, 0x0e, 0x4a, 0x93, 0x15, 0xb4, 0x5a, 0xb4, 0xe5, 0x0b, 0xbe, 0x0b, 0x45, - 0xf1, 0xb0, 0x7f, 0x48, 0x03, 0xff, 0x30, 0x2a, 0x5d, 0x10, 0xe1, 0x0c, 0x6b, 0x90, 0x6a, 0xeb, - 0xbe, 0xb0, 0xd8, 0x9b, 0x3a, 0xf9, 0x6b, 0x69, 0xc2, 0x2e, 0x08, 0x2f, 0x29, 0x32, 0xdd, 0x41, - 0xbc, 0x3c, 0xa9, 0xf4, 0x1e, 0x40, 0xaf, 0x11, 0x0a, 0xed, 0x1b, 0x96, 0xec, 0x9a, 0xd5, 0xe9, - 0x9a, 0x25, 0x5b, 0xac, 0xba, 0x66, 0x3d, 0x72, 0xfc, 0x84, 0x25, 0x3b, 0xe5, 0x69, 0xfe, 0x81, - 0xe0, 0xba, 0x26, 0x89, 0x62, 0x25, 0x84, 0x2b, 0x69, 0x56, 0x78, 0x09, 0x55, 0x2e, 0xac, 0x16, - 0xaa, 0xb7, 0x74, 0x75, 0x3c, 0xa8, 0xd1, 0x30, 0x0a, 0x0e, 0x02, 0x5a, 0x4b, 0x85, 0xda, 0x2b, - 0x77, 0xca, 0xfa, 0xfe, 0xc5, 0xd2, 0x82, 0x56, 0xcd, 0xed, 0x62, 0x8a, 0x4b, 0x8e, 0xdf, 0xcf, - 0x54, 0x35, 0x29, 0xaa, 0xba, 0x39, 0xb2, 0x2a, 0x09, 0x36, 0x53, 0xd6, 0x0f, 0x08, 0x0c, 0x59, - 0x56, 0x47, 0x15, 0xf2, 0x98, 0xe7, 0x9e, 0x13, 0x7c, 0x13, 0x66, 0x5b, 0xb4, 0x1d, 0xf0, 0x80, - 0x85, 0xfb, 0x61, 0xdc, 0x70, 0x69, 0x4b, 0x20, 0x99, 0xb2, 0x67, 0x12, 0xf1, 0x43, 0x21, 0xcd, - 0x18, 0xa6, 0xfa, 0x9c, 0x32, 0x94, 0x8d, 0xc4, 0x2b, 0x70, 0xa5, 0xde, 0xa9, 0x2f, 0x4a, 0xcc, - 0xa6, 0x2a, 0x68, 0xf5, 0x92, 0x5d, 0x94, 0x42, 0xd5, 0xed, 0x9f, 0x10, 0xdc, 0xd0, 0x42, 0x56, - 0xbd, 0x78, 0x07, 0x66, 0xbd, 0x44, 0x93, 0x63, 0x48, 0x67, 0xbc, 0x4c, 0x98, 0xff, 0x73, 0x4e, - 0x9f, 0xea, 0x91, 0xf3, 0x5c, 0x6c, 0xdf, 0xd3, 0xb4, 0xfc, 0xbf, 0x0c, 0xf2, 0x2f, 0x08, 0x16, - 0xf5, 0x20, 0x14, 0x7f, 0x9f, 0xc3, 0x6b, 0x7d, 0xfc, 0x25, 0xe3, 0xbc, 0xa6, 0x2b, 0x37, 0x1b, - 0xe6, 0x93, 0x20, 0x3a, 0xcc, 0x10, 0x30, 0x9b, 0xa5, 0xf7, 0x1c, 0x47, 0xf7, 0x0b, 0x04, 0xcb, - 0x9a, 0x42, 0x64, 0xf6, 0x57, 0xcb, 0xe9, 0xaf, 0x08, 0xcc, 0x97, 0x41, 0x51, 0xcc, 0x7e, 0x0a, - 0xd7, 0xfa, 0x98, 0x55, 0xe3, 0x94, 0x10, 0x3c, 0x7a, 0x9e, 0xe6, 0x3d, 0x5d, 0x86, 0xf3, 0x23, - 0x75, 0x67, 0x60, 0x95, 0xc6, 0xb9, 0xa8, 0x34, 0xb7, 0x06, 0xd6, 0x63, 0xdc, 0x2b, 0x7c, 0x01, - 0xa6, 0xb9, 0x90, 0x28, 0x37, 0xf5, 0x66, 0x1a, 0x99, 0x6c, 0x8f, 0x9c, 0x96, 0xd3, 0x48, 0xb2, - 0x99, 0x1f, 0x64, 0x02, 0x26, 0x3a, 0x15, 0xb0, 0x0a, 0xd3, 0x4d, 0x21, 0x51, 0x3f, 0x6d, 0x2d, - 0x71, 0xca, 0x47, 0x59, 0x9a, 0xcb, 0xb0, 0x24, 0x02, 0x7e, 0xdc, 0xf4, 0x5b, 0x4e, 0x2d, 0xb3, - 0x5e, 0x93, 0x9c, 0x75, 0xa8, 0x0c, 0x37, 0x51, 0xa9, 0xef, 0xc3, 0x7c, 0xac, 0xd4, 0xfb, 0xb9, - 0x2f, 0xe1, 0xd5, 0x78, 0x30, 0xa2, 0xf9, 0xba, 0x1a, 0x9a, 0x6e, 0x36, 0xdd, 0x0a, 0x36, 0x63, - 0x58, 0x79, 0xa9, 0x95, 0x82, 0xf5, 0x10, 0x4a, 0x3d, 0x58, 0x63, 0xac, 0xbf, 0x85, 0x58, 0x1b, - 0xb7, 0xfa, 0x5b, 0x11, 0x2e, 0x8a, 0xbc, 0xf8, 0x5b, 0x04, 0x85, 0x14, 0x6c, 0xfc, 0xa6, 0x8e, - 0xeb, 0x21, 0x1f, 0x1a, 0xc6, 0x5a, 0x3e, 0x63, 0x59, 0x84, 0x79, 0xe7, 0xe9, 0xef, 0xff, 0x7c, - 0x3d, 0x49, 0xf0, 0x3a, 0x19, 0xfa, 0xa9, 0xa4, 0x36, 0x12, 0x79, 0xd2, 0x1d, 0xc5, 0x63, 0xfc, - 0x0d, 0x82, 0x62, 0xfa, 0x58, 0xe2, 0x5c, 0x59, 0x93, 0x49, 0x33, 0xd6, 0x73, 0x5a, 0x2b, 0x90, - 0xb7, 0x04, 0xc8, 0x15, 0xbc, 0x3c, 0x12, 0x24, 0x7e, 0x81, 0x60, 0x26, 0xcb, 0x2b, 0xb6, 0x86, - 0x27, 0xd3, 0xb5, 0xdf, 0x20, 0xb9, 0xed, 0x15, 0xbc, 0xba, 0x80, 0x77, 0x80, 0x6b, 0x5a, 0x78, - 0x7d, 0x8b, 0x3d, 0x4d, 0x23, 0x49, 0x8e, 0x31, 0x79, 0xd2, 0x77, 0xd6, 0x8f, 0x89, 0x5c, 0x53, - 0x29, 0x85, 0x14, 0x1c, 0xe3, 0x67, 0x08, 0x66, 0xfb, 0x0e, 0x09, 0xce, 0x0b, 0xb9, 0xdb, 0x80, - 0x8d, 0xfc, 0x0e, 0xaa, 0xc8, 0x5d, 0x51, 0x64, 0x15, 0x6f, 0x8c, 0x5b, 0x24, 0x3e, 0x41, 0x30, - 0xaf, 0xdd, 0xd2, 0xf8, 0x4e, 0x4e, 0x14, 0xd9, 0x03, 0x63, 0x6c, 0x8f, 0xeb, 0xa6, 0x4a, 0x78, - 0x57, 0x94, 0xf0, 0x36, 0xde, 0x1d, 0xbb, 0x4f, 0xea, 0x66, 0xe0, 0xef, 0x32, 0x63, 0x1f, 0xe7, - 0x1b, 0xfb, 0x78, 0xac, 0xb1, 0xef, 0xed, 0xf0, 0xdc, 0xbf, 0xcd, 0x38, 0xcb, 0xf7, 0x97, 0x5d, - 0x90, 0x72, 0x1d, 0x8f, 0x04, 0x99, 0xb9, 0x02, 0x23, 0x41, 0x66, 0xef, 0x82, 0x69, 0x0a, 0x90, - 0x8b, 0xd8, 0xd0, 0x81, 0x94, 0x77, 0x00, 0xff, 0x88, 0xe0, 0xaa, 0x66, 0xc1, 0xe3, 0xad, 0xa1, - 0xa9, 0x86, 0x5f, 0x0c, 0xe3, 0xad, 0xf1, 0x9c, 0x14, 0xcc, 0xaa, 0x80, 0xb9, 0x86, 0x6f, 0xeb, - 0x60, 0x6a, 0xaf, 0x0b, 0xc7, 0x3f, 0x23, 0x58, 0xd0, 0xdf, 0x00, 0xbc, 0x3d, 0x1a, 0x84, 0x76, - 0xb7, 0xec, 0x8c, 0xed, 0x97, 0x67, 0x16, 0x86, 0x9d, 0x21, 0xbe, 0x67, 0x9f, 0x9c, 0x96, 0xd1, - 0xf3, 0xd3, 0x32, 0xfa, 0xfb, 0xb4, 0x8c, 0xbe, 0x3a, 0x2b, 0x4f, 0x3c, 0x3f, 0x2b, 0x4f, 0xfc, - 0x79, 0x56, 0x9e, 0xf8, 0x6c, 0xd7, 0x0f, 0xa2, 0xc3, 0xd8, 0xb5, 0x3c, 0xd6, 0x20, 0xea, 0x1f, - 0x75, 0xe0, 0x7a, 0xeb, 0x3e, 0x23, 0xed, 0x5d, 0xd2, 0x60, 0xb5, 0xb8, 0x4e, 0xb9, 0xcc, 0xb3, - 0x51, 0x5d, 0x57, 0xa9, 0xa2, 0xa3, 0x26, 0xe5, 0xee, 0xb4, 0xb8, 0x66, 0x5b, 0xff, 0x06, 0x00, - 0x00, 0xff, 0xff, 0x6f, 0xfe, 0x1b, 0x97, 0xbd, 0x0f, 0x00, 0x00, + // 1252 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0xcb, 0x6f, 0x1b, 0xc5, + 0x1f, 0xcf, 0xa4, 0x49, 0x7e, 0xc9, 0xd8, 0x4d, 0x7e, 0x9a, 0x26, 0xa9, 0xbb, 0x09, 0x4e, 0xb2, + 0x41, 0x24, 0x4d, 0x93, 0xdd, 0xc4, 0xa1, 0x49, 0x54, 0x40, 0x82, 0x14, 0x95, 0xe6, 0xd0, 0x12, + 0x16, 0xf1, 0x10, 0x12, 0xb2, 0x76, 0xd7, 0x13, 0x7b, 0xd5, 0x7d, 0xb8, 0x3b, 0xbb, 0x96, 0xa2, + 0x2a, 0x97, 0x9e, 0x7a, 0x03, 0x09, 0x09, 0x8e, 0x48, 0x1c, 0x39, 0x54, 0x3d, 0x20, 0x71, 0xe1, + 0x80, 0x84, 0x04, 0x39, 0x56, 0x82, 0x03, 0x27, 0x8a, 0x12, 0x24, 0xfe, 0x0d, 0xb4, 0x33, 0xb3, + 0xf6, 0xae, 0x3d, 0xb6, 0xd7, 0xa8, 0xe5, 0xe6, 0xfd, 0x3e, 0x3f, 0xdf, 0xc7, 0xcc, 0x67, 0x64, + 0x58, 0xb4, 0x0c, 0x53, 0x35, 0x3d, 0x1f, 0xab, 0xa6, 0x6d, 0x61, 0x37, 0x50, 0x1b, 0x5b, 0xea, + 0xfd, 0x10, 0xfb, 0xc7, 0x4a, 0xdd, 0xf7, 0x02, 0x0f, 0x21, 0xcb, 0x30, 0x95, 0x48, 0xaf, 0x30, + 0xbd, 0xd2, 0xd8, 0x92, 0xd6, 0x4c, 0x8f, 0x38, 0x1e, 0x51, 0x0d, 0x9d, 0x60, 0x66, 0xac, 0x36, + 0xb6, 0x0c, 0x1c, 0xe8, 0x5b, 0x6a, 0x5d, 0xaf, 0x5a, 0xae, 0x1e, 0x58, 0x9e, 0xcb, 0xfc, 0xa5, + 0x39, 0x6e, 0x1b, 0x9b, 0x25, 0x83, 0x4b, 0x0b, 0x82, 0xe4, 0x3c, 0x0d, 0x33, 0x58, 0x69, 0x19, + 0x78, 0x8e, 0x63, 0x05, 0x4e, 0x6c, 0xd4, 0xfc, 0xe2, 0x86, 0x57, 0xaa, 0x9e, 0x57, 0xb5, 0xb1, + 0x4a, 0xbf, 0x8c, 0xf0, 0x48, 0xd5, 0xdd, 0x38, 0xc9, 0x3c, 0x57, 0xe9, 0x75, 0x4b, 0xd5, 0x5d, + 0xd7, 0x0b, 0x28, 0x3c, 0xc2, 0xb5, 0xd3, 0x55, 0xaf, 0xea, 0xd1, 0x9f, 0x6a, 0xf4, 0x8b, 0x49, + 0xe5, 0x1d, 0x78, 0xf9, 0xbd, 0x08, 0xe7, 0x4d, 0x0a, 0xe6, 0xfd, 0x40, 0x0f, 0xb0, 0x86, 0xef, + 0x87, 0x98, 0x04, 0x68, 0x0e, 0x4e, 0x30, 0x88, 0x65, 0xab, 0x52, 0x00, 0x8b, 0x60, 0x75, 0x42, + 0x1b, 0x67, 0x82, 0x83, 0x8a, 0xfc, 0x18, 0xc0, 0x42, 0xa7, 0x23, 0xa9, 0x7b, 0x2e, 0xc1, 0x68, + 0x17, 0xe6, 0xb9, 0x27, 0x89, 0xe4, 0xd4, 0x39, 0x57, 0x9a, 0x56, 0x18, 0x3e, 0x25, 0x86, 0xae, + 0xbc, 0xe5, 0x1e, 0x6b, 0x39, 0xb3, 0x15, 0x00, 0x4d, 0xc3, 0xd1, 0xba, 0xef, 0x79, 0x47, 0x85, + 0xe1, 0x45, 0xb0, 0x9a, 0xd7, 0xd8, 0x07, 0xba, 0x09, 0xf3, 0xf4, 0x47, 0xb9, 0x86, 0xad, 0x6a, + 0x2d, 0x28, 0x5c, 0xa0, 0xe1, 0x24, 0xa5, 0x73, 0x60, 0xca, 0x6d, 0x6a, 0xb1, 0x3f, 0x72, 0xfa, + 0xc7, 0xc2, 0x90, 0x96, 0xa3, 0x5e, 0x4c, 0x24, 0x1b, 0x9d, 0x78, 0x49, 0x5c, 0xe9, 0x2d, 0x08, + 0x5b, 0xe3, 0xe4, 0x68, 0x5f, 0x51, 0xd8, 0x3c, 0x95, 0x68, 0xf6, 0x0a, 0x9b, 0x25, 0x9f, 0xbd, + 0x72, 0xa8, 0x57, 0xe3, 0x2e, 0x69, 0x09, 0x4f, 0xf9, 0x37, 0x00, 0xaf, 0x08, 0x92, 0xf0, 0xae, + 0xb8, 0xf0, 0x62, 0xb2, 0x2b, 0xa4, 0x00, 0x16, 0x2f, 0xac, 0xe6, 0x4a, 0x57, 0x45, 0x75, 0x1c, + 0x54, 0xb0, 0x1b, 0x58, 0x47, 0x16, 0xae, 0x24, 0x42, 0xed, 0x17, 0xa3, 0xb2, 0xbe, 0x7d, 0xb6, + 0x30, 0x2b, 0x54, 0x13, 0x2d, 0x9f, 0xe8, 0x25, 0x41, 0xef, 0xa4, 0xaa, 0x1a, 0xa6, 0x55, 0xad, + 0xf4, 0xad, 0x8a, 0x81, 0x4d, 0x95, 0xf5, 0x04, 0x40, 0x89, 0x95, 0x15, 0xa9, 0x5c, 0x12, 0x92, + 0xcc, 0x7b, 0x82, 0x56, 0xe0, 0x94, 0x8f, 0x1b, 0x16, 0xb1, 0x3c, 0xb7, 0xec, 0x86, 0x8e, 0x81, + 0x7d, 0x8a, 0x64, 0x44, 0x9b, 0x8c, 0xc5, 0x77, 0xa9, 0x34, 0x65, 0x98, 0x98, 0x73, 0xc2, 0x90, + 0x0d, 0x12, 0x2d, 0xc3, 0x8b, 0x76, 0x54, 0x5f, 0x10, 0x9b, 0x8d, 0x2c, 0x82, 0xd5, 0x71, 0x2d, + 0xcf, 0x84, 0x7c, 0xda, 0xdf, 0x03, 0x38, 0x27, 0x84, 0xcc, 0x67, 0xf1, 0x06, 0x9c, 0x32, 0x63, + 0x4d, 0x86, 0x25, 0x9d, 0x34, 0x53, 0x61, 0x5e, 0xe4, 0x9e, 0x3e, 0x14, 0x23, 0x27, 0x99, 0xba, + 0x7d, 0x4b, 0x30, 0xf2, 0x7f, 0xb3, 0xc8, 0x3f, 0x03, 0x38, 0x2f, 0x06, 0xc1, 0xfb, 0xf7, 0x29, + 0xfc, 0x7f, 0x5b, 0xff, 0xe2, 0x75, 0x5e, 0x17, 0x95, 0x9b, 0x0e, 0xf3, 0x91, 0x15, 0xd4, 0x52, + 0x0d, 0x98, 0x4a, 0xb7, 0xf7, 0x39, 0xae, 0xee, 0x23, 0x00, 0x97, 0x04, 0x85, 0xb0, 0xec, 0xff, + 0x6d, 0x4f, 0x7f, 0x01, 0x50, 0xee, 0x05, 0x85, 0x77, 0xf6, 0x63, 0x78, 0xb9, 0xad, 0xb3, 0x7c, + 0x9d, 0xe2, 0x06, 0xf7, 0xdf, 0xa7, 0x19, 0x53, 0x94, 0xe1, 0xf9, 0x35, 0x75, 0xb7, 0xe3, 0x2a, + 0x0d, 0x33, 0xb5, 0x52, 0xde, 0xee, 0xb8, 0x1e, 0xc3, 0x56, 0xe1, 0xb3, 0x70, 0x8c, 0x50, 0x09, + 0x77, 0xe3, 0x5f, 0xb2, 0x94, 0xca, 0x76, 0xa8, 0xfb, 0xba, 0x13, 0x67, 0x93, 0xdf, 0x4d, 0x05, + 0x8c, 0x75, 0x3c, 0x60, 0x09, 0x8e, 0xd5, 0xa9, 0x84, 0x1f, 0x6d, 0x61, 0xe3, 0xb8, 0x0f, 0xb7, + 0x94, 0x97, 0xe0, 0x02, 0x0d, 0xf8, 0x41, 0xbd, 0xea, 0xeb, 0x95, 0xd4, 0xf5, 0x1a, 0xe7, 0xb4, + 0xe1, 0x62, 0x77, 0x13, 0x9e, 0xfa, 0x36, 0x9c, 0x09, 0xb9, 0xba, 0x9c, 0x99, 0x09, 0x2f, 0x85, + 0x9d, 0x11, 0xe5, 0x97, 0xf9, 0xd2, 0x34, 0xb3, 0x89, 0xae, 0x60, 0x39, 0x84, 0xcb, 0x3d, 0xad, + 0x38, 0xac, 0xbb, 0xb0, 0xd0, 0x82, 0x35, 0xc0, 0xf5, 0x37, 0x1b, 0x0a, 0xe3, 0xca, 0x3f, 0x0c, + 0xf3, 0xd3, 0xf5, 0x21, 0xf6, 0xad, 0xa3, 0xe3, 0x3b, 0x38, 0xba, 0xc9, 0x49, 0xcd, 0xaa, 0x1f, + 0x46, 0x17, 0x5a, 0xa6, 0xd3, 0xf5, 0xe2, 0x6e, 0x52, 0x74, 0x00, 0x73, 0x0e, 0xf6, 0xef, 0xd9, + 0xb8, 0x5c, 0xd7, 0x83, 0x1a, 0xa5, 0x89, 0x5c, 0x49, 0x4e, 0xc4, 0x68, 0x3d, 0xad, 0x1a, 0x5b, + 0xca, 0x1d, 0x6a, 0x7a, 0xa8, 0x07, 0x35, 0x1e, 0x0b, 0x3a, 0x4d, 0x49, 0x84, 0xb2, 0xa1, 0xdb, + 0x21, 0x2e, 0x8c, 0x32, 0x94, 0xf4, 0x03, 0xbd, 0x04, 0x61, 0x60, 0x39, 0xb8, 0x5c, 0xc1, 0xb6, + 0x7e, 0x5c, 0x18, 0xa3, 0x6c, 0x35, 0x11, 0x49, 0xde, 0x8e, 0x04, 0x68, 0x01, 0xe6, 0x0c, 0xdb, + 0x33, 0xef, 0x71, 0xfd, 0xff, 0xa8, 0x1e, 0x52, 0x11, 0x35, 0x90, 0x5f, 0xe7, 0xb3, 0xed, 0xd2, + 0xbd, 0xd6, 0xb9, 0xf0, 0x31, 0x09, 0xed, 0x80, 0xf6, 0x6e, 0x5c, 0xe3, 0x5f, 0xa5, 0xaf, 0x26, + 0xe1, 0x28, 0x75, 0x47, 0x5f, 0x03, 0x98, 0x4b, 0xec, 0x0c, 0xba, 0x26, 0xea, 0x53, 0x97, 0x57, + 0x9e, 0xb4, 0x9e, 0xcd, 0x98, 0x81, 0x91, 0xaf, 0x3f, 0xfc, 0xf5, 0xaf, 0x2f, 0x86, 0x55, 0xb4, + 0xa1, 0x76, 0x7d, 0xd0, 0x72, 0x3a, 0x50, 0x1f, 0x34, 0x87, 0x7e, 0x82, 0xbe, 0x04, 0x30, 0x9f, + 0x7c, 0xa9, 0xa0, 0x4c, 0x59, 0xe3, 0x63, 0x2e, 0x6d, 0x64, 0xb4, 0xe6, 0x20, 0xaf, 0x52, 0x90, + 0xcb, 0x68, 0xa9, 0x2f, 0x48, 0xf4, 0x0c, 0xc0, 0xc9, 0xf4, 0x52, 0x23, 0xa5, 0x7b, 0x32, 0xd1, + 0xd9, 0x93, 0xd4, 0xcc, 0xf6, 0x1c, 0x9e, 0x4d, 0xe1, 0x1d, 0xa1, 0x8a, 0x10, 0x5e, 0x1b, 0xab, + 0x26, 0xdb, 0xa8, 0xc6, 0x2f, 0x21, 0xf5, 0x41, 0xdb, 0x9b, 0xea, 0x44, 0x65, 0x07, 0x25, 0xa1, + 0x60, 0x82, 0x13, 0xf4, 0x18, 0xc0, 0xa9, 0x36, 0x16, 0x47, 0x59, 0x21, 0x37, 0x07, 0xb0, 0x99, + 0xdd, 0x81, 0x17, 0xb9, 0x47, 0x8b, 0x2c, 0xa1, 0xcd, 0x41, 0x8b, 0x44, 0xa7, 0x00, 0xce, 0x08, + 0x29, 0x12, 0x5d, 0xcf, 0x88, 0x22, 0xcd, 0xee, 0xd2, 0xce, 0xa0, 0x6e, 0xbc, 0x84, 0x37, 0x69, + 0x09, 0x37, 0xd0, 0xde, 0xc0, 0x73, 0xe2, 0x84, 0x8d, 0xbe, 0x49, 0xad, 0x7d, 0x98, 0x6d, 0xed, + 0xc3, 0x81, 0xd6, 0xbe, 0x45, 0xa0, 0x99, 0xcf, 0x66, 0x98, 0xee, 0xf7, 0x67, 0x4d, 0x90, 0x8c, + 0x0b, 0xfb, 0x82, 0x4c, 0x51, 0x70, 0x5f, 0x90, 0x69, 0x52, 0x96, 0x65, 0x0a, 0x72, 0x1e, 0x49, + 0x22, 0x90, 0x8c, 0x84, 0xd1, 0x77, 0x00, 0x5e, 0x12, 0xb0, 0x2b, 0xda, 0xee, 0x9a, 0xaa, 0x3b, + 0x5d, 0x4b, 0xaf, 0x0e, 0xe6, 0xc4, 0x61, 0x96, 0x28, 0xcc, 0x75, 0xb4, 0x26, 0x82, 0x29, 0xa4, + 0x76, 0x82, 0x7e, 0x04, 0x70, 0x56, 0x4c, 0xc0, 0x68, 0xa7, 0x3f, 0x08, 0xe1, 0xdd, 0xb2, 0x3b, + 0xb0, 0x5f, 0x96, 0x5d, 0xe8, 0xf6, 0x06, 0x20, 0xe8, 0x27, 0x00, 0x67, 0x84, 0x6c, 0xd4, 0xe3, + 0xec, 0xf5, 0xe2, 0xfe, 0x1e, 0x67, 0xaf, 0x27, 0xe9, 0xc9, 0xaf, 0x3d, 0xfa, 0xfb, 0xc9, 0x1a, + 0xa0, 0x45, 0x6c, 0xde, 0x00, 0x6b, 0xf2, 0x35, 0x51, 0x1d, 0x0d, 0x1a, 0xa2, 0xec, 0x34, 0x63, + 0x94, 0x29, 0xfd, 0xef, 0x6b, 0xa7, 0x67, 0x45, 0xf0, 0xf4, 0xac, 0x08, 0xfe, 0x3c, 0x2b, 0x82, + 0xcf, 0xcf, 0x8b, 0x43, 0x4f, 0xcf, 0x8b, 0x43, 0xbf, 0x9f, 0x17, 0x87, 0x3e, 0xd9, 0xab, 0x5a, + 0x41, 0x2d, 0x34, 0x22, 0xea, 0x57, 0xf9, 0xdf, 0x35, 0x96, 0x61, 0x6e, 0x54, 0x3d, 0xb5, 0xb1, + 0xa7, 0x3a, 0x5e, 0x25, 0xb4, 0x31, 0x61, 0x59, 0x36, 0x4b, 0x1b, 0x3c, 0x51, 0x70, 0x5c, 0xc7, + 0xc4, 0x18, 0xa3, 0x0f, 0xa2, 0xed, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x81, 0xdf, 0x7c, 0xf4, + 0x46, 0x12, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1085,6 +1247,8 @@ type QueryClient interface { UpgradedClientState(ctx context.Context, in *QueryUpgradedClientStateRequest, opts ...grpc.CallOption) (*QueryUpgradedClientStateResponse, error) // UpgradedConsensusState queries an Upgraded IBC consensus state. UpgradedConsensusState(ctx context.Context, in *QueryUpgradedConsensusStateRequest, opts ...grpc.CallOption) (*QueryUpgradedConsensusStateResponse, error) + // VerifyMembershipProof queries an IBC light client for proof verification of a value at a given key path. + VerifyMembershipProof(ctx context.Context, in *QueryVerifyMembershipProofRequest, opts ...grpc.CallOption) (*QueryVerifyMembershipProofResponse, error) } type queryClient struct { @@ -1176,6 +1340,15 @@ func (c *queryClient) UpgradedConsensusState(ctx context.Context, in *QueryUpgra return out, nil } +func (c *queryClient) VerifyMembershipProof(ctx context.Context, in *QueryVerifyMembershipProofRequest, opts ...grpc.CallOption) (*QueryVerifyMembershipProofResponse, error) { + out := new(QueryVerifyMembershipProofResponse) + err := c.cc.Invoke(ctx, "/ibc.core.client.v1.Query/VerifyMembershipProof", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. type QueryServer interface { // ClientState queries an IBC light client. @@ -1198,6 +1371,8 @@ type QueryServer interface { UpgradedClientState(context.Context, *QueryUpgradedClientStateRequest) (*QueryUpgradedClientStateResponse, error) // UpgradedConsensusState queries an Upgraded IBC consensus state. UpgradedConsensusState(context.Context, *QueryUpgradedConsensusStateRequest) (*QueryUpgradedConsensusStateResponse, error) + // VerifyMembershipProof queries an IBC light client for proof verification of a value at a given key path. + VerifyMembershipProof(context.Context, *QueryVerifyMembershipProofRequest) (*QueryVerifyMembershipProofResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -1231,6 +1406,9 @@ func (*UnimplementedQueryServer) UpgradedClientState(ctx context.Context, req *Q func (*UnimplementedQueryServer) UpgradedConsensusState(ctx context.Context, req *QueryUpgradedConsensusStateRequest) (*QueryUpgradedConsensusStateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpgradedConsensusState not implemented") } +func (*UnimplementedQueryServer) VerifyMembershipProof(ctx context.Context, req *QueryVerifyMembershipProofRequest) (*QueryVerifyMembershipProofResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method VerifyMembershipProof not implemented") +} func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) @@ -1398,6 +1576,24 @@ func _Query_UpgradedConsensusState_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _Query_VerifyMembershipProof_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryVerifyMembershipProofRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).VerifyMembershipProof(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/ibc.core.client.v1.Query/VerifyMembershipProof", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).VerifyMembershipProof(ctx, req.(*QueryVerifyMembershipProofRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "ibc.core.client.v1.Query", HandlerType: (*QueryServer)(nil), @@ -1438,6 +1634,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "UpgradedConsensusState", Handler: _Query_UpgradedConsensusState_Handler, }, + { + MethodName: "VerifyMembershipProof", + Handler: _Query_VerifyMembershipProof_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "ibc/core/client/v1/query.proto", @@ -2127,6 +2327,113 @@ func (m *QueryUpgradedConsensusStateResponse) MarshalToSizedBuffer(dAtA []byte) return len(dAtA) - i, nil } +func (m *QueryVerifyMembershipProofRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryVerifyMembershipProofRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryVerifyMembershipProofRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.BlockDelay != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.BlockDelay)) + i-- + dAtA[i] = 0x38 + } + if m.TimeDelay != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.TimeDelay)) + i-- + dAtA[i] = 0x30 + } + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x2a + } + { + size, err := m.MerklePath.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size, err := m.ProofHeight.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + if len(m.Proof) > 0 { + i -= len(m.Proof) + copy(dAtA[i:], m.Proof) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Proof))) + i-- + dAtA[i] = 0x12 + } + if len(m.ClientId) > 0 { + i -= len(m.ClientId) + copy(dAtA[i:], m.ClientId) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ClientId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryVerifyMembershipProofResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryVerifyMembershipProofResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryVerifyMembershipProofResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Result { + i-- + if m.Result { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { offset -= sovQuery(v) base := offset @@ -2407,6 +2714,49 @@ func (m *QueryUpgradedConsensusStateResponse) Size() (n int) { return n } +func (m *QueryVerifyMembershipProofRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClientId) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.Proof) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = m.ProofHeight.Size() + n += 1 + l + sovQuery(uint64(l)) + l = m.MerklePath.Size() + n += 1 + l + sovQuery(uint64(l)) + l = len(m.Value) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + if m.TimeDelay != 0 { + n += 1 + sovQuery(uint64(m.TimeDelay)) + } + if m.BlockDelay != 0 { + n += 1 + sovQuery(uint64(m.BlockDelay)) + } + return n +} + +func (m *QueryVerifyMembershipProofResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Result { + n += 2 + } + return n +} + func sovQuery(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -4195,6 +4545,330 @@ func (m *QueryUpgradedConsensusStateResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *QueryVerifyMembershipProofRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryVerifyMembershipProofRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryVerifyMembershipProofRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClientId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Proof", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Proof = append(m.Proof[:0], dAtA[iNdEx:postIndex]...) + if m.Proof == nil { + m.Proof = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProofHeight", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ProofHeight.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MerklePath", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.MerklePath.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) + if m.Value == nil { + m.Value = []byte{} + } + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TimeDelay", wireType) + } + m.TimeDelay = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TimeDelay |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BlockDelay", wireType) + } + m.BlockDelay = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.BlockDelay |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryVerifyMembershipProofResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryVerifyMembershipProofResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryVerifyMembershipProofResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Result = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipQuery(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/modules/core/02-client/types/query.pb.gw.go b/modules/core/02-client/types/query.pb.gw.go index 1e0e41f2579..261f119c606 100644 --- a/modules/core/02-client/types/query.pb.gw.go +++ b/modules/core/02-client/types/query.pb.gw.go @@ -491,6 +491,40 @@ func local_request_Query_UpgradedConsensusState_0(ctx context.Context, marshaler } +func request_Query_VerifyMembershipProof_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryVerifyMembershipProofRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.VerifyMembershipProof(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_VerifyMembershipProof_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryVerifyMembershipProofRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.VerifyMembershipProof(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -704,6 +738,29 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("POST", pattern_Query_VerifyMembershipProof_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_VerifyMembershipProof_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_VerifyMembershipProof_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -925,6 +982,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("POST", pattern_Query_VerifyMembershipProof_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_VerifyMembershipProof_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_VerifyMembershipProof_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -946,6 +1023,8 @@ var ( pattern_Query_UpgradedClientState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"ibc", "core", "client", "v1", "upgraded_client_states"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_UpgradedConsensusState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"ibc", "core", "client", "v1", "upgraded_consensus_states"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_VerifyMembershipProof_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"ibc", "core", "client", "v1", "verify_membership_proof"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( @@ -966,4 +1045,6 @@ var ( forward_Query_UpgradedClientState_0 = runtime.ForwardResponseMessage forward_Query_UpgradedConsensusState_0 = runtime.ForwardResponseMessage + + forward_Query_VerifyMembershipProof_0 = runtime.ForwardResponseMessage ) diff --git a/proto/ibc/core/client/v1/query.proto b/proto/ibc/core/client/v1/query.proto index c5f053010ce..51acc53086f 100644 --- a/proto/ibc/core/client/v1/query.proto +++ b/proto/ibc/core/client/v1/query.proto @@ -5,7 +5,9 @@ package ibc.core.client.v1; option go_package = "github.com/cosmos/ibc-go/v8/modules/core/02-client/types"; import "cosmos/base/query/v1beta1/pagination.proto"; +import "cosmos/query/v1/query.proto"; import "ibc/core/client/v1/client.proto"; +import "ibc/core/commitment/v1/commitment.proto"; import "google/protobuf/any.proto"; import "google/api/annotations.proto"; import "gogoproto/gogo.proto"; @@ -60,6 +62,15 @@ service Query { rpc UpgradedConsensusState(QueryUpgradedConsensusStateRequest) returns (QueryUpgradedConsensusStateResponse) { option (google.api.http).get = "/ibc/core/client/v1/upgraded_consensus_states"; } + + // VerifyMembershipProof queries an IBC light client for proof verification of a value at a given key path. + rpc VerifyMembershipProof(QueryVerifyMembershipProofRequest) returns (QueryVerifyMembershipProofResponse) { + option (cosmos.query.v1.module_query_safe) = true; + option (google.api.http) = { + post: "/ibc/core/client/v1/verify_membership_proof" + body: "*" + }; + } } // QueryClientStateRequest is the request type for the Query/ClientState RPC @@ -205,3 +216,27 @@ message QueryUpgradedConsensusStateResponse { // Consensus state associated with the request identifier google.protobuf.Any upgraded_consensus_state = 1; } + +// QueryVerifyMembershipProofRequest is the request type for the Query/VerifyMembershipProof RPC method +message QueryVerifyMembershipProofRequest { + // client unique identifier. + string client_id = 1; + // the proof to be verified by the client. + bytes proof = 2; + // the height at which the proof is verified. + ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; + // the commitment key path. + ibc.core.commitment.v1.MerklePath merkle_path = 4 [(gogoproto.nullable) = false]; + // the value which is proven. + bytes value = 5; + // optional time delay + uint64 time_delay = 6; + // optional block delay + uint64 block_delay = 7; +} + +// QueryVerifyMembershipProofResponse is the response type for the Query/VerifyMembershipProof RPC method +message QueryVerifyMembershipProofResponse { + // result identicating success or failure of proof verification. + bool result = 1; +} \ No newline at end of file From 18e540412c05671975547425ddef6c452be16181 Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Wed, 7 Feb 2024 14:26:40 +0100 Subject: [PATCH 02/18] feat: adding VerifyMembershipProof query implementation and wiring --- modules/core/02-client/keeper/grpc_query.go | 51 +++++++++++++++++++++ modules/core/keeper/grpc_query.go | 5 ++ 2 files changed, 56 insertions(+) diff --git a/modules/core/02-client/keeper/grpc_query.go b/modules/core/02-client/keeper/grpc_query.go index 12daed284c7..675f8cbe952 100644 --- a/modules/core/02-client/keeper/grpc_query.go +++ b/modules/core/02-client/keeper/grpc_query.go @@ -328,3 +328,54 @@ func (k Keeper) UpgradedConsensusState(c context.Context, req *types.QueryUpgrad UpgradedConsensusState: protoAny, }, nil } + +// VerifyMembershipProof implements the Query/VerifyMembershipProof gRPC method +func (k Keeper) VerifyMembershipProof(c context.Context, req *types.QueryVerifyMembershipProofRequest) (*types.QueryVerifyMembershipProofResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "empty request") + } + + if err := host.ClientIdentifierValidator(req.ClientId); err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + + if len(req.Proof) == 0 { + return nil, status.Error(codes.InvalidArgument, "empty proof") + } + + if req.ProofHeight.IsZero() { + return nil, status.Error(codes.InvalidArgument, "proof height must be non-zero") + } + + if req.MerklePath.Empty() { + return nil, status.Error(codes.InvalidArgument, "empty merkle path") + } + + if len(req.Value) == 0 { + return nil, status.Error(codes.InvalidArgument, "empty value") + } + + ctx := sdk.UnwrapSDKContext(c) + // cache the context to ensure clientState.VerifyMembership does not change state + cachedCtx, _ := ctx.CacheContext() + + // make sure we charge the higher level context even on panic + defer func() { + ctx.GasMeter().ConsumeGas(cachedCtx.GasMeter().GasConsumed(), "verify membership query") + }() + + clientState, found := k.GetClientState(cachedCtx, req.ClientId) + if !found { + return nil, status.Error(codes.NotFound, errorsmod.Wrap(types.ErrClientNotFound, req.ClientId).Error()) + } + + if err := clientState.VerifyMembership(ctx, k.ClientStore(cachedCtx, req.ClientId), k.cdc, req.ProofHeight, req.TimeDelay, req.BlockDelay, req.Proof, req.MerklePath, req.Value); err != nil { + return &types.QueryVerifyMembershipProofResponse{ + Result: false, + }, nil + } + + return &types.QueryVerifyMembershipProofResponse{ + Result: true, + }, nil +} diff --git a/modules/core/keeper/grpc_query.go b/modules/core/keeper/grpc_query.go index 59807638af0..e18efc3d2ea 100644 --- a/modules/core/keeper/grpc_query.go +++ b/modules/core/keeper/grpc_query.go @@ -53,6 +53,11 @@ func (k Keeper) UpgradedConsensusState(c context.Context, req *clienttypes.Query return k.ClientKeeper.UpgradedConsensusState(c, req) } +// VerifyMembershipProof implements the IBC QueryServer interface. +func (k Keeper) VerifyMembershipProof(c context.Context, req *clienttypes.QueryVerifyMembershipProofRequest) (*clienttypes.QueryVerifyMembershipProofResponse, error) { + return k.ClientKeeper.VerifyMembershipProof(c, req) +} + // Connection implements the IBC QueryServer interface func (k Keeper) Connection(c context.Context, req *connectiontypes.QueryConnectionRequest) (*connectiontypes.QueryConnectionResponse, error) { return k.ConnectionKeeper.Connection(c, req) From 1f720b68bdf3cf9ce0e0d4ee08980238afe92fc3 Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Wed, 7 Feb 2024 14:27:29 +0100 Subject: [PATCH 03/18] chore(08-wasm): add VerifyMembershipProof to stargate query acceptlist --- modules/light-clients/08-wasm/types/querier.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/light-clients/08-wasm/types/querier.go b/modules/light-clients/08-wasm/types/querier.go index e37b9bc9ad3..58d9e075fa5 100644 --- a/modules/light-clients/08-wasm/types/querier.go +++ b/modules/light-clients/08-wasm/types/querier.go @@ -128,9 +128,13 @@ func NewDefaultQueryPlugins() *QueryPlugins { // AcceptListStargateQuerier allows all queries that are in the provided accept list. // This function returns protobuf encoded responses in bytes. func AcceptListStargateQuerier(acceptedQueries []string) func(sdk.Context, *wasmvmtypes.StargateQuery) ([]byte, error) { + defaultAcceptList := []string{ + "/ibc.core.client.v1.Query/VerifyMembershipProof", + } + return func(ctx sdk.Context, request *wasmvmtypes.StargateQuery) ([]byte, error) { // A default list of accepted queries can be added here. - // accepted = append(defaultAcceptList, accepted...) + acceptedQueries = append(defaultAcceptList, acceptedQueries...) isAccepted := slices.Contains(acceptedQueries, request.Path) if !isAccepted { From 37435a6c06ad90647924a61a90ab0365c86c1aff Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Wed, 7 Feb 2024 14:28:13 +0100 Subject: [PATCH 04/18] test: adding failure case unit tests for VerifyMembershipProof query --- .../core/02-client/keeper/grpc_query_test.go | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/modules/core/02-client/keeper/grpc_query_test.go b/modules/core/02-client/keeper/grpc_query_test.go index 9e15f9808b1..b8dfc2530e9 100644 --- a/modules/core/02-client/keeper/grpc_query_test.go +++ b/modules/core/02-client/keeper/grpc_query_test.go @@ -1,6 +1,7 @@ package keeper_test import ( + "errors" "fmt" "google.golang.org/grpc/codes" @@ -12,9 +13,12 @@ import ( "github.com/cosmos/cosmos-sdk/types/query" "github.com/cosmos/ibc-go/v8/modules/core/02-client/types" + commitmenttypes "github.com/cosmos/ibc-go/v8/modules/core/23-commitment/types" + host "github.com/cosmos/ibc-go/v8/modules/core/24-host" "github.com/cosmos/ibc-go/v8/modules/core/exported" ibctm "github.com/cosmos/ibc-go/v8/modules/light-clients/07-tendermint" ibctesting "github.com/cosmos/ibc-go/v8/testing" + "github.com/cosmos/ibc-go/v8/testing/mock" ) func (suite *KeeperTestSuite) TestQueryClientState() { @@ -770,3 +774,104 @@ func (suite *KeeperTestSuite) TestQueryClientParams() { res, _ := suite.chainA.QueryServer.ClientParams(ctx, &types.QueryClientParamsRequest{}) suite.Require().Equal(&expParams, res.Params) } + +func (suite *KeeperTestSuite) TestQueryVerifyMembershipProof() { + var req *types.QueryVerifyMembershipProofRequest + + testCases := []struct { + name string + malleate func() + expError error + }{ + // TODO(damian): add success case + // { + // "success", + // func() {}, + // nil, + // }, + { + "req is nil", + func() { + req = nil + }, + errors.New("empty request"), + }, + { + "invalid client ID", + func() { + req = &types.QueryVerifyMembershipProofRequest{ + ClientId: "//invalid_id", + } + }, + host.ErrInvalidID, + }, + { + "empty proof", + func() { + req = &types.QueryVerifyMembershipProofRequest{ + ClientId: ibctesting.FirstClientID, + Proof: []byte{}, + } + }, + errors.New("empty proof"), + }, + { + "invalid proof height", + func() { + req = &types.QueryVerifyMembershipProofRequest{ + ClientId: ibctesting.FirstClientID, + Proof: []byte{0x01}, + ProofHeight: types.ZeroHeight(), + } + }, + errors.New("proof height must be non-zero"), + }, + { + "empty merkle path", + func() { + req = &types.QueryVerifyMembershipProofRequest{ + ClientId: ibctesting.FirstClientID, + Proof: []byte{0x01}, + ProofHeight: types.NewHeight(1, 100), + } + }, + errors.New("empty merkle path"), + }, + { + "empty value", + func() { + req = &types.QueryVerifyMembershipProofRequest{ + ClientId: ibctesting.FirstClientID, + Proof: []byte{0x01}, + ProofHeight: types.NewHeight(1, 100), + MerklePath: commitmenttypes.NewMerklePath("/ibc", host.ChannelPath(mock.PortID, ibctesting.FirstChannelID)), + } + }, + errors.New("empty value"), + }, + } + + for _, tc := range testCases { + tc := tc + + suite.Run(tc.name, func() { + suite.SetupTest() // reset + + path := ibctesting.NewPath(suite.chainA, suite.chainB) + path.SetupClients() + + tc.malleate() + + ctx := suite.chainA.GetContext() + res, err := suite.chainA.QueryServer.VerifyMembershipProof(ctx, req) + + expPass := tc.expError == nil + if expPass { + suite.Require().NoError(err) + suite.Require().NotNil(res) + } else { + suite.Require().ErrorContains(err, tc.expError.Error()) + } + }) + } +} From 2569bd4b7f7c906d4c33e5f849c77b6876d389dc Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Wed, 7 Feb 2024 14:35:39 +0100 Subject: [PATCH 05/18] fix: correct protodoc --- modules/core/02-client/types/query.pb.go | 2 +- proto/ibc/core/client/v1/query.proto | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/core/02-client/types/query.pb.go b/modules/core/02-client/types/query.pb.go index 5363cf5928b..e877b47901f 100644 --- a/modules/core/02-client/types/query.pb.go +++ b/modules/core/02-client/types/query.pb.go @@ -1063,7 +1063,7 @@ func (m *QueryVerifyMembershipProofRequest) GetBlockDelay() uint64 { // QueryVerifyMembershipProofResponse is the response type for the Query/VerifyMembershipProof RPC method type QueryVerifyMembershipProofResponse struct { - // result identicating success or failure of proof verification. + // result indicating success or failure of proof verification. Result bool `protobuf:"varint,1,opt,name=result,proto3" json:"result,omitempty"` } diff --git a/proto/ibc/core/client/v1/query.proto b/proto/ibc/core/client/v1/query.proto index 51acc53086f..863d5be040f 100644 --- a/proto/ibc/core/client/v1/query.proto +++ b/proto/ibc/core/client/v1/query.proto @@ -237,6 +237,6 @@ message QueryVerifyMembershipProofRequest { // QueryVerifyMembershipProofResponse is the response type for the Query/VerifyMembershipProof RPC method message QueryVerifyMembershipProofResponse { - // result identicating success or failure of proof verification. + // result indicating success or failure of proof verification. bool result = 1; } \ No newline at end of file From 06d2f59f5d4dde5c4abda15b8debb01755d574a3 Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Wed, 7 Feb 2024 14:36:09 +0100 Subject: [PATCH 06/18] chore: proto-swagger-gen --- docs/client/swagger-ui/swagger.yaml | 387 ++++++++++++++++++++++++++++ 1 file changed, 387 insertions(+) diff --git a/docs/client/swagger-ui/swagger.yaml b/docs/client/swagger-ui/swagger.yaml index 60a43a59c7d..265be12f312 100644 --- a/docs/client/swagger-ui/swagger.yaml +++ b/docs/client/swagger-ui/swagger.yaml @@ -6896,6 +6896,299 @@ paths: } tags: - Query + /ibc/core/client/v1/verify_membership_proof: + post: + summary: >- + VerifyMembershipProof queries an IBC light client for proof verification + of a value at a given key path. + operationId: VerifyMembershipProof + responses: + '200': + description: A successful response. + schema: + type: object + properties: + result: + type: boolean + description: result indicating success or failure of proof verification. + title: >- + QueryVerifyMembershipProofResponse is the response type for the + Query/VerifyMembershipProof RPC method + default: + description: An unexpected error response. + schema: + type: object + properties: + error: + type: string + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + properties: + type_url: + type: string + description: >- + A URL/resource name that uniquely identifies the type of + the serialized + + protocol buffer message. This string must contain at + least + + one "/" character. The last segment of the URL's path + must represent + + the fully qualified name of the type (as in + + `path/google.protobuf.Duration`). The name should be in + a canonical form + + (e.g., leading "." is not accepted). + + + In practice, teams usually precompile into the binary + all types that they + + expect it to use in the context of Any. However, for + URLs which use the + + scheme `http`, `https`, or no scheme, one can optionally + set up a type + + server that maps type URLs to message definitions as + follows: + + + * If no scheme is provided, `https` is assumed. + + * An HTTP GET on the URL must yield a + [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based + on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in + the official + + protobuf release, and it is not used for type URLs + beginning with + + type.googleapis.com. + + + Schemes other than `http`, `https` (or the empty scheme) + might be + + used with implementation specific semantics. + value: + type: string + format: byte + description: >- + Must be a valid serialized protocol buffer of the above + specified type. + description: >- + `Any` contains an arbitrary serialized protocol buffer + message along with a + + URL that describes the type of the serialized message. + + + Protobuf library provides support to pack/unpack Any values + in the form + + of utility functions or additional generated methods of the + Any type. + + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by + default use + + 'type.googleapis.com/full.type.name' as the type URL and the + unpack + + methods only use the fully qualified type name after the + last '/' + + in the type URL, for example "foo.bar.com/x/y.z" will yield + type + + name "y.z". + + + JSON + + + The JSON representation of an `Any` value uses the regular + + representation of the deserialized, embedded message, with + an + + additional field `@type` which contains the type URL. + Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom + JSON + + representation, that representation will be embedded adding + a field + + `value` which holds the custom JSON in addition to the + `@type` + + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + parameters: + - name: body + in: body + required: true + schema: + type: object + properties: + client_id: + type: string + description: client unique identifier. + proof: + type: string + format: byte + description: the proof to be verified by the client. + proof_height: + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height + while keeping + + RevisionNumber the same. However some consensus algorithms may + choose to + + reset the height in certain conditions e.g. hard forks, + state-machine + + breaking changes In these cases, the RevisionNumber is + incremented so that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: >- + Height is a monotonically increasing data type + + that can be compared against another Height for the purposes + of updating and + + freezing clients + merkle_path: + description: the commitment key path. + type: object + properties: + key_path: + type: array + items: + type: string + title: >- + MerklePath is the path used to verify commitment proofs, which + can be an + + arbitrary structured object (defined by a commitment type). + + MerklePath is represented from root-to-leaf + value: + type: string + format: byte + description: the value which is proven. + time_delay: + type: string + format: uint64 + title: optional time delay + block_delay: + type: string + format: uint64 + title: optional block delay + title: >- + QueryVerifyMembershipProofRequest is the request type for the + Query/VerifyMembershipProof RPC method + tags: + - Query /ibc/core/connection/v1/client_connections/{client_id}: get: summary: |- @@ -17919,6 +18212,100 @@ definitions: description: |- QueryUpgradedConsensusStateResponse is the response type for the Query/UpgradedConsensusState RPC method. + ibc.core.client.v1.QueryVerifyMembershipProofRequest: + type: object + properties: + client_id: + type: string + description: client unique identifier. + proof: + type: string + format: byte + description: the proof to be verified by the client. + proof_height: + type: object + properties: + revision_number: + type: string + format: uint64 + title: the revision that the client is currently on + revision_height: + type: string + format: uint64 + title: the height within the given revision + description: >- + Normally the RevisionHeight is incremented at each height while + keeping + + RevisionNumber the same. However some consensus algorithms may choose + to + + reset the height in certain conditions e.g. hard forks, state-machine + + breaking changes In these cases, the RevisionNumber is incremented so + that + + height continues to be monitonically increasing even as the + RevisionHeight + + gets reset + title: >- + Height is a monotonically increasing data type + + that can be compared against another Height for the purposes of + updating and + + freezing clients + merkle_path: + description: the commitment key path. + type: object + properties: + key_path: + type: array + items: + type: string + title: >- + MerklePath is the path used to verify commitment proofs, which can be + an + + arbitrary structured object (defined by a commitment type). + + MerklePath is represented from root-to-leaf + value: + type: string + format: byte + description: the value which is proven. + time_delay: + type: string + format: uint64 + title: optional time delay + block_delay: + type: string + format: uint64 + title: optional block delay + title: >- + QueryVerifyMembershipProofRequest is the request type for the + Query/VerifyMembershipProof RPC method + ibc.core.client.v1.QueryVerifyMembershipProofResponse: + type: object + properties: + result: + type: boolean + description: result indicating success or failure of proof verification. + title: >- + QueryVerifyMembershipProofResponse is the response type for the + Query/VerifyMembershipProof RPC method + ibc.core.commitment.v1.MerklePath: + type: object + properties: + key_path: + type: array + items: + type: string + title: |- + MerklePath is the path used to verify commitment proofs, which can be an + arbitrary structured object (defined by a commitment type). + MerklePath is represented from root-to-leaf ibc.core.commitment.v1.MerklePrefix: type: object properties: From a2fc9a75c877c4b2e4fbd48eda5cbb0f9da8716d Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Wed, 7 Feb 2024 14:40:25 +0100 Subject: [PATCH 07/18] chore: protodocs --- modules/core/02-client/types/query.pb.go | 2 +- proto/ibc/core/client/v1/query.proto | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/core/02-client/types/query.pb.go b/modules/core/02-client/types/query.pb.go index e877b47901f..23632763b48 100644 --- a/modules/core/02-client/types/query.pb.go +++ b/modules/core/02-client/types/query.pb.go @@ -967,7 +967,7 @@ type QueryVerifyMembershipProofRequest struct { ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` // the proof to be verified by the client. Proof []byte `protobuf:"bytes,2,opt,name=proof,proto3" json:"proof,omitempty"` - // the height at which the proof is verified. + // the height of the commitment root at which the proof is verified. ProofHeight Height `protobuf:"bytes,3,opt,name=proof_height,json=proofHeight,proto3" json:"proof_height"` // the commitment key path. MerklePath types1.MerklePath `protobuf:"bytes,4,opt,name=merkle_path,json=merklePath,proto3" json:"merkle_path"` diff --git a/proto/ibc/core/client/v1/query.proto b/proto/ibc/core/client/v1/query.proto index 863d5be040f..ca9413b50ba 100644 --- a/proto/ibc/core/client/v1/query.proto +++ b/proto/ibc/core/client/v1/query.proto @@ -223,7 +223,7 @@ message QueryVerifyMembershipProofRequest { string client_id = 1; // the proof to be verified by the client. bytes proof = 2; - // the height at which the proof is verified. + // the height of the commitment root at which the proof is verified. ibc.core.client.v1.Height proof_height = 3 [(gogoproto.nullable) = false]; // the commitment key path. ibc.core.commitment.v1.MerklePath merkle_path = 4 [(gogoproto.nullable) = false]; From a2f139d8bc6920fa68e80e39d1c6d2752cff3368 Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Wed, 7 Feb 2024 15:30:27 +0100 Subject: [PATCH 08/18] test: adding additional test cases --- .../core/02-client/keeper/grpc_query_test.go | 54 +++++++++++++++---- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/modules/core/02-client/keeper/grpc_query_test.go b/modules/core/02-client/keeper/grpc_query_test.go index b8dfc2530e9..fc1ce61af07 100644 --- a/modules/core/02-client/keeper/grpc_query_test.go +++ b/modules/core/02-client/keeper/grpc_query_test.go @@ -776,19 +776,39 @@ func (suite *KeeperTestSuite) TestQueryClientParams() { } func (suite *KeeperTestSuite) TestQueryVerifyMembershipProof() { - var req *types.QueryVerifyMembershipProofRequest + var ( + path *ibctesting.Path + req *types.QueryVerifyMembershipProofRequest + ) testCases := []struct { name string malleate func() expError error }{ - // TODO(damian): add success case - // { - // "success", - // func() {}, - // nil, - // }, + { + "success", + func() { + channel := path.EndpointB.GetChannel() + bz, err := suite.chainB.Codec.Marshal(&channel) + suite.Require().NoError(err) + + channelProof, proofHeight := path.EndpointB.QueryProof(host.ChannelKey(path.EndpointB.ChannelConfig.PortID, path.EndpointB.ChannelID)) + + merklePath := commitmenttypes.NewMerklePath(host.ChannelPath(path.EndpointB.ChannelConfig.PortID, path.EndpointB.ChannelID)) + merklePath, err = commitmenttypes.ApplyPrefix(suite.chainB.GetPrefix(), merklePath) + suite.Require().NoError(err) + + req = &types.QueryVerifyMembershipProofRequest{ + ClientId: path.EndpointA.ClientID, + Proof: channelProof, + ProofHeight: proofHeight, + MerklePath: merklePath, + Value: bz, + } + }, + nil, + }, { "req is nil", func() { @@ -849,16 +869,28 @@ func (suite *KeeperTestSuite) TestQueryVerifyMembershipProof() { }, errors.New("empty value"), }, + { + "client not found", + func() { + req = &types.QueryVerifyMembershipProofRequest{ + ClientId: types.FormatClientIdentifier(exported.Tendermint, 100), // use a sequence which hasn't been created yet + Proof: []byte{0x01}, + ProofHeight: types.NewHeight(1, 100), + MerklePath: commitmenttypes.NewMerklePath("/ibc", host.ChannelPath(mock.PortID, ibctesting.FirstChannelID)), + Value: []byte{0x01}, + } + }, + types.ErrClientNotFound, + }, } for _, tc := range testCases { tc := tc - suite.Run(tc.name, func() { suite.SetupTest() // reset - path := ibctesting.NewPath(suite.chainA, suite.chainB) - path.SetupClients() + path = ibctesting.NewPath(suite.chainA, suite.chainB) + path.Setup() tc.malleate() @@ -868,7 +900,7 @@ func (suite *KeeperTestSuite) TestQueryVerifyMembershipProof() { expPass := tc.expError == nil if expPass { suite.Require().NoError(err) - suite.Require().NotNil(res) + suite.Require().True(res.GetResult(), "failed to verify membership proof") } else { suite.Require().ErrorContains(err, tc.expError.Error()) } From b72e541b779f055ef5b2eaabe249ea12f9e105ed Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Thu, 8 Feb 2024 12:04:03 +0100 Subject: [PATCH 09/18] test: assert gas consumed in tests --- modules/core/02-client/keeper/grpc_query_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/core/02-client/keeper/grpc_query_test.go b/modules/core/02-client/keeper/grpc_query_test.go index fc1ce61af07..6142028f225 100644 --- a/modules/core/02-client/keeper/grpc_query_test.go +++ b/modules/core/02-client/keeper/grpc_query_test.go @@ -895,12 +895,16 @@ func (suite *KeeperTestSuite) TestQueryVerifyMembershipProof() { tc.malleate() ctx := suite.chainA.GetContext() + prevGas := ctx.GasMeter().GasConsumed() res, err := suite.chainA.QueryServer.VerifyMembershipProof(ctx, req) expPass := tc.expError == nil if expPass { suite.Require().NoError(err) suite.Require().True(res.GetResult(), "failed to verify membership proof") + + gasConsumed := ctx.GasMeter().GasConsumed() + suite.Require().NotEqual(prevGas, gasConsumed) } else { suite.Require().ErrorContains(err, tc.expError.Error()) } From c19d6ed4d9f2bb92c63692ceed2baba0d57fee87 Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Thu, 8 Feb 2024 16:39:04 +0100 Subject: [PATCH 10/18] chore: rename rpc to VerifyMembership and update tests --- docs/client/swagger-ui/swagger.yaml | 34 +- modules/core/02-client/keeper/grpc_query.go | 12 +- .../core/02-client/keeper/grpc_query_test.go | 27 +- modules/core/02-client/types/query.pb.go | 315 +++++++++--------- modules/core/02-client/types/query.pb.gw.go | 28 +- modules/core/keeper/grpc_query.go | 6 +- proto/ibc/core/client/v1/query.proto | 16 +- 7 files changed, 220 insertions(+), 218 deletions(-) diff --git a/docs/client/swagger-ui/swagger.yaml b/docs/client/swagger-ui/swagger.yaml index 265be12f312..d74061283c4 100644 --- a/docs/client/swagger-ui/swagger.yaml +++ b/docs/client/swagger-ui/swagger.yaml @@ -6899,21 +6899,21 @@ paths: /ibc/core/client/v1/verify_membership_proof: post: summary: >- - VerifyMembershipProof queries an IBC light client for proof verification - of a value at a given key path. - operationId: VerifyMembershipProof + VerifyMembership queries an IBC light client for proof verification of a + value at a given key path. + operationId: VerifyMembership responses: '200': description: A successful response. schema: type: object properties: - result: + success: type: boolean - description: result indicating success or failure of proof verification. + description: boolean indicating success or failure of proof verification. title: >- - QueryVerifyMembershipProofResponse is the response type for the - Query/VerifyMembershipProof RPC method + QueryVerifyMembershipResponse is the response type for the + Query/VerifyMembership RPC method default: description: An unexpected error response. schema: @@ -7185,8 +7185,8 @@ paths: format: uint64 title: optional block delay title: >- - QueryVerifyMembershipProofRequest is the request type for the - Query/VerifyMembershipProof RPC method + QueryVerifyMembershipRequest is the request type for the + Query/VerifyMembership RPC method tags: - Query /ibc/core/connection/v1/client_connections/{client_id}: @@ -18212,7 +18212,7 @@ definitions: description: |- QueryUpgradedConsensusStateResponse is the response type for the Query/UpgradedConsensusState RPC method. - ibc.core.client.v1.QueryVerifyMembershipProofRequest: + ibc.core.client.v1.QueryVerifyMembershipRequest: type: object properties: client_id: @@ -18284,17 +18284,17 @@ definitions: format: uint64 title: optional block delay title: >- - QueryVerifyMembershipProofRequest is the request type for the - Query/VerifyMembershipProof RPC method - ibc.core.client.v1.QueryVerifyMembershipProofResponse: + QueryVerifyMembershipRequest is the request type for the + Query/VerifyMembership RPC method + ibc.core.client.v1.QueryVerifyMembershipResponse: type: object properties: - result: + success: type: boolean - description: result indicating success or failure of proof verification. + description: boolean indicating success or failure of proof verification. title: >- - QueryVerifyMembershipProofResponse is the response type for the - Query/VerifyMembershipProof RPC method + QueryVerifyMembershipResponse is the response type for the + Query/VerifyMembership RPC method ibc.core.commitment.v1.MerklePath: type: object properties: diff --git a/modules/core/02-client/keeper/grpc_query.go b/modules/core/02-client/keeper/grpc_query.go index 675f8cbe952..1a90976334f 100644 --- a/modules/core/02-client/keeper/grpc_query.go +++ b/modules/core/02-client/keeper/grpc_query.go @@ -329,8 +329,8 @@ func (k Keeper) UpgradedConsensusState(c context.Context, req *types.QueryUpgrad }, nil } -// VerifyMembershipProof implements the Query/VerifyMembershipProof gRPC method -func (k Keeper) VerifyMembershipProof(c context.Context, req *types.QueryVerifyMembershipProofRequest) (*types.QueryVerifyMembershipProofResponse, error) { +// VerifyMembership implements the Query/VerifyMembership gRPC method +func (k Keeper) VerifyMembership(c context.Context, req *types.QueryVerifyMembershipRequest) (*types.QueryVerifyMembershipResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "empty request") } @@ -370,12 +370,12 @@ func (k Keeper) VerifyMembershipProof(c context.Context, req *types.QueryVerifyM } if err := clientState.VerifyMembership(ctx, k.ClientStore(cachedCtx, req.ClientId), k.cdc, req.ProofHeight, req.TimeDelay, req.BlockDelay, req.Proof, req.MerklePath, req.Value); err != nil { - return &types.QueryVerifyMembershipProofResponse{ - Result: false, + return &types.QueryVerifyMembershipResponse{ + Success: false, }, nil } - return &types.QueryVerifyMembershipProofResponse{ - Result: true, + return &types.QueryVerifyMembershipResponse{ + Success: true, }, nil } diff --git a/modules/core/02-client/keeper/grpc_query_test.go b/modules/core/02-client/keeper/grpc_query_test.go index 6142028f225..650bf6bcddd 100644 --- a/modules/core/02-client/keeper/grpc_query_test.go +++ b/modules/core/02-client/keeper/grpc_query_test.go @@ -778,7 +778,7 @@ func (suite *KeeperTestSuite) TestQueryClientParams() { func (suite *KeeperTestSuite) TestQueryVerifyMembershipProof() { var ( path *ibctesting.Path - req *types.QueryVerifyMembershipProofRequest + req *types.QueryVerifyMembershipRequest ) testCases := []struct { @@ -799,7 +799,7 @@ func (suite *KeeperTestSuite) TestQueryVerifyMembershipProof() { merklePath, err = commitmenttypes.ApplyPrefix(suite.chainB.GetPrefix(), merklePath) suite.Require().NoError(err) - req = &types.QueryVerifyMembershipProofRequest{ + req = &types.QueryVerifyMembershipRequest{ ClientId: path.EndpointA.ClientID, Proof: channelProof, ProofHeight: proofHeight, @@ -819,7 +819,7 @@ func (suite *KeeperTestSuite) TestQueryVerifyMembershipProof() { { "invalid client ID", func() { - req = &types.QueryVerifyMembershipProofRequest{ + req = &types.QueryVerifyMembershipRequest{ ClientId: "//invalid_id", } }, @@ -828,7 +828,7 @@ func (suite *KeeperTestSuite) TestQueryVerifyMembershipProof() { { "empty proof", func() { - req = &types.QueryVerifyMembershipProofRequest{ + req = &types.QueryVerifyMembershipRequest{ ClientId: ibctesting.FirstClientID, Proof: []byte{}, } @@ -838,7 +838,7 @@ func (suite *KeeperTestSuite) TestQueryVerifyMembershipProof() { { "invalid proof height", func() { - req = &types.QueryVerifyMembershipProofRequest{ + req = &types.QueryVerifyMembershipRequest{ ClientId: ibctesting.FirstClientID, Proof: []byte{0x01}, ProofHeight: types.ZeroHeight(), @@ -849,7 +849,7 @@ func (suite *KeeperTestSuite) TestQueryVerifyMembershipProof() { { "empty merkle path", func() { - req = &types.QueryVerifyMembershipProofRequest{ + req = &types.QueryVerifyMembershipRequest{ ClientId: ibctesting.FirstClientID, Proof: []byte{0x01}, ProofHeight: types.NewHeight(1, 100), @@ -860,7 +860,7 @@ func (suite *KeeperTestSuite) TestQueryVerifyMembershipProof() { { "empty value", func() { - req = &types.QueryVerifyMembershipProofRequest{ + req = &types.QueryVerifyMembershipRequest{ ClientId: ibctesting.FirstClientID, Proof: []byte{0x01}, ProofHeight: types.NewHeight(1, 100), @@ -872,7 +872,7 @@ func (suite *KeeperTestSuite) TestQueryVerifyMembershipProof() { { "client not found", func() { - req = &types.QueryVerifyMembershipProofRequest{ + req = &types.QueryVerifyMembershipRequest{ ClientId: types.FormatClientIdentifier(exported.Tendermint, 100), // use a sequence which hasn't been created yet Proof: []byte{0x01}, ProofHeight: types.NewHeight(1, 100), @@ -895,18 +895,21 @@ func (suite *KeeperTestSuite) TestQueryVerifyMembershipProof() { tc.malleate() ctx := suite.chainA.GetContext() - prevGas := ctx.GasMeter().GasConsumed() - res, err := suite.chainA.QueryServer.VerifyMembershipProof(ctx, req) + initialGas := ctx.GasMeter().GasConsumed() + res, err := suite.chainA.QueryServer.VerifyMembership(ctx, req) expPass := tc.expError == nil if expPass { suite.Require().NoError(err) - suite.Require().True(res.GetResult(), "failed to verify membership proof") + suite.Require().True(res.Success, "failed to verify membership proof") gasConsumed := ctx.GasMeter().GasConsumed() - suite.Require().NotEqual(prevGas, gasConsumed) + suite.Require().Greater(gasConsumed, initialGas, "gas consumed should be greater than initial gas") } else { suite.Require().ErrorContains(err, tc.expError.Error()) + + gasConsumed := ctx.GasMeter().GasConsumed() + suite.Require().GreaterOrEqual(gasConsumed, initialGas, "gas consumed should be greater than or equal to initial gas") } }) } diff --git a/modules/core/02-client/types/query.pb.go b/modules/core/02-client/types/query.pb.go index 23632763b48..d3340fd84c9 100644 --- a/modules/core/02-client/types/query.pb.go +++ b/modules/core/02-client/types/query.pb.go @@ -961,8 +961,8 @@ func (m *QueryUpgradedConsensusStateResponse) GetUpgradedConsensusState() *types return nil } -// QueryVerifyMembershipProofRequest is the request type for the Query/VerifyMembershipProof RPC method -type QueryVerifyMembershipProofRequest struct { +// QueryVerifyMembershipRequest is the request type for the Query/VerifyMembership RPC method +type QueryVerifyMembershipRequest struct { // client unique identifier. ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` // the proof to be verified by the client. @@ -979,18 +979,18 @@ type QueryVerifyMembershipProofRequest struct { BlockDelay uint64 `protobuf:"varint,7,opt,name=block_delay,json=blockDelay,proto3" json:"block_delay,omitempty"` } -func (m *QueryVerifyMembershipProofRequest) Reset() { *m = QueryVerifyMembershipProofRequest{} } -func (m *QueryVerifyMembershipProofRequest) String() string { return proto.CompactTextString(m) } -func (*QueryVerifyMembershipProofRequest) ProtoMessage() {} -func (*QueryVerifyMembershipProofRequest) Descriptor() ([]byte, []int) { +func (m *QueryVerifyMembershipRequest) Reset() { *m = QueryVerifyMembershipRequest{} } +func (m *QueryVerifyMembershipRequest) String() string { return proto.CompactTextString(m) } +func (*QueryVerifyMembershipRequest) ProtoMessage() {} +func (*QueryVerifyMembershipRequest) Descriptor() ([]byte, []int) { return fileDescriptor_dc42cdfd1d52d76e, []int{18} } -func (m *QueryVerifyMembershipProofRequest) XXX_Unmarshal(b []byte) error { +func (m *QueryVerifyMembershipRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *QueryVerifyMembershipProofRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *QueryVerifyMembershipRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_QueryVerifyMembershipProofRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_QueryVerifyMembershipRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1000,85 +1000,85 @@ func (m *QueryVerifyMembershipProofRequest) XXX_Marshal(b []byte, deterministic return b[:n], nil } } -func (m *QueryVerifyMembershipProofRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryVerifyMembershipProofRequest.Merge(m, src) +func (m *QueryVerifyMembershipRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryVerifyMembershipRequest.Merge(m, src) } -func (m *QueryVerifyMembershipProofRequest) XXX_Size() int { +func (m *QueryVerifyMembershipRequest) XXX_Size() int { return m.Size() } -func (m *QueryVerifyMembershipProofRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryVerifyMembershipProofRequest.DiscardUnknown(m) +func (m *QueryVerifyMembershipRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryVerifyMembershipRequest.DiscardUnknown(m) } -var xxx_messageInfo_QueryVerifyMembershipProofRequest proto.InternalMessageInfo +var xxx_messageInfo_QueryVerifyMembershipRequest proto.InternalMessageInfo -func (m *QueryVerifyMembershipProofRequest) GetClientId() string { +func (m *QueryVerifyMembershipRequest) GetClientId() string { if m != nil { return m.ClientId } return "" } -func (m *QueryVerifyMembershipProofRequest) GetProof() []byte { +func (m *QueryVerifyMembershipRequest) GetProof() []byte { if m != nil { return m.Proof } return nil } -func (m *QueryVerifyMembershipProofRequest) GetProofHeight() Height { +func (m *QueryVerifyMembershipRequest) GetProofHeight() Height { if m != nil { return m.ProofHeight } return Height{} } -func (m *QueryVerifyMembershipProofRequest) GetMerklePath() types1.MerklePath { +func (m *QueryVerifyMembershipRequest) GetMerklePath() types1.MerklePath { if m != nil { return m.MerklePath } return types1.MerklePath{} } -func (m *QueryVerifyMembershipProofRequest) GetValue() []byte { +func (m *QueryVerifyMembershipRequest) GetValue() []byte { if m != nil { return m.Value } return nil } -func (m *QueryVerifyMembershipProofRequest) GetTimeDelay() uint64 { +func (m *QueryVerifyMembershipRequest) GetTimeDelay() uint64 { if m != nil { return m.TimeDelay } return 0 } -func (m *QueryVerifyMembershipProofRequest) GetBlockDelay() uint64 { +func (m *QueryVerifyMembershipRequest) GetBlockDelay() uint64 { if m != nil { return m.BlockDelay } return 0 } -// QueryVerifyMembershipProofResponse is the response type for the Query/VerifyMembershipProof RPC method -type QueryVerifyMembershipProofResponse struct { - // result indicating success or failure of proof verification. - Result bool `protobuf:"varint,1,opt,name=result,proto3" json:"result,omitempty"` +// QueryVerifyMembershipResponse is the response type for the Query/VerifyMembership RPC method +type QueryVerifyMembershipResponse struct { + // boolean indicating success or failure of proof verification. + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` } -func (m *QueryVerifyMembershipProofResponse) Reset() { *m = QueryVerifyMembershipProofResponse{} } -func (m *QueryVerifyMembershipProofResponse) String() string { return proto.CompactTextString(m) } -func (*QueryVerifyMembershipProofResponse) ProtoMessage() {} -func (*QueryVerifyMembershipProofResponse) Descriptor() ([]byte, []int) { +func (m *QueryVerifyMembershipResponse) Reset() { *m = QueryVerifyMembershipResponse{} } +func (m *QueryVerifyMembershipResponse) String() string { return proto.CompactTextString(m) } +func (*QueryVerifyMembershipResponse) ProtoMessage() {} +func (*QueryVerifyMembershipResponse) Descriptor() ([]byte, []int) { return fileDescriptor_dc42cdfd1d52d76e, []int{19} } -func (m *QueryVerifyMembershipProofResponse) XXX_Unmarshal(b []byte) error { +func (m *QueryVerifyMembershipResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *QueryVerifyMembershipProofResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *QueryVerifyMembershipResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_QueryVerifyMembershipProofResponse.Marshal(b, m, deterministic) + return xxx_messageInfo_QueryVerifyMembershipResponse.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1088,21 +1088,21 @@ func (m *QueryVerifyMembershipProofResponse) XXX_Marshal(b []byte, deterministic return b[:n], nil } } -func (m *QueryVerifyMembershipProofResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryVerifyMembershipProofResponse.Merge(m, src) +func (m *QueryVerifyMembershipResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryVerifyMembershipResponse.Merge(m, src) } -func (m *QueryVerifyMembershipProofResponse) XXX_Size() int { +func (m *QueryVerifyMembershipResponse) XXX_Size() int { return m.Size() } -func (m *QueryVerifyMembershipProofResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryVerifyMembershipProofResponse.DiscardUnknown(m) +func (m *QueryVerifyMembershipResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryVerifyMembershipResponse.DiscardUnknown(m) } -var xxx_messageInfo_QueryVerifyMembershipProofResponse proto.InternalMessageInfo +var xxx_messageInfo_QueryVerifyMembershipResponse proto.InternalMessageInfo -func (m *QueryVerifyMembershipProofResponse) GetResult() bool { +func (m *QueryVerifyMembershipResponse) GetSuccess() bool { if m != nil { - return m.Result + return m.Success } return false } @@ -1126,93 +1126,92 @@ func init() { proto.RegisterType((*QueryUpgradedClientStateResponse)(nil), "ibc.core.client.v1.QueryUpgradedClientStateResponse") proto.RegisterType((*QueryUpgradedConsensusStateRequest)(nil), "ibc.core.client.v1.QueryUpgradedConsensusStateRequest") proto.RegisterType((*QueryUpgradedConsensusStateResponse)(nil), "ibc.core.client.v1.QueryUpgradedConsensusStateResponse") - proto.RegisterType((*QueryVerifyMembershipProofRequest)(nil), "ibc.core.client.v1.QueryVerifyMembershipProofRequest") - proto.RegisterType((*QueryVerifyMembershipProofResponse)(nil), "ibc.core.client.v1.QueryVerifyMembershipProofResponse") + proto.RegisterType((*QueryVerifyMembershipRequest)(nil), "ibc.core.client.v1.QueryVerifyMembershipRequest") + proto.RegisterType((*QueryVerifyMembershipResponse)(nil), "ibc.core.client.v1.QueryVerifyMembershipResponse") } func init() { proto.RegisterFile("ibc/core/client/v1/query.proto", fileDescriptor_dc42cdfd1d52d76e) } var fileDescriptor_dc42cdfd1d52d76e = []byte{ - // 1252 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0xcb, 0x6f, 0x1b, 0xc5, - 0x1f, 0xcf, 0xa4, 0x49, 0x7e, 0xc9, 0xd8, 0x4d, 0x7e, 0x9a, 0x26, 0xa9, 0xbb, 0x09, 0x4e, 0xb2, - 0x41, 0x24, 0x4d, 0x93, 0xdd, 0xc4, 0xa1, 0x49, 0x54, 0x40, 0x82, 0x14, 0x95, 0xe6, 0xd0, 0x12, - 0x16, 0xf1, 0x10, 0x12, 0xb2, 0x76, 0xd7, 0x13, 0x7b, 0xd5, 0x7d, 0xb8, 0x3b, 0xbb, 0x96, 0xa2, - 0x2a, 0x97, 0x9e, 0x7a, 0x03, 0x09, 0x09, 0x8e, 0x48, 0x1c, 0x39, 0x54, 0x3d, 0x20, 0x71, 0xe1, - 0x80, 0x84, 0x04, 0x39, 0x56, 0x82, 0x03, 0x27, 0x8a, 0x12, 0x24, 0xfe, 0x0d, 0xb4, 0x33, 0xb3, - 0xf6, 0xae, 0x3d, 0xb6, 0xd7, 0xa8, 0xe5, 0xe6, 0xfd, 0x3e, 0x3f, 0xdf, 0xc7, 0xcc, 0x67, 0x64, - 0x58, 0xb4, 0x0c, 0x53, 0x35, 0x3d, 0x1f, 0xab, 0xa6, 0x6d, 0x61, 0x37, 0x50, 0x1b, 0x5b, 0xea, - 0xfd, 0x10, 0xfb, 0xc7, 0x4a, 0xdd, 0xf7, 0x02, 0x0f, 0x21, 0xcb, 0x30, 0x95, 0x48, 0xaf, 0x30, - 0xbd, 0xd2, 0xd8, 0x92, 0xd6, 0x4c, 0x8f, 0x38, 0x1e, 0x51, 0x0d, 0x9d, 0x60, 0x66, 0xac, 0x36, - 0xb6, 0x0c, 0x1c, 0xe8, 0x5b, 0x6a, 0x5d, 0xaf, 0x5a, 0xae, 0x1e, 0x58, 0x9e, 0xcb, 0xfc, 0xa5, - 0x39, 0x6e, 0x1b, 0x9b, 0x25, 0x83, 0x4b, 0x0b, 0x82, 0xe4, 0x3c, 0x0d, 0x33, 0x58, 0x69, 0x19, - 0x78, 0x8e, 0x63, 0x05, 0x4e, 0x6c, 0xd4, 0xfc, 0xe2, 0x86, 0x57, 0xaa, 0x9e, 0x57, 0xb5, 0xb1, - 0x4a, 0xbf, 0x8c, 0xf0, 0x48, 0xd5, 0xdd, 0x38, 0xc9, 0x3c, 0x57, 0xe9, 0x75, 0x4b, 0xd5, 0x5d, - 0xd7, 0x0b, 0x28, 0x3c, 0xc2, 0xb5, 0xd3, 0x55, 0xaf, 0xea, 0xd1, 0x9f, 0x6a, 0xf4, 0x8b, 0x49, - 0xe5, 0x1d, 0x78, 0xf9, 0xbd, 0x08, 0xe7, 0x4d, 0x0a, 0xe6, 0xfd, 0x40, 0x0f, 0xb0, 0x86, 0xef, - 0x87, 0x98, 0x04, 0x68, 0x0e, 0x4e, 0x30, 0x88, 0x65, 0xab, 0x52, 0x00, 0x8b, 0x60, 0x75, 0x42, - 0x1b, 0x67, 0x82, 0x83, 0x8a, 0xfc, 0x18, 0xc0, 0x42, 0xa7, 0x23, 0xa9, 0x7b, 0x2e, 0xc1, 0x68, - 0x17, 0xe6, 0xb9, 0x27, 0x89, 0xe4, 0xd4, 0x39, 0x57, 0x9a, 0x56, 0x18, 0x3e, 0x25, 0x86, 0xae, - 0xbc, 0xe5, 0x1e, 0x6b, 0x39, 0xb3, 0x15, 0x00, 0x4d, 0xc3, 0xd1, 0xba, 0xef, 0x79, 0x47, 0x85, - 0xe1, 0x45, 0xb0, 0x9a, 0xd7, 0xd8, 0x07, 0xba, 0x09, 0xf3, 0xf4, 0x47, 0xb9, 0x86, 0xad, 0x6a, - 0x2d, 0x28, 0x5c, 0xa0, 0xe1, 0x24, 0xa5, 0x73, 0x60, 0xca, 0x6d, 0x6a, 0xb1, 0x3f, 0x72, 0xfa, - 0xc7, 0xc2, 0x90, 0x96, 0xa3, 0x5e, 0x4c, 0x24, 0x1b, 0x9d, 0x78, 0x49, 0x5c, 0xe9, 0x2d, 0x08, - 0x5b, 0xe3, 0xe4, 0x68, 0x5f, 0x51, 0xd8, 0x3c, 0x95, 0x68, 0xf6, 0x0a, 0x9b, 0x25, 0x9f, 0xbd, - 0x72, 0xa8, 0x57, 0xe3, 0x2e, 0x69, 0x09, 0x4f, 0xf9, 0x37, 0x00, 0xaf, 0x08, 0x92, 0xf0, 0xae, - 0xb8, 0xf0, 0x62, 0xb2, 0x2b, 0xa4, 0x00, 0x16, 0x2f, 0xac, 0xe6, 0x4a, 0x57, 0x45, 0x75, 0x1c, - 0x54, 0xb0, 0x1b, 0x58, 0x47, 0x16, 0xae, 0x24, 0x42, 0xed, 0x17, 0xa3, 0xb2, 0xbe, 0x7d, 0xb6, - 0x30, 0x2b, 0x54, 0x13, 0x2d, 0x9f, 0xe8, 0x25, 0x41, 0xef, 0xa4, 0xaa, 0x1a, 0xa6, 0x55, 0xad, - 0xf4, 0xad, 0x8a, 0x81, 0x4d, 0x95, 0xf5, 0x04, 0x40, 0x89, 0x95, 0x15, 0xa9, 0x5c, 0x12, 0x92, - 0xcc, 0x7b, 0x82, 0x56, 0xe0, 0x94, 0x8f, 0x1b, 0x16, 0xb1, 0x3c, 0xb7, 0xec, 0x86, 0x8e, 0x81, - 0x7d, 0x8a, 0x64, 0x44, 0x9b, 0x8c, 0xc5, 0x77, 0xa9, 0x34, 0x65, 0x98, 0x98, 0x73, 0xc2, 0x90, - 0x0d, 0x12, 0x2d, 0xc3, 0x8b, 0x76, 0x54, 0x5f, 0x10, 0x9b, 0x8d, 0x2c, 0x82, 0xd5, 0x71, 0x2d, - 0xcf, 0x84, 0x7c, 0xda, 0xdf, 0x03, 0x38, 0x27, 0x84, 0xcc, 0x67, 0xf1, 0x06, 0x9c, 0x32, 0x63, - 0x4d, 0x86, 0x25, 0x9d, 0x34, 0x53, 0x61, 0x5e, 0xe4, 0x9e, 0x3e, 0x14, 0x23, 0x27, 0x99, 0xba, - 0x7d, 0x4b, 0x30, 0xf2, 0x7f, 0xb3, 0xc8, 0x3f, 0x03, 0x38, 0x2f, 0x06, 0xc1, 0xfb, 0xf7, 0x29, - 0xfc, 0x7f, 0x5b, 0xff, 0xe2, 0x75, 0x5e, 0x17, 0x95, 0x9b, 0x0e, 0xf3, 0x91, 0x15, 0xd4, 0x52, - 0x0d, 0x98, 0x4a, 0xb7, 0xf7, 0x39, 0xae, 0xee, 0x23, 0x00, 0x97, 0x04, 0x85, 0xb0, 0xec, 0xff, - 0x6d, 0x4f, 0x7f, 0x01, 0x50, 0xee, 0x05, 0x85, 0x77, 0xf6, 0x63, 0x78, 0xb9, 0xad, 0xb3, 0x7c, - 0x9d, 0xe2, 0x06, 0xf7, 0xdf, 0xa7, 0x19, 0x53, 0x94, 0xe1, 0xf9, 0x35, 0x75, 0xb7, 0xe3, 0x2a, - 0x0d, 0x33, 0xb5, 0x52, 0xde, 0xee, 0xb8, 0x1e, 0xc3, 0x56, 0xe1, 0xb3, 0x70, 0x8c, 0x50, 0x09, - 0x77, 0xe3, 0x5f, 0xb2, 0x94, 0xca, 0x76, 0xa8, 0xfb, 0xba, 0x13, 0x67, 0x93, 0xdf, 0x4d, 0x05, - 0x8c, 0x75, 0x3c, 0x60, 0x09, 0x8e, 0xd5, 0xa9, 0x84, 0x1f, 0x6d, 0x61, 0xe3, 0xb8, 0x0f, 0xb7, - 0x94, 0x97, 0xe0, 0x02, 0x0d, 0xf8, 0x41, 0xbd, 0xea, 0xeb, 0x95, 0xd4, 0xf5, 0x1a, 0xe7, 0xb4, - 0xe1, 0x62, 0x77, 0x13, 0x9e, 0xfa, 0x36, 0x9c, 0x09, 0xb9, 0xba, 0x9c, 0x99, 0x09, 0x2f, 0x85, - 0x9d, 0x11, 0xe5, 0x97, 0xf9, 0xd2, 0x34, 0xb3, 0x89, 0xae, 0x60, 0x39, 0x84, 0xcb, 0x3d, 0xad, - 0x38, 0xac, 0xbb, 0xb0, 0xd0, 0x82, 0x35, 0xc0, 0xf5, 0x37, 0x1b, 0x0a, 0xe3, 0xca, 0x3f, 0x0c, - 0xf3, 0xd3, 0xf5, 0x21, 0xf6, 0xad, 0xa3, 0xe3, 0x3b, 0x38, 0xba, 0xc9, 0x49, 0xcd, 0xaa, 0x1f, - 0x46, 0x17, 0x5a, 0xa6, 0xd3, 0xf5, 0xe2, 0x6e, 0x52, 0x74, 0x00, 0x73, 0x0e, 0xf6, 0xef, 0xd9, - 0xb8, 0x5c, 0xd7, 0x83, 0x1a, 0xa5, 0x89, 0x5c, 0x49, 0x4e, 0xc4, 0x68, 0x3d, 0xad, 0x1a, 0x5b, - 0xca, 0x1d, 0x6a, 0x7a, 0xa8, 0x07, 0x35, 0x1e, 0x0b, 0x3a, 0x4d, 0x49, 0x84, 0xb2, 0xa1, 0xdb, - 0x21, 0x2e, 0x8c, 0x32, 0x94, 0xf4, 0x03, 0xbd, 0x04, 0x61, 0x60, 0x39, 0xb8, 0x5c, 0xc1, 0xb6, - 0x7e, 0x5c, 0x18, 0xa3, 0x6c, 0x35, 0x11, 0x49, 0xde, 0x8e, 0x04, 0x68, 0x01, 0xe6, 0x0c, 0xdb, - 0x33, 0xef, 0x71, 0xfd, 0xff, 0xa8, 0x1e, 0x52, 0x11, 0x35, 0x90, 0x5f, 0xe7, 0xb3, 0xed, 0xd2, - 0xbd, 0xd6, 0xb9, 0xf0, 0x31, 0x09, 0xed, 0x80, 0xf6, 0x6e, 0x5c, 0xe3, 0x5f, 0xa5, 0xaf, 0x26, - 0xe1, 0x28, 0x75, 0x47, 0x5f, 0x03, 0x98, 0x4b, 0xec, 0x0c, 0xba, 0x26, 0xea, 0x53, 0x97, 0x57, - 0x9e, 0xb4, 0x9e, 0xcd, 0x98, 0x81, 0x91, 0xaf, 0x3f, 0xfc, 0xf5, 0xaf, 0x2f, 0x86, 0x55, 0xb4, - 0xa1, 0x76, 0x7d, 0xd0, 0x72, 0x3a, 0x50, 0x1f, 0x34, 0x87, 0x7e, 0x82, 0xbe, 0x04, 0x30, 0x9f, - 0x7c, 0xa9, 0xa0, 0x4c, 0x59, 0xe3, 0x63, 0x2e, 0x6d, 0x64, 0xb4, 0xe6, 0x20, 0xaf, 0x52, 0x90, - 0xcb, 0x68, 0xa9, 0x2f, 0x48, 0xf4, 0x0c, 0xc0, 0xc9, 0xf4, 0x52, 0x23, 0xa5, 0x7b, 0x32, 0xd1, - 0xd9, 0x93, 0xd4, 0xcc, 0xf6, 0x1c, 0x9e, 0x4d, 0xe1, 0x1d, 0xa1, 0x8a, 0x10, 0x5e, 0x1b, 0xab, - 0x26, 0xdb, 0xa8, 0xc6, 0x2f, 0x21, 0xf5, 0x41, 0xdb, 0x9b, 0xea, 0x44, 0x65, 0x07, 0x25, 0xa1, - 0x60, 0x82, 0x13, 0xf4, 0x18, 0xc0, 0xa9, 0x36, 0x16, 0x47, 0x59, 0x21, 0x37, 0x07, 0xb0, 0x99, - 0xdd, 0x81, 0x17, 0xb9, 0x47, 0x8b, 0x2c, 0xa1, 0xcd, 0x41, 0x8b, 0x44, 0xa7, 0x00, 0xce, 0x08, - 0x29, 0x12, 0x5d, 0xcf, 0x88, 0x22, 0xcd, 0xee, 0xd2, 0xce, 0xa0, 0x6e, 0xbc, 0x84, 0x37, 0x69, - 0x09, 0x37, 0xd0, 0xde, 0xc0, 0x73, 0xe2, 0x84, 0x8d, 0xbe, 0x49, 0xad, 0x7d, 0x98, 0x6d, 0xed, - 0xc3, 0x81, 0xd6, 0xbe, 0x45, 0xa0, 0x99, 0xcf, 0x66, 0x98, 0xee, 0xf7, 0x67, 0x4d, 0x90, 0x8c, - 0x0b, 0xfb, 0x82, 0x4c, 0x51, 0x70, 0x5f, 0x90, 0x69, 0x52, 0x96, 0x65, 0x0a, 0x72, 0x1e, 0x49, - 0x22, 0x90, 0x8c, 0x84, 0xd1, 0x77, 0x00, 0x5e, 0x12, 0xb0, 0x2b, 0xda, 0xee, 0x9a, 0xaa, 0x3b, - 0x5d, 0x4b, 0xaf, 0x0e, 0xe6, 0xc4, 0x61, 0x96, 0x28, 0xcc, 0x75, 0xb4, 0x26, 0x82, 0x29, 0xa4, - 0x76, 0x82, 0x7e, 0x04, 0x70, 0x56, 0x4c, 0xc0, 0x68, 0xa7, 0x3f, 0x08, 0xe1, 0xdd, 0xb2, 0x3b, - 0xb0, 0x5f, 0x96, 0x5d, 0xe8, 0xf6, 0x06, 0x20, 0xe8, 0x27, 0x00, 0x67, 0x84, 0x6c, 0xd4, 0xe3, - 0xec, 0xf5, 0xe2, 0xfe, 0x1e, 0x67, 0xaf, 0x27, 0xe9, 0xc9, 0xaf, 0x3d, 0xfa, 0xfb, 0xc9, 0x1a, - 0xa0, 0x45, 0x6c, 0xde, 0x00, 0x6b, 0xf2, 0x35, 0x51, 0x1d, 0x0d, 0x1a, 0xa2, 0xec, 0x34, 0x63, - 0x94, 0x29, 0xfd, 0xef, 0x6b, 0xa7, 0x67, 0x45, 0xf0, 0xf4, 0xac, 0x08, 0xfe, 0x3c, 0x2b, 0x82, - 0xcf, 0xcf, 0x8b, 0x43, 0x4f, 0xcf, 0x8b, 0x43, 0xbf, 0x9f, 0x17, 0x87, 0x3e, 0xd9, 0xab, 0x5a, - 0x41, 0x2d, 0x34, 0x22, 0xea, 0x57, 0xf9, 0xdf, 0x35, 0x96, 0x61, 0x6e, 0x54, 0x3d, 0xb5, 0xb1, - 0xa7, 0x3a, 0x5e, 0x25, 0xb4, 0x31, 0x61, 0x59, 0x36, 0x4b, 0x1b, 0x3c, 0x51, 0x70, 0x5c, 0xc7, - 0xc4, 0x18, 0xa3, 0x0f, 0xa2, 0xed, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x81, 0xdf, 0x7c, 0xf4, - 0x46, 0x12, 0x00, 0x00, + // 1244 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0xcb, 0x6f, 0x1b, 0x45, + 0x18, 0xcf, 0xa4, 0x4d, 0x9a, 0x7c, 0x76, 0x93, 0x6a, 0x9a, 0xa4, 0xee, 0x26, 0x75, 0x92, 0x0d, + 0x22, 0x69, 0x9a, 0xec, 0xc6, 0x0e, 0x4d, 0x42, 0x11, 0x12, 0xa4, 0xa8, 0x34, 0x87, 0x96, 0x60, + 0xc4, 0x43, 0x48, 0xc8, 0x5a, 0xaf, 0x27, 0xf6, 0xaa, 0xde, 0x5d, 0xd7, 0xb3, 0x6b, 0x29, 0xaa, + 0x72, 0xe9, 0x29, 0x37, 0x90, 0x90, 0xb8, 0x22, 0x71, 0xe4, 0x50, 0xf5, 0x80, 0xd4, 0x2b, 0x27, + 0xc8, 0xb1, 0x12, 0x1c, 0x38, 0x51, 0x94, 0x20, 0xf1, 0x6f, 0xa0, 0x9d, 0x99, 0xb5, 0x77, 0xed, + 0x71, 0xbd, 0x46, 0x2d, 0x37, 0xef, 0xf7, 0xfc, 0x7d, 0x8f, 0x99, 0xdf, 0xc8, 0x90, 0xb5, 0x4a, + 0xa6, 0x6e, 0xba, 0x0d, 0xa2, 0x9b, 0x35, 0x8b, 0x38, 0x9e, 0xde, 0xcc, 0xe9, 0x0f, 0x7d, 0xd2, + 0x38, 0xd4, 0xea, 0x0d, 0xd7, 0x73, 0x31, 0xb6, 0x4a, 0xa6, 0x16, 0xe8, 0x35, 0xae, 0xd7, 0x9a, + 0x39, 0x65, 0xd5, 0x74, 0xa9, 0xed, 0x52, 0xbd, 0x64, 0x50, 0xc2, 0x8d, 0xf5, 0x66, 0xae, 0x44, + 0x3c, 0x23, 0xa7, 0xd7, 0x8d, 0x8a, 0xe5, 0x18, 0x9e, 0xe5, 0x3a, 0xdc, 0x5f, 0x99, 0x15, 0xb6, + 0xa1, 0x59, 0x34, 0xb8, 0x32, 0x2f, 0x49, 0x2e, 0xd2, 0x70, 0x83, 0xe5, 0xb6, 0x81, 0x6b, 0xdb, + 0x96, 0x67, 0x87, 0x46, 0xad, 0x2f, 0x61, 0x78, 0xb5, 0xe2, 0xba, 0x95, 0x1a, 0xd1, 0xd9, 0x57, + 0xc9, 0x3f, 0xd0, 0x0d, 0x27, 0x4c, 0x32, 0x27, 0x54, 0x46, 0xdd, 0xd2, 0x0d, 0xc7, 0x71, 0x3d, + 0x06, 0x8f, 0x0a, 0xed, 0x54, 0xc5, 0xad, 0xb8, 0xec, 0xa7, 0x1e, 0xfc, 0xe2, 0x52, 0x75, 0x0b, + 0xae, 0x7c, 0x1c, 0xe0, 0xbc, 0xcd, 0xc0, 0x7c, 0xe2, 0x19, 0x1e, 0x29, 0x90, 0x87, 0x3e, 0xa1, + 0x1e, 0x9e, 0x85, 0x71, 0x0e, 0xb1, 0x68, 0x95, 0x33, 0x68, 0x01, 0xad, 0x8c, 0x17, 0xc6, 0xb8, + 0x60, 0xaf, 0xac, 0x3e, 0x41, 0x90, 0xe9, 0x76, 0xa4, 0x75, 0xd7, 0xa1, 0x04, 0x6f, 0x43, 0x5a, + 0x78, 0xd2, 0x40, 0xce, 0x9c, 0x53, 0xf9, 0x29, 0x8d, 0xe3, 0xd3, 0x42, 0xe8, 0xda, 0xfb, 0xce, + 0x61, 0x21, 0x65, 0xb6, 0x03, 0xe0, 0x29, 0x18, 0xa9, 0x37, 0x5c, 0xf7, 0x20, 0x33, 0xbc, 0x80, + 0x56, 0xd2, 0x05, 0xfe, 0x81, 0x6f, 0x43, 0x9a, 0xfd, 0x28, 0x56, 0x89, 0x55, 0xa9, 0x7a, 0x99, + 0x73, 0x2c, 0x9c, 0xa2, 0x75, 0x0f, 0x4c, 0xbb, 0xcb, 0x2c, 0x76, 0xcf, 0x9f, 0xfc, 0x39, 0x3f, + 0x54, 0x48, 0x31, 0x2f, 0x2e, 0x52, 0x4b, 0xdd, 0x78, 0x69, 0x58, 0xe9, 0x1d, 0x80, 0xf6, 0x38, + 0x05, 0xda, 0x37, 0x35, 0x3e, 0x4f, 0x2d, 0x98, 0xbd, 0xc6, 0x67, 0x29, 0x66, 0xaf, 0xed, 0x1b, + 0x95, 0xb0, 0x4b, 0x85, 0x88, 0xa7, 0xfa, 0x3b, 0x82, 0xab, 0x92, 0x24, 0xa2, 0x2b, 0x0e, 0x5c, + 0x8c, 0x76, 0x85, 0x66, 0xd0, 0xc2, 0xb9, 0x95, 0x54, 0xfe, 0xba, 0xac, 0x8e, 0xbd, 0x32, 0x71, + 0x3c, 0xeb, 0xc0, 0x22, 0xe5, 0x48, 0xa8, 0xdd, 0x6c, 0x50, 0xd6, 0x8f, 0x2f, 0xe6, 0x67, 0xa4, + 0x6a, 0x5a, 0x48, 0x47, 0x7a, 0x49, 0xf1, 0x87, 0xb1, 0xaa, 0x86, 0x59, 0x55, 0xcb, 0x7d, 0xab, + 0xe2, 0x60, 0x63, 0x65, 0x3d, 0x45, 0xa0, 0xf0, 0xb2, 0x02, 0x95, 0x43, 0x7d, 0x9a, 0x78, 0x4f, + 0xf0, 0x32, 0x4c, 0x36, 0x48, 0xd3, 0xa2, 0x96, 0xeb, 0x14, 0x1d, 0xdf, 0x2e, 0x91, 0x06, 0x43, + 0x72, 0xbe, 0x30, 0x11, 0x8a, 0xef, 0x33, 0x69, 0xcc, 0x30, 0x32, 0xe7, 0x88, 0x21, 0x1f, 0x24, + 0x5e, 0x82, 0x8b, 0xb5, 0xa0, 0x3e, 0x2f, 0x34, 0x3b, 0xbf, 0x80, 0x56, 0xc6, 0x0a, 0x69, 0x2e, + 0x14, 0xd3, 0x7e, 0x86, 0x60, 0x56, 0x0a, 0x59, 0xcc, 0xe2, 0x5d, 0x98, 0x34, 0x43, 0x4d, 0x82, + 0x25, 0x9d, 0x30, 0x63, 0x61, 0x5e, 0xe7, 0x9e, 0x3e, 0x96, 0x23, 0xa7, 0x89, 0xba, 0x7d, 0x47, + 0x32, 0xf2, 0xff, 0xb2, 0xc8, 0xbf, 0x20, 0x98, 0x93, 0x83, 0x10, 0xfd, 0xfb, 0x0a, 0x2e, 0x75, + 0xf4, 0x2f, 0x5c, 0xe7, 0x35, 0x59, 0xb9, 0xf1, 0x30, 0x9f, 0x5b, 0x5e, 0x35, 0xd6, 0x80, 0xc9, + 0x78, 0x7b, 0x5f, 0xe1, 0xea, 0x1e, 0x23, 0x58, 0x94, 0x14, 0xc2, 0xb3, 0xff, 0xbf, 0x3d, 0xfd, + 0x15, 0x81, 0xfa, 0x32, 0x28, 0xa2, 0xb3, 0x5f, 0xc0, 0x95, 0x8e, 0xce, 0x8a, 0x75, 0x0a, 0x1b, + 0xdc, 0x7f, 0x9f, 0xa6, 0x4d, 0x59, 0x86, 0x57, 0xd7, 0xd4, 0xed, 0xae, 0xab, 0xd4, 0x4f, 0xd4, + 0x4a, 0x75, 0xb3, 0xeb, 0x7a, 0xf4, 0xdb, 0x85, 0xcf, 0xc0, 0x28, 0x65, 0x12, 0xe1, 0x26, 0xbe, + 0x54, 0x25, 0x96, 0x6d, 0xdf, 0x68, 0x18, 0x76, 0x98, 0x4d, 0xfd, 0x28, 0x16, 0x30, 0xd4, 0x89, + 0x80, 0x79, 0x18, 0xad, 0x33, 0x89, 0x38, 0xda, 0xd2, 0xc6, 0x09, 0x1f, 0x61, 0xa9, 0x2e, 0xc2, + 0x3c, 0x0b, 0xf8, 0x69, 0xbd, 0xd2, 0x30, 0xca, 0xb1, 0xeb, 0x35, 0xcc, 0x59, 0x83, 0x85, 0xde, + 0x26, 0x22, 0xf5, 0x5d, 0x98, 0xf6, 0x85, 0xba, 0x98, 0x98, 0x09, 0x2f, 0xfb, 0xdd, 0x11, 0xd5, + 0x37, 0xc4, 0xd2, 0xb4, 0xb2, 0xc9, 0xae, 0x60, 0xd5, 0x87, 0xa5, 0x97, 0x5a, 0x09, 0x58, 0xf7, + 0x21, 0xd3, 0x86, 0x35, 0xc0, 0xf5, 0x37, 0xe3, 0x4b, 0xe3, 0xaa, 0xcf, 0x86, 0xc5, 0x35, 0xf1, + 0x19, 0x69, 0x58, 0x07, 0x87, 0xf7, 0x48, 0x70, 0x93, 0xd3, 0xaa, 0x55, 0x4f, 0x74, 0xb0, 0x5e, + 0xdf, 0x25, 0x8a, 0xf7, 0x20, 0x65, 0x93, 0xc6, 0x83, 0x1a, 0x29, 0xd6, 0x0d, 0xaf, 0xca, 0x18, + 0x22, 0x95, 0x57, 0x23, 0x31, 0xda, 0xaf, 0xaa, 0x66, 0x4e, 0xbb, 0xc7, 0x4c, 0xf7, 0x0d, 0xaf, + 0x2a, 0x62, 0x81, 0xdd, 0x92, 0x04, 0x28, 0x9b, 0x46, 0xcd, 0x27, 0x99, 0x11, 0x8e, 0x92, 0x7d, + 0xe0, 0x6b, 0x00, 0x9e, 0x65, 0x93, 0x62, 0x99, 0xd4, 0x8c, 0xc3, 0xcc, 0x28, 0x23, 0xaa, 0xf1, + 0x40, 0xf2, 0x41, 0x20, 0xc0, 0xf3, 0x90, 0x2a, 0xd5, 0x5c, 0xf3, 0x81, 0xd0, 0x5f, 0x60, 0x7a, + 0x60, 0x22, 0x66, 0xa0, 0xbe, 0x0d, 0xd7, 0x7a, 0x34, 0x4e, 0x8c, 0x2a, 0x03, 0x17, 0xa8, 0x6f, + 0x9a, 0x84, 0xf2, 0xed, 0x1d, 0x2b, 0x84, 0x9f, 0xf9, 0xe3, 0x09, 0x18, 0x61, 0xbe, 0xf8, 0x7b, + 0x04, 0xa9, 0xc8, 0xae, 0xe0, 0x1b, 0xb2, 0x26, 0xf5, 0x78, 0xdd, 0x29, 0x6b, 0xc9, 0x8c, 0x39, + 0x1c, 0xf5, 0xe6, 0xe3, 0xdf, 0xfe, 0xfe, 0x76, 0x58, 0xc7, 0xeb, 0x7a, 0xcf, 0x87, 0xac, 0xa0, + 0x01, 0xfd, 0x51, 0x6b, 0xe2, 0x47, 0xf8, 0x3b, 0x04, 0xe9, 0xe8, 0x0b, 0x05, 0x27, 0xca, 0x1a, + 0x1e, 0x6f, 0x65, 0x3d, 0xa1, 0xb5, 0x00, 0x79, 0x9d, 0x81, 0x5c, 0xc2, 0x8b, 0x7d, 0x41, 0xe2, + 0x17, 0x08, 0x26, 0xe2, 0xcb, 0x8c, 0xb5, 0xde, 0xc9, 0x64, 0x67, 0x4e, 0xd1, 0x13, 0xdb, 0x0b, + 0x78, 0x35, 0x06, 0xef, 0x00, 0x97, 0xa5, 0xf0, 0x3a, 0xd8, 0x34, 0xda, 0x46, 0x3d, 0x7c, 0x01, + 0xe9, 0x8f, 0x3a, 0xde, 0x52, 0x47, 0x3a, 0x3f, 0x25, 0x11, 0x05, 0x17, 0x1c, 0xe1, 0x27, 0x08, + 0x26, 0x3b, 0xd8, 0x1b, 0x27, 0x85, 0xdc, 0x1a, 0xc0, 0x46, 0x72, 0x07, 0x51, 0xe4, 0x0e, 0x2b, + 0x32, 0x8f, 0x37, 0x06, 0x2d, 0x12, 0x9f, 0x20, 0x98, 0x96, 0x52, 0x23, 0xbe, 0x99, 0x10, 0x45, + 0x9c, 0xd5, 0x95, 0xad, 0x41, 0xdd, 0x44, 0x09, 0xef, 0xb1, 0x12, 0x6e, 0xe1, 0x9d, 0x81, 0xe7, + 0x24, 0x88, 0x1a, 0xff, 0x10, 0x5b, 0x7b, 0x3f, 0xd9, 0xda, 0xfb, 0x03, 0xad, 0x7d, 0x9b, 0x38, + 0x13, 0x9f, 0x4d, 0x3f, 0xde, 0xef, 0xaf, 0x5b, 0x20, 0x39, 0x07, 0xf6, 0x05, 0x19, 0xa3, 0xde, + 0xbe, 0x20, 0xe3, 0x64, 0xac, 0xaa, 0x0c, 0xe4, 0x1c, 0x56, 0x64, 0x20, 0x39, 0xf9, 0xe2, 0x9f, + 0x10, 0x5c, 0x96, 0xb0, 0x2a, 0xde, 0xec, 0x99, 0xaa, 0x37, 0x4d, 0x2b, 0x6f, 0x0d, 0xe6, 0x24, + 0x60, 0xe6, 0x19, 0xcc, 0x35, 0xbc, 0x2a, 0x83, 0x29, 0xa5, 0x74, 0x8a, 0x7f, 0x46, 0x30, 0x23, + 0x27, 0x5e, 0xbc, 0xd5, 0x1f, 0x84, 0xf4, 0x6e, 0xd9, 0x1e, 0xd8, 0x2f, 0xc9, 0x2e, 0xf4, 0xe2, + 0x7e, 0xd6, 0xf9, 0x4b, 0x9d, 0x54, 0x84, 0x7b, 0x1f, 0xfe, 0x1e, 0x74, 0xaf, 0xe4, 0x06, 0xf0, + 0x10, 0x80, 0xdf, 0x39, 0xfe, 0xe7, 0xe9, 0x2a, 0x62, 0xa8, 0x37, 0x6e, 0xa1, 0x55, 0xf5, 0x86, + 0x0c, 0x78, 0x93, 0x79, 0x17, 0xed, 0x96, 0x7b, 0x91, 0x91, 0xfd, 0x6e, 0xe1, 0xe4, 0x34, 0x8b, + 0x9e, 0x9f, 0x66, 0xd1, 0x5f, 0xa7, 0x59, 0xf4, 0xcd, 0x59, 0x76, 0xe8, 0xf9, 0x59, 0x76, 0xe8, + 0x8f, 0xb3, 0xec, 0xd0, 0x97, 0x3b, 0x15, 0xcb, 0xab, 0xfa, 0xa5, 0x80, 0xe8, 0x75, 0xf1, 0xbf, + 0x8c, 0x55, 0x32, 0xd7, 0x2b, 0xae, 0xde, 0xdc, 0xd1, 0x6d, 0xb7, 0xec, 0xd7, 0x08, 0xe5, 0x59, + 0x36, 0xf2, 0xeb, 0x22, 0x91, 0x77, 0x58, 0x27, 0xb4, 0x34, 0xca, 0x5e, 0x3e, 0x9b, 0xff, 0x06, + 0x00, 0x00, 0xff, 0xff, 0x30, 0xd4, 0xeb, 0x40, 0x2f, 0x12, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1247,8 +1246,8 @@ type QueryClient interface { UpgradedClientState(ctx context.Context, in *QueryUpgradedClientStateRequest, opts ...grpc.CallOption) (*QueryUpgradedClientStateResponse, error) // UpgradedConsensusState queries an Upgraded IBC consensus state. UpgradedConsensusState(ctx context.Context, in *QueryUpgradedConsensusStateRequest, opts ...grpc.CallOption) (*QueryUpgradedConsensusStateResponse, error) - // VerifyMembershipProof queries an IBC light client for proof verification of a value at a given key path. - VerifyMembershipProof(ctx context.Context, in *QueryVerifyMembershipProofRequest, opts ...grpc.CallOption) (*QueryVerifyMembershipProofResponse, error) + // VerifyMembership queries an IBC light client for proof verification of a value at a given key path. + VerifyMembership(ctx context.Context, in *QueryVerifyMembershipRequest, opts ...grpc.CallOption) (*QueryVerifyMembershipResponse, error) } type queryClient struct { @@ -1340,9 +1339,9 @@ func (c *queryClient) UpgradedConsensusState(ctx context.Context, in *QueryUpgra return out, nil } -func (c *queryClient) VerifyMembershipProof(ctx context.Context, in *QueryVerifyMembershipProofRequest, opts ...grpc.CallOption) (*QueryVerifyMembershipProofResponse, error) { - out := new(QueryVerifyMembershipProofResponse) - err := c.cc.Invoke(ctx, "/ibc.core.client.v1.Query/VerifyMembershipProof", in, out, opts...) +func (c *queryClient) VerifyMembership(ctx context.Context, in *QueryVerifyMembershipRequest, opts ...grpc.CallOption) (*QueryVerifyMembershipResponse, error) { + out := new(QueryVerifyMembershipResponse) + err := c.cc.Invoke(ctx, "/ibc.core.client.v1.Query/VerifyMembership", in, out, opts...) if err != nil { return nil, err } @@ -1371,8 +1370,8 @@ type QueryServer interface { UpgradedClientState(context.Context, *QueryUpgradedClientStateRequest) (*QueryUpgradedClientStateResponse, error) // UpgradedConsensusState queries an Upgraded IBC consensus state. UpgradedConsensusState(context.Context, *QueryUpgradedConsensusStateRequest) (*QueryUpgradedConsensusStateResponse, error) - // VerifyMembershipProof queries an IBC light client for proof verification of a value at a given key path. - VerifyMembershipProof(context.Context, *QueryVerifyMembershipProofRequest) (*QueryVerifyMembershipProofResponse, error) + // VerifyMembership queries an IBC light client for proof verification of a value at a given key path. + VerifyMembership(context.Context, *QueryVerifyMembershipRequest) (*QueryVerifyMembershipResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -1406,8 +1405,8 @@ func (*UnimplementedQueryServer) UpgradedClientState(ctx context.Context, req *Q func (*UnimplementedQueryServer) UpgradedConsensusState(ctx context.Context, req *QueryUpgradedConsensusStateRequest) (*QueryUpgradedConsensusStateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpgradedConsensusState not implemented") } -func (*UnimplementedQueryServer) VerifyMembershipProof(ctx context.Context, req *QueryVerifyMembershipProofRequest) (*QueryVerifyMembershipProofResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method VerifyMembershipProof not implemented") +func (*UnimplementedQueryServer) VerifyMembership(ctx context.Context, req *QueryVerifyMembershipRequest) (*QueryVerifyMembershipResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method VerifyMembership not implemented") } func RegisterQueryServer(s grpc1.Server, srv QueryServer) { @@ -1576,20 +1575,20 @@ func _Query_UpgradedConsensusState_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } -func _Query_VerifyMembershipProof_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryVerifyMembershipProofRequest) +func _Query_VerifyMembership_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryVerifyMembershipRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(QueryServer).VerifyMembershipProof(ctx, in) + return srv.(QueryServer).VerifyMembership(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ibc.core.client.v1.Query/VerifyMembershipProof", + FullMethod: "/ibc.core.client.v1.Query/VerifyMembership", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).VerifyMembershipProof(ctx, req.(*QueryVerifyMembershipProofRequest)) + return srv.(QueryServer).VerifyMembership(ctx, req.(*QueryVerifyMembershipRequest)) } return interceptor(ctx, in, info, handler) } @@ -1635,8 +1634,8 @@ var _Query_serviceDesc = grpc.ServiceDesc{ Handler: _Query_UpgradedConsensusState_Handler, }, { - MethodName: "VerifyMembershipProof", - Handler: _Query_VerifyMembershipProof_Handler, + MethodName: "VerifyMembership", + Handler: _Query_VerifyMembership_Handler, }, }, Streams: []grpc.StreamDesc{}, @@ -2327,7 +2326,7 @@ func (m *QueryUpgradedConsensusStateResponse) MarshalToSizedBuffer(dAtA []byte) return len(dAtA) - i, nil } -func (m *QueryVerifyMembershipProofRequest) Marshal() (dAtA []byte, err error) { +func (m *QueryVerifyMembershipRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2337,12 +2336,12 @@ func (m *QueryVerifyMembershipProofRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryVerifyMembershipProofRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryVerifyMembershipRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryVerifyMembershipProofRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryVerifyMembershipRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -2401,7 +2400,7 @@ func (m *QueryVerifyMembershipProofRequest) MarshalToSizedBuffer(dAtA []byte) (i return len(dAtA) - i, nil } -func (m *QueryVerifyMembershipProofResponse) Marshal() (dAtA []byte, err error) { +func (m *QueryVerifyMembershipResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2411,19 +2410,19 @@ func (m *QueryVerifyMembershipProofResponse) Marshal() (dAtA []byte, err error) return dAtA[:n], nil } -func (m *QueryVerifyMembershipProofResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryVerifyMembershipResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryVerifyMembershipProofResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryVerifyMembershipResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.Result { + if m.Success { i-- - if m.Result { + if m.Success { dAtA[i] = 1 } else { dAtA[i] = 0 @@ -2714,7 +2713,7 @@ func (m *QueryUpgradedConsensusStateResponse) Size() (n int) { return n } -func (m *QueryVerifyMembershipProofRequest) Size() (n int) { +func (m *QueryVerifyMembershipRequest) Size() (n int) { if m == nil { return 0 } @@ -2745,13 +2744,13 @@ func (m *QueryVerifyMembershipProofRequest) Size() (n int) { return n } -func (m *QueryVerifyMembershipProofResponse) Size() (n int) { +func (m *QueryVerifyMembershipResponse) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Result { + if m.Success { n += 2 } return n @@ -4545,7 +4544,7 @@ func (m *QueryUpgradedConsensusStateResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *QueryVerifyMembershipProofRequest) Unmarshal(dAtA []byte) error { +func (m *QueryVerifyMembershipRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4568,10 +4567,10 @@ func (m *QueryVerifyMembershipProofRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryVerifyMembershipProofRequest: wiretype end group for non-group") + return fmt.Errorf("proto: QueryVerifyMembershipRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryVerifyMembershipProofRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryVerifyMembershipRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -4799,7 +4798,7 @@ func (m *QueryVerifyMembershipProofRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *QueryVerifyMembershipProofResponse) Unmarshal(dAtA []byte) error { +func (m *QueryVerifyMembershipResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4822,15 +4821,15 @@ func (m *QueryVerifyMembershipProofResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryVerifyMembershipProofResponse: wiretype end group for non-group") + return fmt.Errorf("proto: QueryVerifyMembershipResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryVerifyMembershipProofResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryVerifyMembershipResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Success", wireType) } var v int for shift := uint(0); ; shift += 7 { @@ -4847,7 +4846,7 @@ func (m *QueryVerifyMembershipProofResponse) Unmarshal(dAtA []byte) error { break } } - m.Result = bool(v != 0) + m.Success = bool(v != 0) default: iNdEx = preIndex skippy, err := skipQuery(dAtA[iNdEx:]) diff --git a/modules/core/02-client/types/query.pb.gw.go b/modules/core/02-client/types/query.pb.gw.go index 261f119c606..9e26095e8a0 100644 --- a/modules/core/02-client/types/query.pb.gw.go +++ b/modules/core/02-client/types/query.pb.gw.go @@ -491,8 +491,8 @@ func local_request_Query_UpgradedConsensusState_0(ctx context.Context, marshaler } -func request_Query_VerifyMembershipProof_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryVerifyMembershipProofRequest +func request_Query_VerifyMembership_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryVerifyMembershipRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -503,13 +503,13 @@ func request_Query_VerifyMembershipProof_0(ctx context.Context, marshaler runtim return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.VerifyMembershipProof(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.VerifyMembership(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_Query_VerifyMembershipProof_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryVerifyMembershipProofRequest +func local_request_Query_VerifyMembership_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryVerifyMembershipRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -520,7 +520,7 @@ func local_request_Query_VerifyMembershipProof_0(ctx context.Context, marshaler return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.VerifyMembershipProof(ctx, &protoReq) + msg, err := server.VerifyMembership(ctx, &protoReq) return msg, metadata, err } @@ -738,7 +738,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) - mux.Handle("POST", pattern_Query_VerifyMembershipProof_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_Query_VerifyMembership_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -749,7 +749,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_Query_VerifyMembershipProof_0(rctx, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_Query_VerifyMembership_0(rctx, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { @@ -757,7 +757,7 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv return } - forward_Query_VerifyMembershipProof_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Query_VerifyMembership_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -982,7 +982,7 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) - mux.Handle("POST", pattern_Query_VerifyMembershipProof_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_Query_VerifyMembership_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -991,14 +991,14 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_Query_VerifyMembershipProof_0(rctx, inboundMarshaler, client, req, pathParams) + resp, md, err := request_Query_VerifyMembership_0(rctx, inboundMarshaler, client, req, pathParams) ctx = runtime.NewServerMetadataContext(ctx, md) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - forward_Query_VerifyMembershipProof_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Query_VerifyMembership_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -1024,7 +1024,7 @@ var ( pattern_Query_UpgradedConsensusState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"ibc", "core", "client", "v1", "upgraded_consensus_states"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_VerifyMembershipProof_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"ibc", "core", "client", "v1", "verify_membership_proof"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_VerifyMembership_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"ibc", "core", "client", "v1", "verify_membership_proof"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( @@ -1046,5 +1046,5 @@ var ( forward_Query_UpgradedConsensusState_0 = runtime.ForwardResponseMessage - forward_Query_VerifyMembershipProof_0 = runtime.ForwardResponseMessage + forward_Query_VerifyMembership_0 = runtime.ForwardResponseMessage ) diff --git a/modules/core/keeper/grpc_query.go b/modules/core/keeper/grpc_query.go index e18efc3d2ea..259fb55e7d2 100644 --- a/modules/core/keeper/grpc_query.go +++ b/modules/core/keeper/grpc_query.go @@ -53,9 +53,9 @@ func (k Keeper) UpgradedConsensusState(c context.Context, req *clienttypes.Query return k.ClientKeeper.UpgradedConsensusState(c, req) } -// VerifyMembershipProof implements the IBC QueryServer interface. -func (k Keeper) VerifyMembershipProof(c context.Context, req *clienttypes.QueryVerifyMembershipProofRequest) (*clienttypes.QueryVerifyMembershipProofResponse, error) { - return k.ClientKeeper.VerifyMembershipProof(c, req) +// VerifyMembership implements the IBC QueryServer interface. +func (k Keeper) VerifyMembership(c context.Context, req *clienttypes.QueryVerifyMembershipRequest) (*clienttypes.QueryVerifyMembershipResponse, error) { + return k.ClientKeeper.VerifyMembership(c, req) } // Connection implements the IBC QueryServer interface diff --git a/proto/ibc/core/client/v1/query.proto b/proto/ibc/core/client/v1/query.proto index ca9413b50ba..74deb3981d3 100644 --- a/proto/ibc/core/client/v1/query.proto +++ b/proto/ibc/core/client/v1/query.proto @@ -63,8 +63,8 @@ service Query { option (google.api.http).get = "/ibc/core/client/v1/upgraded_consensus_states"; } - // VerifyMembershipProof queries an IBC light client for proof verification of a value at a given key path. - rpc VerifyMembershipProof(QueryVerifyMembershipProofRequest) returns (QueryVerifyMembershipProofResponse) { + // VerifyMembership queries an IBC light client for proof verification of a value at a given key path. + rpc VerifyMembership(QueryVerifyMembershipRequest) returns (QueryVerifyMembershipResponse) { option (cosmos.query.v1.module_query_safe) = true; option (google.api.http) = { post: "/ibc/core/client/v1/verify_membership_proof" @@ -217,8 +217,8 @@ message QueryUpgradedConsensusStateResponse { google.protobuf.Any upgraded_consensus_state = 1; } -// QueryVerifyMembershipProofRequest is the request type for the Query/VerifyMembershipProof RPC method -message QueryVerifyMembershipProofRequest { +// QueryVerifyMembershipRequest is the request type for the Query/VerifyMembership RPC method +message QueryVerifyMembershipRequest { // client unique identifier. string client_id = 1; // the proof to be verified by the client. @@ -235,8 +235,8 @@ message QueryVerifyMembershipProofRequest { uint64 block_delay = 7; } -// QueryVerifyMembershipProofResponse is the response type for the Query/VerifyMembershipProof RPC method -message QueryVerifyMembershipProofResponse { - // result indicating success or failure of proof verification. - bool result = 1; +// QueryVerifyMembershipResponse is the response type for the Query/VerifyMembership RPC method +message QueryVerifyMembershipResponse { + // boolean indicating success or failure of proof verification. + bool success = 1; } \ No newline at end of file From 889be6ead6bf388015780d12bc04afcce6a29662 Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Thu, 8 Feb 2024 19:33:50 +0100 Subject: [PATCH 11/18] chore: update service definition URL in 08-wasm stargate accepted queries --- modules/light-clients/08-wasm/types/querier.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/light-clients/08-wasm/types/querier.go b/modules/light-clients/08-wasm/types/querier.go index 58d9e075fa5..27818ee75c8 100644 --- a/modules/light-clients/08-wasm/types/querier.go +++ b/modules/light-clients/08-wasm/types/querier.go @@ -129,7 +129,7 @@ func NewDefaultQueryPlugins() *QueryPlugins { // This function returns protobuf encoded responses in bytes. func AcceptListStargateQuerier(acceptedQueries []string) func(sdk.Context, *wasmvmtypes.StargateQuery) ([]byte, error) { defaultAcceptList := []string{ - "/ibc.core.client.v1.Query/VerifyMembershipProof", + "/ibc.core.client.v1.Query/VerifyMembership", } return func(ctx sdk.Context, request *wasmvmtypes.StargateQuery) ([]byte, error) { From 7ef470edd77f2e536e1e547ec3e8741fb4c6b5df Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Thu, 8 Feb 2024 19:34:36 +0100 Subject: [PATCH 12/18] test: adding verify membership test to 08-wasm querier --- .../08-wasm/types/querier_test.go | 81 ++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/modules/light-clients/08-wasm/types/querier_test.go b/modules/light-clients/08-wasm/types/querier_test.go index 89a9cf911f6..19fc4ab46bc 100644 --- a/modules/light-clients/08-wasm/types/querier_test.go +++ b/modules/light-clients/08-wasm/types/querier_test.go @@ -14,6 +14,8 @@ import ( "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/internal/ibcwasm" wasmtesting "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/testing" "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/types" + clienttypes "github.com/cosmos/ibc-go/v8/modules/core/02-client/types" + commitmenttypes "github.com/cosmos/ibc-go/v8/modules/core/23-commitment/types" "github.com/cosmos/ibc-go/v8/modules/core/exported" ) @@ -118,6 +120,8 @@ func (suite *TypesTestSuite) TestCustomQuery() { func (suite *TypesTestSuite) TestStargateQuery() { typeURL := "/ibc.lightclients.wasm.v1.Query/Checksums" + var endpoint *wasmtesting.WasmEndpoint + testCases := []struct { name string malleate func() @@ -157,6 +161,81 @@ func (suite *TypesTestSuite) TestStargateQuery() { }) }, }, + { + "success: verify membership query", + func() { + querierPlugin := types.QueryPlugins{ + Stargate: types.AcceptListStargateQuerier([]string{""}), + } + + ibcwasm.SetQueryPlugins(&querierPlugin) + + var ( + key = []byte("mock-key") + value = []byte("mock-value") + ) + + store := suite.chainA.GetContext().KVStore(GetSimApp(suite.chainA).GetKey(exported.StoreKey)) + store.Set(key, value) + + suite.coordinator.CommitBlock(suite.chainA) + proof, proofHeight := endpoint.QueryProofAtHeight(key, uint64(suite.chainA.GetContext().BlockHeight())) + + merklePath := commitmenttypes.NewMerklePath(string(key)) + merklePath, err := commitmenttypes.ApplyPrefix(suite.chainA.GetPrefix(), merklePath) + suite.Require().NoError(err) + + suite.mockVM.RegisterQueryCallback(types.StatusMsg{}, func(_ wasmvm.Checksum, _ wasmvmtypes.Env, _ []byte, _ wasmvm.KVStore, _ wasmvm.GoAPI, querier wasmvm.Querier, _ wasmvm.GasMeter, _ uint64, _ wasmvmtypes.UFraction) ([]byte, uint64, error) { + queryRequest := clienttypes.QueryVerifyMembershipRequest{ + ClientId: endpoint.ClientID, + Proof: proof, + ProofHeight: proofHeight, + MerklePath: merklePath, + Value: value, + } + + bz, err := queryRequest.Marshal() + suite.Require().NoError(err) + + resp, err := querier.Query(wasmvmtypes.QueryRequest{ + Stargate: &wasmvmtypes.StargateQuery{ + Path: "/ibc.core.client.v1.Query/VerifyMembership", + Data: bz, + }, + }, math.MaxUint64) + suite.Require().NoError(err) + + var respData clienttypes.QueryVerifyMembershipResponse + err = respData.Unmarshal(resp) + suite.Require().NoError(err) + + suite.Require().True(respData.Success) + + return resp, wasmtesting.DefaultGasUsed, nil + }) + + suite.mockVM.RegisterSudoCallback(types.VerifyMembershipMsg{}, func(_ wasmvm.Checksum, _ wasmvmtypes.Env, sudoMsg []byte, _ wasmvm.KVStore, + _ wasmvm.GoAPI, _ wasmvm.Querier, _ wasmvm.GasMeter, _ uint64, _ wasmvmtypes.UFraction, + ) (*wasmvmtypes.Response, uint64, error) { + var payload types.SudoMsg + err := json.Unmarshal(sudoMsg, &payload) + suite.Require().NoError(err) + + var merkleProof commitmenttypes.MerkleProof + err = suite.chainA.Codec.Unmarshal(payload.VerifyMembership.Proof, &merkleProof) + suite.Require().NoError(err) + + root := commitmenttypes.NewMerkleRoot(suite.chainA.App.LastCommitID().Hash) + err = merkleProof.VerifyMembership(commitmenttypes.GetSDKSpecs(), root, merklePath, payload.VerifyMembership.Value) + suite.Require().NoError(err) + + bz, err := json.Marshal(types.EmptyResult{}) + suite.Require().NoError(err) + + return &wasmvmtypes.Response{Data: bz}, wasmtesting.DefaultGasUsed, nil + }) + }, + }, { "failure: default querier", func() { @@ -184,7 +263,7 @@ func (suite *TypesTestSuite) TestStargateQuery() { suite.Run(tc.name, func() { suite.SetupWasmWithMockVM() - endpoint := wasmtesting.NewWasmEndpoint(suite.chainA) + endpoint = wasmtesting.NewWasmEndpoint(suite.chainA) err := endpoint.CreateClient() suite.Require().NoError(err) From e64af3a66c2f82420fe49f4171a73c85093a0335 Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Mon, 12 Feb 2024 15:13:04 +0100 Subject: [PATCH 13/18] Update proto/ibc/core/client/v1/query.proto Co-authored-by: Carlos Rodriguez --- proto/ibc/core/client/v1/query.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proto/ibc/core/client/v1/query.proto b/proto/ibc/core/client/v1/query.proto index 74deb3981d3..905a9188b16 100644 --- a/proto/ibc/core/client/v1/query.proto +++ b/proto/ibc/core/client/v1/query.proto @@ -67,7 +67,7 @@ service Query { rpc VerifyMembership(QueryVerifyMembershipRequest) returns (QueryVerifyMembershipResponse) { option (cosmos.query.v1.module_query_safe) = true; option (google.api.http) = { - post: "/ibc/core/client/v1/verify_membership_proof" + post: "/ibc/core/client/v1/verify_membership" body: "*" }; } From da3b02e8a551704dfd77fd516fe314a4efc615f4 Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Tue, 13 Feb 2024 11:49:43 +0100 Subject: [PATCH 14/18] chore: review items - log error at debug, pass cachedCtx and adjust tests for discarded state checks --- modules/core/02-client/keeper/grpc_query.go | 3 +- .../08-wasm/types/querier_test.go | 39 +++++++++++++------ 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/modules/core/02-client/keeper/grpc_query.go b/modules/core/02-client/keeper/grpc_query.go index 1a90976334f..108888ecc54 100644 --- a/modules/core/02-client/keeper/grpc_query.go +++ b/modules/core/02-client/keeper/grpc_query.go @@ -369,7 +369,8 @@ func (k Keeper) VerifyMembership(c context.Context, req *types.QueryVerifyMember return nil, status.Error(codes.NotFound, errorsmod.Wrap(types.ErrClientNotFound, req.ClientId).Error()) } - if err := clientState.VerifyMembership(ctx, k.ClientStore(cachedCtx, req.ClientId), k.cdc, req.ProofHeight, req.TimeDelay, req.BlockDelay, req.Proof, req.MerklePath, req.Value); err != nil { + if err := clientState.VerifyMembership(cachedCtx, k.ClientStore(cachedCtx, req.ClientId), k.cdc, req.ProofHeight, req.TimeDelay, req.BlockDelay, req.Proof, req.MerklePath, req.Value); err != nil { + k.Logger(ctx).Debug("proof verification failed", "key", req.MerklePath, "error", err) return &types.QueryVerifyMembershipResponse{ Success: false, }, nil diff --git a/modules/light-clients/08-wasm/types/querier_test.go b/modules/light-clients/08-wasm/types/querier_test.go index 19fc4ab46bc..fe3011732ea 100644 --- a/modules/light-clients/08-wasm/types/querier_test.go +++ b/modules/light-clients/08-wasm/types/querier_test.go @@ -120,7 +120,13 @@ func (suite *TypesTestSuite) TestCustomQuery() { func (suite *TypesTestSuite) TestStargateQuery() { typeURL := "/ibc.lightclients.wasm.v1.Query/Checksums" - var endpoint *wasmtesting.WasmEndpoint + var ( + endpoint *wasmtesting.WasmEndpoint + expDiscardState = false + proofKey = []byte("mock-key") + testKey = []byte("test-key") + value = []byte("mock-value") + ) testCases := []struct { name string @@ -135,7 +141,7 @@ func (suite *TypesTestSuite) TestStargateQuery() { ibcwasm.SetQueryPlugins(&querierPlugin) - suite.mockVM.RegisterQueryCallback(types.StatusMsg{}, func(_ wasmvm.Checksum, _ wasmvmtypes.Env, _ []byte, _ wasmvm.KVStore, _ wasmvm.GoAPI, querier wasmvm.Querier, _ wasmvm.GasMeter, _ uint64, _ wasmvmtypes.UFraction) ([]byte, uint64, error) { + suite.mockVM.RegisterQueryCallback(types.StatusMsg{}, func(_ wasmvm.Checksum, _ wasmvmtypes.Env, _ []byte, store wasmvm.KVStore, _ wasmvm.GoAPI, querier wasmvm.Querier, _ wasmvm.GasMeter, _ uint64, _ wasmvmtypes.UFraction) ([]byte, uint64, error) { queryRequest := types.QueryChecksumsRequest{} bz, err := queryRequest.Marshal() suite.Require().NoError(err) @@ -157,6 +163,8 @@ func (suite *TypesTestSuite) TestStargateQuery() { suite.Require().Len(respData.Checksums, 1) suite.Require().Equal(expChecksum, respData.Checksums[0]) + store.Set(testKey, value) + return resp, wasmtesting.DefaultGasUsed, nil }) }, @@ -170,18 +178,13 @@ func (suite *TypesTestSuite) TestStargateQuery() { ibcwasm.SetQueryPlugins(&querierPlugin) - var ( - key = []byte("mock-key") - value = []byte("mock-value") - ) - store := suite.chainA.GetContext().KVStore(GetSimApp(suite.chainA).GetKey(exported.StoreKey)) - store.Set(key, value) + store.Set(proofKey, value) suite.coordinator.CommitBlock(suite.chainA) - proof, proofHeight := endpoint.QueryProofAtHeight(key, uint64(suite.chainA.GetContext().BlockHeight())) + proof, proofHeight := endpoint.QueryProofAtHeight(proofKey, uint64(suite.chainA.GetContext().BlockHeight())) - merklePath := commitmenttypes.NewMerklePath(string(key)) + merklePath := commitmenttypes.NewMerklePath(string(proofKey)) merklePath, err := commitmenttypes.ApplyPrefix(suite.chainA.GetPrefix(), merklePath) suite.Require().NoError(err) @@ -214,7 +217,7 @@ func (suite *TypesTestSuite) TestStargateQuery() { return resp, wasmtesting.DefaultGasUsed, nil }) - suite.mockVM.RegisterSudoCallback(types.VerifyMembershipMsg{}, func(_ wasmvm.Checksum, _ wasmvmtypes.Env, sudoMsg []byte, _ wasmvm.KVStore, + suite.mockVM.RegisterSudoCallback(types.VerifyMembershipMsg{}, func(_ wasmvm.Checksum, _ wasmvmtypes.Env, sudoMsg []byte, store wasmvm.KVStore, _ wasmvm.GoAPI, _ wasmvm.Querier, _ wasmvm.GasMeter, _ uint64, _ wasmvmtypes.UFraction, ) (*wasmvmtypes.Response, uint64, error) { var payload types.SudoMsg @@ -232,6 +235,9 @@ func (suite *TypesTestSuite) TestStargateQuery() { bz, err := json.Marshal(types.EmptyResult{}) suite.Require().NoError(err) + expDiscardState = true + store.Set(testKey, value) + return &wasmvmtypes.Response{Data: bz}, wasmtesting.DefaultGasUsed, nil }) }, @@ -239,7 +245,7 @@ func (suite *TypesTestSuite) TestStargateQuery() { { "failure: default querier", func() { - suite.mockVM.RegisterQueryCallback(types.StatusMsg{}, func(_ wasmvm.Checksum, _ wasmvmtypes.Env, _ []byte, _ wasmvm.KVStore, _ wasmvm.GoAPI, querier wasmvm.Querier, _ wasmvm.GasMeter, _ uint64, _ wasmvmtypes.UFraction) ([]byte, uint64, error) { + suite.mockVM.RegisterQueryCallback(types.StatusMsg{}, func(_ wasmvm.Checksum, _ wasmvmtypes.Env, _ []byte, store wasmvm.KVStore, _ wasmvm.GoAPI, querier wasmvm.Querier, _ wasmvm.GasMeter, _ uint64, _ wasmvmtypes.UFraction) ([]byte, uint64, error) { queryRequest := types.QueryChecksumsRequest{} bz, err := queryRequest.Marshal() suite.Require().NoError(err) @@ -253,6 +259,8 @@ func (suite *TypesTestSuite) TestStargateQuery() { suite.Require().ErrorIs(err, wasmvmtypes.UnsupportedRequest{Kind: fmt.Sprintf("'%s' path is not allowed from the contract", typeURL)}) suite.Require().Nil(resp) + store.Set(testKey, value) + return nil, wasmtesting.DefaultGasUsed, err }) }, @@ -261,6 +269,7 @@ func (suite *TypesTestSuite) TestStargateQuery() { for _, tc := range testCases { suite.Run(tc.name, func() { + expDiscardState = false suite.SetupWasmWithMockVM() endpoint = wasmtesting.NewWasmEndpoint(suite.chainA) @@ -273,6 +282,12 @@ func (suite *TypesTestSuite) TestStargateQuery() { clientState := endpoint.GetClientState() clientState.Status(suite.chainA.GetContext(), clientStore, suite.chainA.App.AppCodec()) + if expDiscardState { + suite.Require().False(clientStore.Has(testKey)) + } else { + suite.Require().True(clientStore.Has(testKey)) + } + // reset query plugins after each test ibcwasm.SetQueryPlugins(types.NewDefaultQueryPlugins()) }) From 143d7c99e781fa1c80f61434a0a06eacf1544bc1 Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Tue, 13 Feb 2024 11:58:54 +0100 Subject: [PATCH 15/18] chore: add doc comment to querier test, address nit to move defaultAcceptList --- .../light-clients/08-wasm/types/querier.go | 9 ++++---- .../08-wasm/types/querier_test.go | 22 ++++++++++++------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/modules/light-clients/08-wasm/types/querier.go b/modules/light-clients/08-wasm/types/querier.go index 27818ee75c8..f83057234b1 100644 --- a/modules/light-clients/08-wasm/types/querier.go +++ b/modules/light-clients/08-wasm/types/querier.go @@ -34,6 +34,11 @@ var ( _ ibcwasm.QueryPluginsI = (*QueryPlugins)(nil) ) +// defaultAcceptList defines a set of default allowed queries made available to the Querier. +var defaultAcceptList = []string{ + "/ibc.core.client.v1.Query/VerifyMembership", +} + // queryHandler is a wrapper around the sdk.Context and the CallerID that calls // into the query plugins. type queryHandler struct { @@ -128,10 +133,6 @@ func NewDefaultQueryPlugins() *QueryPlugins { // AcceptListStargateQuerier allows all queries that are in the provided accept list. // This function returns protobuf encoded responses in bytes. func AcceptListStargateQuerier(acceptedQueries []string) func(sdk.Context, *wasmvmtypes.StargateQuery) ([]byte, error) { - defaultAcceptList := []string{ - "/ibc.core.client.v1.Query/VerifyMembership", - } - return func(ctx sdk.Context, request *wasmvmtypes.StargateQuery) ([]byte, error) { // A default list of accepted queries can be added here. acceptedQueries = append(defaultAcceptList, acceptedQueries...) diff --git a/modules/light-clients/08-wasm/types/querier_test.go b/modules/light-clients/08-wasm/types/querier_test.go index fe3011732ea..51d66afbc17 100644 --- a/modules/light-clients/08-wasm/types/querier_test.go +++ b/modules/light-clients/08-wasm/types/querier_test.go @@ -121,11 +121,11 @@ func (suite *TypesTestSuite) TestStargateQuery() { typeURL := "/ibc.lightclients.wasm.v1.Query/Checksums" var ( - endpoint *wasmtesting.WasmEndpoint - expDiscardState = false - proofKey = []byte("mock-key") - testKey = []byte("test-key") - value = []byte("mock-value") + endpoint *wasmtesting.WasmEndpoint + expDiscardedState = false + proofKey = []byte("mock-key") + testKey = []byte("test-key") + value = []byte("mock-value") ) testCases := []struct { @@ -170,6 +170,12 @@ func (suite *TypesTestSuite) TestStargateQuery() { }, }, { + // The following test sets a mock proof key and value in the ibc store and registers a query callback on the Status msg. + // The Status handler will then perform the QueryVerifyMembershipRequest using the wasmvm.Querier. + // As the VerifyMembership query rpc will call directly back into the same client, we also register a callback for VerifyMembership. + // Here we decode the proof and verify the mock proof key and value are set in the ibc store. + // This exercises the full flow through the grpc handler and into the light client for verification, handling encoding and routing. + // Furthermore we write a test key and assert that the state changes made by this handler were discarded by the cachedCtx at the grpc handler. "success: verify membership query", func() { querierPlugin := types.QueryPlugins{ @@ -235,7 +241,7 @@ func (suite *TypesTestSuite) TestStargateQuery() { bz, err := json.Marshal(types.EmptyResult{}) suite.Require().NoError(err) - expDiscardState = true + expDiscardedState = true store.Set(testKey, value) return &wasmvmtypes.Response{Data: bz}, wasmtesting.DefaultGasUsed, nil @@ -269,7 +275,7 @@ func (suite *TypesTestSuite) TestStargateQuery() { for _, tc := range testCases { suite.Run(tc.name, func() { - expDiscardState = false + expDiscardedState = false suite.SetupWasmWithMockVM() endpoint = wasmtesting.NewWasmEndpoint(suite.chainA) @@ -282,7 +288,7 @@ func (suite *TypesTestSuite) TestStargateQuery() { clientState := endpoint.GetClientState() clientState.Status(suite.chainA.GetContext(), clientStore, suite.chainA.App.AppCodec()) - if expDiscardState { + if expDiscardedState { suite.Require().False(clientStore.Has(testKey)) } else { suite.Require().True(clientStore.Has(testKey)) From 1ecb660d777687d7196256557d341236c77eeadd Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Tue, 13 Feb 2024 13:32:46 +0100 Subject: [PATCH 16/18] chore: regen protos and swagger doc --- docs/client/swagger-ui/swagger.yaml | 2 +- modules/core/02-client/types/query.pb.go | 158 ++++++++++---------- modules/core/02-client/types/query.pb.gw.go | 2 +- 3 files changed, 81 insertions(+), 81 deletions(-) diff --git a/docs/client/swagger-ui/swagger.yaml b/docs/client/swagger-ui/swagger.yaml index d74061283c4..96bfc103015 100644 --- a/docs/client/swagger-ui/swagger.yaml +++ b/docs/client/swagger-ui/swagger.yaml @@ -6896,7 +6896,7 @@ paths: } tags: - Query - /ibc/core/client/v1/verify_membership_proof: + /ibc/core/client/v1/verify_membership: post: summary: >- VerifyMembership queries an IBC light client for proof verification of a diff --git a/modules/core/02-client/types/query.pb.go b/modules/core/02-client/types/query.pb.go index d3340fd84c9..bad89fe1fdc 100644 --- a/modules/core/02-client/types/query.pb.go +++ b/modules/core/02-client/types/query.pb.go @@ -1133,85 +1133,85 @@ func init() { func init() { proto.RegisterFile("ibc/core/client/v1/query.proto", fileDescriptor_dc42cdfd1d52d76e) } var fileDescriptor_dc42cdfd1d52d76e = []byte{ - // 1244 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0xcb, 0x6f, 0x1b, 0x45, - 0x18, 0xcf, 0xa4, 0x4d, 0x9a, 0x7c, 0x76, 0x93, 0x6a, 0x9a, 0xa4, 0xee, 0x26, 0x75, 0x92, 0x0d, - 0x22, 0x69, 0x9a, 0xec, 0xc6, 0x0e, 0x4d, 0x42, 0x11, 0x12, 0xa4, 0xa8, 0x34, 0x87, 0x96, 0x60, - 0xc4, 0x43, 0x48, 0xc8, 0x5a, 0xaf, 0x27, 0xf6, 0xaa, 0xde, 0x5d, 0xd7, 0xb3, 0x6b, 0x29, 0xaa, - 0x72, 0xe9, 0x29, 0x37, 0x90, 0x90, 0xb8, 0x22, 0x71, 0xe4, 0x50, 0xf5, 0x80, 0xd4, 0x2b, 0x27, - 0xc8, 0xb1, 0x12, 0x1c, 0x38, 0x51, 0x94, 0x20, 0xf1, 0x6f, 0xa0, 0x9d, 0x99, 0xb5, 0x77, 0xed, - 0x71, 0xbd, 0x46, 0x2d, 0x37, 0xef, 0xf7, 0xfc, 0x7d, 0x8f, 0x99, 0xdf, 0xc8, 0x90, 0xb5, 0x4a, - 0xa6, 0x6e, 0xba, 0x0d, 0xa2, 0x9b, 0x35, 0x8b, 0x38, 0x9e, 0xde, 0xcc, 0xe9, 0x0f, 0x7d, 0xd2, - 0x38, 0xd4, 0xea, 0x0d, 0xd7, 0x73, 0x31, 0xb6, 0x4a, 0xa6, 0x16, 0xe8, 0x35, 0xae, 0xd7, 0x9a, - 0x39, 0x65, 0xd5, 0x74, 0xa9, 0xed, 0x52, 0xbd, 0x64, 0x50, 0xc2, 0x8d, 0xf5, 0x66, 0xae, 0x44, - 0x3c, 0x23, 0xa7, 0xd7, 0x8d, 0x8a, 0xe5, 0x18, 0x9e, 0xe5, 0x3a, 0xdc, 0x5f, 0x99, 0x15, 0xb6, - 0xa1, 0x59, 0x34, 0xb8, 0x32, 0x2f, 0x49, 0x2e, 0xd2, 0x70, 0x83, 0xe5, 0xb6, 0x81, 0x6b, 0xdb, - 0x96, 0x67, 0x87, 0x46, 0xad, 0x2f, 0x61, 0x78, 0xb5, 0xe2, 0xba, 0x95, 0x1a, 0xd1, 0xd9, 0x57, - 0xc9, 0x3f, 0xd0, 0x0d, 0x27, 0x4c, 0x32, 0x27, 0x54, 0x46, 0xdd, 0xd2, 0x0d, 0xc7, 0x71, 0x3d, - 0x06, 0x8f, 0x0a, 0xed, 0x54, 0xc5, 0xad, 0xb8, 0xec, 0xa7, 0x1e, 0xfc, 0xe2, 0x52, 0x75, 0x0b, - 0xae, 0x7c, 0x1c, 0xe0, 0xbc, 0xcd, 0xc0, 0x7c, 0xe2, 0x19, 0x1e, 0x29, 0x90, 0x87, 0x3e, 0xa1, - 0x1e, 0x9e, 0x85, 0x71, 0x0e, 0xb1, 0x68, 0x95, 0x33, 0x68, 0x01, 0xad, 0x8c, 0x17, 0xc6, 0xb8, - 0x60, 0xaf, 0xac, 0x3e, 0x41, 0x90, 0xe9, 0x76, 0xa4, 0x75, 0xd7, 0xa1, 0x04, 0x6f, 0x43, 0x5a, - 0x78, 0xd2, 0x40, 0xce, 0x9c, 0x53, 0xf9, 0x29, 0x8d, 0xe3, 0xd3, 0x42, 0xe8, 0xda, 0xfb, 0xce, - 0x61, 0x21, 0x65, 0xb6, 0x03, 0xe0, 0x29, 0x18, 0xa9, 0x37, 0x5c, 0xf7, 0x20, 0x33, 0xbc, 0x80, - 0x56, 0xd2, 0x05, 0xfe, 0x81, 0x6f, 0x43, 0x9a, 0xfd, 0x28, 0x56, 0x89, 0x55, 0xa9, 0x7a, 0x99, - 0x73, 0x2c, 0x9c, 0xa2, 0x75, 0x0f, 0x4c, 0xbb, 0xcb, 0x2c, 0x76, 0xcf, 0x9f, 0xfc, 0x39, 0x3f, - 0x54, 0x48, 0x31, 0x2f, 0x2e, 0x52, 0x4b, 0xdd, 0x78, 0x69, 0x58, 0xe9, 0x1d, 0x80, 0xf6, 0x38, - 0x05, 0xda, 0x37, 0x35, 0x3e, 0x4f, 0x2d, 0x98, 0xbd, 0xc6, 0x67, 0x29, 0x66, 0xaf, 0xed, 0x1b, - 0x95, 0xb0, 0x4b, 0x85, 0x88, 0xa7, 0xfa, 0x3b, 0x82, 0xab, 0x92, 0x24, 0xa2, 0x2b, 0x0e, 0x5c, - 0x8c, 0x76, 0x85, 0x66, 0xd0, 0xc2, 0xb9, 0x95, 0x54, 0xfe, 0xba, 0xac, 0x8e, 0xbd, 0x32, 0x71, - 0x3c, 0xeb, 0xc0, 0x22, 0xe5, 0x48, 0xa8, 0xdd, 0x6c, 0x50, 0xd6, 0x8f, 0x2f, 0xe6, 0x67, 0xa4, - 0x6a, 0x5a, 0x48, 0x47, 0x7a, 0x49, 0xf1, 0x87, 0xb1, 0xaa, 0x86, 0x59, 0x55, 0xcb, 0x7d, 0xab, - 0xe2, 0x60, 0x63, 0x65, 0x3d, 0x45, 0xa0, 0xf0, 0xb2, 0x02, 0x95, 0x43, 0x7d, 0x9a, 0x78, 0x4f, - 0xf0, 0x32, 0x4c, 0x36, 0x48, 0xd3, 0xa2, 0x96, 0xeb, 0x14, 0x1d, 0xdf, 0x2e, 0x91, 0x06, 0x43, - 0x72, 0xbe, 0x30, 0x11, 0x8a, 0xef, 0x33, 0x69, 0xcc, 0x30, 0x32, 0xe7, 0x88, 0x21, 0x1f, 0x24, - 0x5e, 0x82, 0x8b, 0xb5, 0xa0, 0x3e, 0x2f, 0x34, 0x3b, 0xbf, 0x80, 0x56, 0xc6, 0x0a, 0x69, 0x2e, - 0x14, 0xd3, 0x7e, 0x86, 0x60, 0x56, 0x0a, 0x59, 0xcc, 0xe2, 0x5d, 0x98, 0x34, 0x43, 0x4d, 0x82, - 0x25, 0x9d, 0x30, 0x63, 0x61, 0x5e, 0xe7, 0x9e, 0x3e, 0x96, 0x23, 0xa7, 0x89, 0xba, 0x7d, 0x47, - 0x32, 0xf2, 0xff, 0xb2, 0xc8, 0xbf, 0x20, 0x98, 0x93, 0x83, 0x10, 0xfd, 0xfb, 0x0a, 0x2e, 0x75, - 0xf4, 0x2f, 0x5c, 0xe7, 0x35, 0x59, 0xb9, 0xf1, 0x30, 0x9f, 0x5b, 0x5e, 0x35, 0xd6, 0x80, 0xc9, - 0x78, 0x7b, 0x5f, 0xe1, 0xea, 0x1e, 0x23, 0x58, 0x94, 0x14, 0xc2, 0xb3, 0xff, 0xbf, 0x3d, 0xfd, - 0x15, 0x81, 0xfa, 0x32, 0x28, 0xa2, 0xb3, 0x5f, 0xc0, 0x95, 0x8e, 0xce, 0x8a, 0x75, 0x0a, 0x1b, - 0xdc, 0x7f, 0x9f, 0xa6, 0x4d, 0x59, 0x86, 0x57, 0xd7, 0xd4, 0xed, 0xae, 0xab, 0xd4, 0x4f, 0xd4, - 0x4a, 0x75, 0xb3, 0xeb, 0x7a, 0xf4, 0xdb, 0x85, 0xcf, 0xc0, 0x28, 0x65, 0x12, 0xe1, 0x26, 0xbe, - 0x54, 0x25, 0x96, 0x6d, 0xdf, 0x68, 0x18, 0x76, 0x98, 0x4d, 0xfd, 0x28, 0x16, 0x30, 0xd4, 0x89, - 0x80, 0x79, 0x18, 0xad, 0x33, 0x89, 0x38, 0xda, 0xd2, 0xc6, 0x09, 0x1f, 0x61, 0xa9, 0x2e, 0xc2, - 0x3c, 0x0b, 0xf8, 0x69, 0xbd, 0xd2, 0x30, 0xca, 0xb1, 0xeb, 0x35, 0xcc, 0x59, 0x83, 0x85, 0xde, - 0x26, 0x22, 0xf5, 0x5d, 0x98, 0xf6, 0x85, 0xba, 0x98, 0x98, 0x09, 0x2f, 0xfb, 0xdd, 0x11, 0xd5, - 0x37, 0xc4, 0xd2, 0xb4, 0xb2, 0xc9, 0xae, 0x60, 0xd5, 0x87, 0xa5, 0x97, 0x5a, 0x09, 0x58, 0xf7, - 0x21, 0xd3, 0x86, 0x35, 0xc0, 0xf5, 0x37, 0xe3, 0x4b, 0xe3, 0xaa, 0xcf, 0x86, 0xc5, 0x35, 0xf1, - 0x19, 0x69, 0x58, 0x07, 0x87, 0xf7, 0x48, 0x70, 0x93, 0xd3, 0xaa, 0x55, 0x4f, 0x74, 0xb0, 0x5e, - 0xdf, 0x25, 0x8a, 0xf7, 0x20, 0x65, 0x93, 0xc6, 0x83, 0x1a, 0x29, 0xd6, 0x0d, 0xaf, 0xca, 0x18, - 0x22, 0x95, 0x57, 0x23, 0x31, 0xda, 0xaf, 0xaa, 0x66, 0x4e, 0xbb, 0xc7, 0x4c, 0xf7, 0x0d, 0xaf, - 0x2a, 0x62, 0x81, 0xdd, 0x92, 0x04, 0x28, 0x9b, 0x46, 0xcd, 0x27, 0x99, 0x11, 0x8e, 0x92, 0x7d, - 0xe0, 0x6b, 0x00, 0x9e, 0x65, 0x93, 0x62, 0x99, 0xd4, 0x8c, 0xc3, 0xcc, 0x28, 0x23, 0xaa, 0xf1, - 0x40, 0xf2, 0x41, 0x20, 0xc0, 0xf3, 0x90, 0x2a, 0xd5, 0x5c, 0xf3, 0x81, 0xd0, 0x5f, 0x60, 0x7a, - 0x60, 0x22, 0x66, 0xa0, 0xbe, 0x0d, 0xd7, 0x7a, 0x34, 0x4e, 0x8c, 0x2a, 0x03, 0x17, 0xa8, 0x6f, - 0x9a, 0x84, 0xf2, 0xed, 0x1d, 0x2b, 0x84, 0x9f, 0xf9, 0xe3, 0x09, 0x18, 0x61, 0xbe, 0xf8, 0x7b, - 0x04, 0xa9, 0xc8, 0xae, 0xe0, 0x1b, 0xb2, 0x26, 0xf5, 0x78, 0xdd, 0x29, 0x6b, 0xc9, 0x8c, 0x39, - 0x1c, 0xf5, 0xe6, 0xe3, 0xdf, 0xfe, 0xfe, 0x76, 0x58, 0xc7, 0xeb, 0x7a, 0xcf, 0x87, 0xac, 0xa0, - 0x01, 0xfd, 0x51, 0x6b, 0xe2, 0x47, 0xf8, 0x3b, 0x04, 0xe9, 0xe8, 0x0b, 0x05, 0x27, 0xca, 0x1a, - 0x1e, 0x6f, 0x65, 0x3d, 0xa1, 0xb5, 0x00, 0x79, 0x9d, 0x81, 0x5c, 0xc2, 0x8b, 0x7d, 0x41, 0xe2, - 0x17, 0x08, 0x26, 0xe2, 0xcb, 0x8c, 0xb5, 0xde, 0xc9, 0x64, 0x67, 0x4e, 0xd1, 0x13, 0xdb, 0x0b, - 0x78, 0x35, 0x06, 0xef, 0x00, 0x97, 0xa5, 0xf0, 0x3a, 0xd8, 0x34, 0xda, 0x46, 0x3d, 0x7c, 0x01, - 0xe9, 0x8f, 0x3a, 0xde, 0x52, 0x47, 0x3a, 0x3f, 0x25, 0x11, 0x05, 0x17, 0x1c, 0xe1, 0x27, 0x08, - 0x26, 0x3b, 0xd8, 0x1b, 0x27, 0x85, 0xdc, 0x1a, 0xc0, 0x46, 0x72, 0x07, 0x51, 0xe4, 0x0e, 0x2b, - 0x32, 0x8f, 0x37, 0x06, 0x2d, 0x12, 0x9f, 0x20, 0x98, 0x96, 0x52, 0x23, 0xbe, 0x99, 0x10, 0x45, - 0x9c, 0xd5, 0x95, 0xad, 0x41, 0xdd, 0x44, 0x09, 0xef, 0xb1, 0x12, 0x6e, 0xe1, 0x9d, 0x81, 0xe7, - 0x24, 0x88, 0x1a, 0xff, 0x10, 0x5b, 0x7b, 0x3f, 0xd9, 0xda, 0xfb, 0x03, 0xad, 0x7d, 0x9b, 0x38, - 0x13, 0x9f, 0x4d, 0x3f, 0xde, 0xef, 0xaf, 0x5b, 0x20, 0x39, 0x07, 0xf6, 0x05, 0x19, 0xa3, 0xde, - 0xbe, 0x20, 0xe3, 0x64, 0xac, 0xaa, 0x0c, 0xe4, 0x1c, 0x56, 0x64, 0x20, 0x39, 0xf9, 0xe2, 0x9f, - 0x10, 0x5c, 0x96, 0xb0, 0x2a, 0xde, 0xec, 0x99, 0xaa, 0x37, 0x4d, 0x2b, 0x6f, 0x0d, 0xe6, 0x24, - 0x60, 0xe6, 0x19, 0xcc, 0x35, 0xbc, 0x2a, 0x83, 0x29, 0xa5, 0x74, 0x8a, 0x7f, 0x46, 0x30, 0x23, - 0x27, 0x5e, 0xbc, 0xd5, 0x1f, 0x84, 0xf4, 0x6e, 0xd9, 0x1e, 0xd8, 0x2f, 0xc9, 0x2e, 0xf4, 0xe2, - 0x7e, 0xd6, 0xf9, 0x4b, 0x9d, 0x54, 0x84, 0x7b, 0x1f, 0xfe, 0x1e, 0x74, 0xaf, 0xe4, 0x06, 0xf0, - 0x10, 0x80, 0xdf, 0x39, 0xfe, 0xe7, 0xe9, 0x2a, 0x62, 0xa8, 0x37, 0x6e, 0xa1, 0x55, 0xf5, 0x86, - 0x0c, 0x78, 0x93, 0x79, 0x17, 0xed, 0x96, 0x7b, 0x91, 0x91, 0xfd, 0x6e, 0xe1, 0xe4, 0x34, 0x8b, - 0x9e, 0x9f, 0x66, 0xd1, 0x5f, 0xa7, 0x59, 0xf4, 0xcd, 0x59, 0x76, 0xe8, 0xf9, 0x59, 0x76, 0xe8, - 0x8f, 0xb3, 0xec, 0xd0, 0x97, 0x3b, 0x15, 0xcb, 0xab, 0xfa, 0xa5, 0x80, 0xe8, 0x75, 0xf1, 0xbf, - 0x8c, 0x55, 0x32, 0xd7, 0x2b, 0xae, 0xde, 0xdc, 0xd1, 0x6d, 0xb7, 0xec, 0xd7, 0x08, 0xe5, 0x59, - 0x36, 0xf2, 0xeb, 0x22, 0x91, 0x77, 0x58, 0x27, 0xb4, 0x34, 0xca, 0x5e, 0x3e, 0x9b, 0xff, 0x06, - 0x00, 0x00, 0xff, 0xff, 0x30, 0xd4, 0xeb, 0x40, 0x2f, 0x12, 0x00, 0x00, + // 1242 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0xcd, 0x4f, 0x1b, 0x47, + 0x1b, 0x67, 0x08, 0x10, 0x78, 0xec, 0x40, 0x34, 0x01, 0xe2, 0x2c, 0xc4, 0xc0, 0xf2, 0xbe, 0x85, + 0x50, 0xd8, 0xc5, 0xa6, 0x01, 0x1a, 0xa9, 0x52, 0x4b, 0xaa, 0x34, 0x1c, 0x92, 0x52, 0x57, 0xfd, + 0x50, 0xa5, 0xca, 0x5a, 0xaf, 0x07, 0x7b, 0x15, 0xef, 0xae, 0xe3, 0xd9, 0xb5, 0x84, 0x22, 0x2e, + 0x9c, 0x72, 0x6b, 0xa5, 0x4a, 0xbd, 0x56, 0xea, 0xb1, 0x87, 0x28, 0x87, 0x4a, 0xb9, 0xf6, 0xd4, + 0x72, 0x8c, 0xd4, 0x1e, 0x7a, 0x6a, 0x2a, 0xa8, 0xd4, 0x7f, 0xa3, 0xda, 0x99, 0x59, 0x7b, 0xd7, + 0x1e, 0xc7, 0xeb, 0x2a, 0xe9, 0xcd, 0xfb, 0x7c, 0xfe, 0x9e, 0x8f, 0x99, 0xdf, 0xc8, 0x90, 0xb5, + 0x4a, 0xa6, 0x6e, 0xba, 0x0d, 0xa2, 0x9b, 0x35, 0x8b, 0x38, 0x9e, 0xde, 0xcc, 0xe9, 0x0f, 0x7d, + 0xd2, 0x38, 0xd2, 0xea, 0x0d, 0xd7, 0x73, 0x31, 0xb6, 0x4a, 0xa6, 0x16, 0xe8, 0x35, 0xae, 0xd7, + 0x9a, 0x39, 0x65, 0xcd, 0x74, 0xa9, 0xed, 0x52, 0xbd, 0x64, 0x50, 0xc2, 0x8d, 0xf5, 0x66, 0xae, + 0x44, 0x3c, 0x23, 0xa7, 0xd7, 0x8d, 0x8a, 0xe5, 0x18, 0x9e, 0xe5, 0x3a, 0xdc, 0x5f, 0x99, 0x13, + 0xb6, 0xa1, 0x59, 0x34, 0xb8, 0xb2, 0x20, 0x49, 0x2e, 0xd2, 0x70, 0x83, 0x95, 0xb6, 0x81, 0x6b, + 0xdb, 0x96, 0x67, 0x87, 0x46, 0xad, 0x2f, 0x61, 0x78, 0xad, 0xe2, 0xba, 0x95, 0x1a, 0xd1, 0xd9, + 0x57, 0xc9, 0x3f, 0xd4, 0x0d, 0x27, 0x4c, 0x32, 0x2f, 0x54, 0x46, 0xdd, 0xd2, 0x0d, 0xc7, 0x71, + 0x3d, 0x06, 0x8f, 0x0a, 0xed, 0x74, 0xc5, 0xad, 0xb8, 0xec, 0xa7, 0x1e, 0xfc, 0xe2, 0x52, 0x75, + 0x1b, 0xae, 0x7e, 0x14, 0xe0, 0xbc, 0xcd, 0xc0, 0x7c, 0xec, 0x19, 0x1e, 0x29, 0x90, 0x87, 0x3e, + 0xa1, 0x1e, 0x9e, 0x83, 0x09, 0x0e, 0xb1, 0x68, 0x95, 0x33, 0x68, 0x11, 0xad, 0x4e, 0x14, 0xc6, + 0xb9, 0x60, 0xbf, 0xac, 0x3e, 0x41, 0x90, 0xe9, 0x76, 0xa4, 0x75, 0xd7, 0xa1, 0x04, 0xef, 0x40, + 0x5a, 0x78, 0xd2, 0x40, 0xce, 0x9c, 0x53, 0xf9, 0x69, 0x8d, 0xe3, 0xd3, 0x42, 0xe8, 0xda, 0x7b, + 0xce, 0x51, 0x21, 0x65, 0xb6, 0x03, 0xe0, 0x69, 0x18, 0xad, 0x37, 0x5c, 0xf7, 0x30, 0x33, 0xbc, + 0x88, 0x56, 0xd3, 0x05, 0xfe, 0x81, 0x6f, 0x43, 0x9a, 0xfd, 0x28, 0x56, 0x89, 0x55, 0xa9, 0x7a, + 0x99, 0x0b, 0x2c, 0x9c, 0xa2, 0x75, 0x0f, 0x4c, 0xbb, 0xcb, 0x2c, 0xf6, 0x46, 0x4e, 0xff, 0x58, + 0x18, 0x2a, 0xa4, 0x98, 0x17, 0x17, 0xa9, 0xa5, 0x6e, 0xbc, 0x34, 0xac, 0xf4, 0x0e, 0x40, 0x7b, + 0x9c, 0x02, 0xed, 0x1b, 0x1a, 0x9f, 0xa7, 0x16, 0xcc, 0x5e, 0xe3, 0xb3, 0x14, 0xb3, 0xd7, 0x0e, + 0x8c, 0x4a, 0xd8, 0xa5, 0x42, 0xc4, 0x53, 0xfd, 0x0d, 0xc1, 0x35, 0x49, 0x12, 0xd1, 0x15, 0x07, + 0x2e, 0x45, 0xbb, 0x42, 0x33, 0x68, 0xf1, 0xc2, 0x6a, 0x2a, 0x7f, 0x43, 0x56, 0xc7, 0x7e, 0x99, + 0x38, 0x9e, 0x75, 0x68, 0x91, 0x72, 0x24, 0xd4, 0x5e, 0x36, 0x28, 0xeb, 0x87, 0x17, 0x0b, 0xb3, + 0x52, 0x35, 0x2d, 0xa4, 0x23, 0xbd, 0xa4, 0xf8, 0x83, 0x58, 0x55, 0xc3, 0xac, 0xaa, 0x95, 0xbe, + 0x55, 0x71, 0xb0, 0xb1, 0xb2, 0x9e, 0x22, 0x50, 0x78, 0x59, 0x81, 0xca, 0xa1, 0x3e, 0x4d, 0xbc, + 0x27, 0x78, 0x05, 0xa6, 0x1a, 0xa4, 0x69, 0x51, 0xcb, 0x75, 0x8a, 0x8e, 0x6f, 0x97, 0x48, 0x83, + 0x21, 0x19, 0x29, 0x4c, 0x86, 0xe2, 0xfb, 0x4c, 0x1a, 0x33, 0x8c, 0xcc, 0x39, 0x62, 0xc8, 0x07, + 0x89, 0x97, 0xe1, 0x52, 0x2d, 0xa8, 0xcf, 0x0b, 0xcd, 0x46, 0x16, 0xd1, 0xea, 0x78, 0x21, 0xcd, + 0x85, 0x62, 0xda, 0xcf, 0x10, 0xcc, 0x49, 0x21, 0x8b, 0x59, 0xbc, 0x03, 0x53, 0x66, 0xa8, 0x49, + 0xb0, 0xa4, 0x93, 0x66, 0x2c, 0xcc, 0xeb, 0xdc, 0xd3, 0x13, 0x39, 0x72, 0x9a, 0xa8, 0xdb, 0x77, + 0x24, 0x23, 0xff, 0x37, 0x8b, 0xfc, 0x33, 0x82, 0x79, 0x39, 0x08, 0xd1, 0xbf, 0x2f, 0xe1, 0x72, + 0x47, 0xff, 0xc2, 0x75, 0x5e, 0x97, 0x95, 0x1b, 0x0f, 0xf3, 0x99, 0xe5, 0x55, 0x63, 0x0d, 0x98, + 0x8a, 0xb7, 0xf7, 0x15, 0xae, 0xee, 0x63, 0x04, 0x4b, 0x92, 0x42, 0x78, 0xf6, 0xff, 0xb6, 0xa7, + 0xbf, 0x20, 0x50, 0x5f, 0x06, 0x45, 0x74, 0xf6, 0x73, 0xb8, 0xda, 0xd1, 0x59, 0xb1, 0x4e, 0x61, + 0x83, 0xfb, 0xef, 0xd3, 0x8c, 0x29, 0xcb, 0xf0, 0xea, 0x9a, 0xba, 0xd3, 0x75, 0x95, 0xfa, 0x89, + 0x5a, 0xa9, 0x6e, 0x75, 0x5d, 0x8f, 0x7e, 0xbb, 0xf0, 0x59, 0x18, 0xa3, 0x4c, 0x22, 0xdc, 0xc4, + 0x97, 0xaa, 0xc4, 0xb2, 0x1d, 0x18, 0x0d, 0xc3, 0x0e, 0xb3, 0xa9, 0x1f, 0xc6, 0x02, 0x86, 0x3a, + 0x11, 0x30, 0x0f, 0x63, 0x75, 0x26, 0x11, 0x47, 0x5b, 0xda, 0x38, 0xe1, 0x23, 0x2c, 0xd5, 0x25, + 0x58, 0x60, 0x01, 0x3f, 0xa9, 0x57, 0x1a, 0x46, 0x39, 0x76, 0xbd, 0x86, 0x39, 0x6b, 0xb0, 0xd8, + 0xdb, 0x44, 0xa4, 0xbe, 0x0b, 0x33, 0xbe, 0x50, 0x17, 0x13, 0x33, 0xe1, 0x15, 0xbf, 0x3b, 0xa2, + 0xfa, 0x3f, 0xb1, 0x34, 0xad, 0x6c, 0xb2, 0x2b, 0x58, 0xf5, 0x61, 0xf9, 0xa5, 0x56, 0x02, 0xd6, + 0x7d, 0xc8, 0xb4, 0x61, 0x0d, 0x70, 0xfd, 0xcd, 0xfa, 0xd2, 0xb8, 0xea, 0xb3, 0x61, 0x71, 0x4d, + 0x7c, 0x4a, 0x1a, 0xd6, 0xe1, 0xd1, 0x3d, 0x12, 0xdc, 0xe4, 0xb4, 0x6a, 0xd5, 0x13, 0x1d, 0xac, + 0xd7, 0x77, 0x89, 0xe2, 0x7d, 0x48, 0xd9, 0xa4, 0xf1, 0xa0, 0x46, 0x8a, 0x75, 0xc3, 0xab, 0x32, + 0x86, 0x48, 0xe5, 0xd5, 0x48, 0x8c, 0xf6, 0xab, 0xaa, 0x99, 0xd3, 0xee, 0x31, 0xd3, 0x03, 0xc3, + 0xab, 0x8a, 0x58, 0x60, 0xb7, 0x24, 0x01, 0xca, 0xa6, 0x51, 0xf3, 0x49, 0x66, 0x94, 0xa3, 0x64, + 0x1f, 0xf8, 0x3a, 0x80, 0x67, 0xd9, 0xa4, 0x58, 0x26, 0x35, 0xe3, 0x28, 0x33, 0xc6, 0x88, 0x6a, + 0x22, 0x90, 0xbc, 0x1f, 0x08, 0xf0, 0x02, 0xa4, 0x4a, 0x35, 0xd7, 0x7c, 0x20, 0xf4, 0x17, 0x99, + 0x1e, 0x98, 0x88, 0x19, 0xa8, 0x6f, 0xc3, 0xf5, 0x1e, 0x8d, 0x13, 0xa3, 0xca, 0xc0, 0x45, 0xea, + 0x9b, 0x26, 0xa1, 0x7c, 0x7b, 0xc7, 0x0b, 0xe1, 0x67, 0xfe, 0x64, 0x12, 0x46, 0x99, 0x2f, 0xfe, + 0x0e, 0x41, 0x2a, 0xb2, 0x2b, 0xf8, 0x4d, 0x59, 0x93, 0x7a, 0xbc, 0xee, 0x94, 0xf5, 0x64, 0xc6, + 0x1c, 0x8e, 0x7a, 0xf3, 0xe4, 0xd7, 0xbf, 0xbe, 0x19, 0xd6, 0xf1, 0x86, 0xde, 0xf3, 0x21, 0x2b, + 0x68, 0x40, 0x7f, 0xd4, 0x9a, 0xf8, 0x31, 0xfe, 0x16, 0x41, 0x3a, 0xfa, 0x42, 0xc1, 0x89, 0xb2, + 0x86, 0xc7, 0x5b, 0xd9, 0x48, 0x68, 0x2d, 0x40, 0xde, 0x60, 0x20, 0x97, 0xf1, 0x52, 0x5f, 0x90, + 0xf8, 0x05, 0x82, 0xc9, 0xf8, 0x32, 0x63, 0xad, 0x77, 0x32, 0xd9, 0x99, 0x53, 0xf4, 0xc4, 0xf6, + 0x02, 0x5e, 0x8d, 0xc1, 0x3b, 0xc4, 0x65, 0x29, 0xbc, 0x0e, 0x36, 0x8d, 0xb6, 0x51, 0x0f, 0x5f, + 0x40, 0xfa, 0xa3, 0x8e, 0xb7, 0xd4, 0xb1, 0xce, 0x4f, 0x49, 0x44, 0xc1, 0x05, 0xc7, 0xf8, 0x09, + 0x82, 0xa9, 0x0e, 0xf6, 0xc6, 0x49, 0x21, 0xb7, 0x06, 0xb0, 0x99, 0xdc, 0x41, 0x14, 0xb9, 0xcb, + 0x8a, 0xcc, 0xe3, 0xcd, 0x41, 0x8b, 0xc4, 0xa7, 0x08, 0x66, 0xa4, 0xd4, 0x88, 0x6f, 0x26, 0x44, + 0x11, 0x67, 0x75, 0x65, 0x7b, 0x50, 0x37, 0x51, 0xc2, 0xbb, 0xac, 0x84, 0x5b, 0x78, 0x77, 0xe0, + 0x39, 0x09, 0xa2, 0xc6, 0xdf, 0xc7, 0xd6, 0xde, 0x4f, 0xb6, 0xf6, 0xfe, 0x40, 0x6b, 0xdf, 0x26, + 0xce, 0xc4, 0x67, 0xd3, 0x8f, 0xf7, 0xfb, 0xab, 0x16, 0x48, 0xce, 0x81, 0x7d, 0x41, 0xc6, 0xa8, + 0xb7, 0x2f, 0xc8, 0x38, 0x19, 0xab, 0x2a, 0x03, 0x39, 0x8f, 0x15, 0x19, 0x48, 0x4e, 0xbe, 0xf8, + 0x47, 0x04, 0x57, 0x24, 0xac, 0x8a, 0xb7, 0x7a, 0xa6, 0xea, 0x4d, 0xd3, 0xca, 0x5b, 0x83, 0x39, + 0x09, 0x98, 0x79, 0x06, 0x73, 0x1d, 0xaf, 0xc9, 0x60, 0x4a, 0x29, 0x9d, 0xe2, 0x9f, 0x10, 0xcc, + 0xca, 0x89, 0x17, 0x6f, 0xf7, 0x07, 0x21, 0xbd, 0x5b, 0x76, 0x06, 0xf6, 0x4b, 0xb2, 0x0b, 0xbd, + 0xb8, 0x9f, 0x06, 0x97, 0xc5, 0xe5, 0x4e, 0x2a, 0xc2, 0xbd, 0x0f, 0x7f, 0x0f, 0xba, 0x57, 0x72, + 0x03, 0x78, 0x84, 0x80, 0x1f, 0xff, 0xfd, 0x74, 0x0d, 0x31, 0xd4, 0x6b, 0xb7, 0xd0, 0x9a, 0xfa, + 0x7f, 0x19, 0xf0, 0x26, 0xf3, 0x2e, 0xda, 0x2d, 0xf7, 0xbd, 0xc2, 0xe9, 0x59, 0x16, 0x3d, 0x3f, + 0xcb, 0xa2, 0x3f, 0xcf, 0xb2, 0xe8, 0xeb, 0xf3, 0xec, 0xd0, 0xf3, 0xf3, 0xec, 0xd0, 0xef, 0xe7, + 0xd9, 0xa1, 0x2f, 0x76, 0x2b, 0x96, 0x57, 0xf5, 0x4b, 0x01, 0xc5, 0xeb, 0xe2, 0x1f, 0x19, 0xab, + 0x64, 0x6e, 0x54, 0x5c, 0xbd, 0xb9, 0xab, 0xdb, 0x6e, 0xd9, 0xaf, 0x11, 0xca, 0xe3, 0x6f, 0xe6, + 0x37, 0x44, 0x0a, 0xef, 0xa8, 0x4e, 0x68, 0x69, 0x8c, 0xbd, 0x79, 0xb6, 0xfe, 0x09, 0x00, 0x00, + 0xff, 0xff, 0x78, 0xef, 0x8a, 0x42, 0x29, 0x12, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/modules/core/02-client/types/query.pb.gw.go b/modules/core/02-client/types/query.pb.gw.go index 9e26095e8a0..70d1ac22c2f 100644 --- a/modules/core/02-client/types/query.pb.gw.go +++ b/modules/core/02-client/types/query.pb.gw.go @@ -1024,7 +1024,7 @@ var ( pattern_Query_UpgradedConsensusState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"ibc", "core", "client", "v1", "upgraded_consensus_states"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Query_VerifyMembership_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"ibc", "core", "client", "v1", "verify_membership_proof"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_VerifyMembership_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"ibc", "core", "client", "v1", "verify_membership"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( From 294bacfcbd5fcca6cd8f0a4e8d742a080e4926f7 Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Thu, 15 Feb 2024 13:20:36 +0100 Subject: [PATCH 17/18] nit: update comment in querier --- modules/light-clients/08-wasm/types/querier.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/light-clients/08-wasm/types/querier.go b/modules/light-clients/08-wasm/types/querier.go index f83057234b1..d9eb1376492 100644 --- a/modules/light-clients/08-wasm/types/querier.go +++ b/modules/light-clients/08-wasm/types/querier.go @@ -134,7 +134,7 @@ func NewDefaultQueryPlugins() *QueryPlugins { // This function returns protobuf encoded responses in bytes. func AcceptListStargateQuerier(acceptedQueries []string) func(sdk.Context, *wasmvmtypes.StargateQuery) ([]byte, error) { return func(ctx sdk.Context, request *wasmvmtypes.StargateQuery) ([]byte, error) { - // A default list of accepted queries can be added here. + // append user defined accepted queries to default list defined above. acceptedQueries = append(defaultAcceptList, acceptedQueries...) isAccepted := slices.Contains(acceptedQueries, request.Path) From 00f59e866d2d8df3e2aca3c31ce9c68340bd4763 Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Thu, 15 Feb 2024 13:25:51 +0100 Subject: [PATCH 18/18] imp: add more info to godoc for VerifyMembership rpc --- modules/core/02-client/keeper/grpc_query.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/core/02-client/keeper/grpc_query.go b/modules/core/02-client/keeper/grpc_query.go index 108888ecc54..cf2714b329e 100644 --- a/modules/core/02-client/keeper/grpc_query.go +++ b/modules/core/02-client/keeper/grpc_query.go @@ -330,6 +330,8 @@ func (k Keeper) UpgradedConsensusState(c context.Context, req *types.QueryUpgrad } // VerifyMembership implements the Query/VerifyMembership gRPC method +// NOTE: Any state changes made within this handler are discarded by leveraging a cached context. Gas is consumed for underlying state access. +// This gRPC method is intended to be used within the context of the state machine and delegates to light clients to verify proofs. func (k Keeper) VerifyMembership(c context.Context, req *types.QueryVerifyMembershipRequest) (*types.QueryVerifyMembershipResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "empty request")