diff --git a/Makefile b/Makefile index 3bd99cb17b..486c9f7f24 100644 --- a/Makefile +++ b/Makefile @@ -57,12 +57,8 @@ core-rust: compiler: $(MAKE) -C starknet/compiler/rust $(VM_TARGET) -generate-buf: ## Generate protobuf files - @buf generate - generate: ## Generate mocks and code mkdir -p mocks - generate-buf go generate ./... clean-testcache: ## Clean Go test cache diff --git a/grpc/buf.gen.yaml b/grpc/buf.gen.yaml index 880135ef06..c25b423f4b 100644 --- a/grpc/buf.gen.yaml +++ b/grpc/buf.gen.yaml @@ -1,8 +1,9 @@ -version: v1beta1 +version: v2 +clean: true plugins: - - name: go + - remote: buf.build/protocolbuffers/go:v1.36.3 out: gen opt: paths=source_relative - - name: go-grpc + - remote: buf.build/grpc/go:v1.5.1 out: gen - opt: paths=source_relative,require_unimplemented_servers=false \ No newline at end of file + opt: paths=source_relative diff --git a/buf.yaml b/grpc/buf.yaml similarity index 65% rename from buf.yaml rename to grpc/buf.yaml index 3a2036cad1..a4b23156f9 100644 --- a/buf.yaml +++ b/grpc/buf.yaml @@ -1,10 +1,10 @@ version: v2 modules: - - path: p2p/spec/ + - path: ./ lint: use: - - DEFAULT + - STANDARD breaking: use: - FILE diff --git a/grpc/gen/kv.pb.go b/grpc/gen/kv.pb.go index faa79f962b..ad6b7d60da 100644 --- a/grpc/gen/kv.pb.go +++ b/grpc/gen/kv.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v3.21.12 +// protoc-gen-go v1.36.3 +// protoc (unknown) // source: kv.proto package gen @@ -87,24 +87,21 @@ func (Op) EnumDescriptor() ([]byte, []int) { } type Cursor struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Op Op `protobuf:"varint,1,opt,name=op,proto3,enum=database.Op" json:"op,omitempty"` + BucketName []byte `protobuf:"bytes,2,opt,name=bucket_name,json=bucketName,proto3" json:"bucket_name,omitempty"` + Cursor uint32 `protobuf:"varint,3,opt,name=cursor,proto3" json:"cursor,omitempty"` + K []byte `protobuf:"bytes,4,opt,name=k,proto3" json:"k,omitempty"` + V []byte `protobuf:"bytes,5,opt,name=v,proto3" json:"v,omitempty"` // not used unknownFields protoimpl.UnknownFields - - Op Op `protobuf:"varint,1,opt,name=op,proto3,enum=database.Op" json:"op,omitempty"` - BucketName []byte `protobuf:"bytes,2,opt,name=bucket_name,json=bucketName,proto3" json:"bucket_name,omitempty"` - Cursor uint32 `protobuf:"varint,3,opt,name=cursor,proto3" json:"cursor,omitempty"` - K []byte `protobuf:"bytes,4,opt,name=k,proto3" json:"k,omitempty"` - V []byte `protobuf:"bytes,5,opt,name=v,proto3" json:"v,omitempty"` // not used + sizeCache protoimpl.SizeCache } func (x *Cursor) Reset() { *x = Cursor{} - if protoimpl.UnsafeEnabled { - mi := &file_kv_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_kv_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Cursor) String() string { @@ -115,7 +112,7 @@ func (*Cursor) ProtoMessage() {} func (x *Cursor) ProtoReflect() protoreflect.Message { mi := &file_kv_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -166,24 +163,21 @@ func (x *Cursor) GetV() []byte { } type Pair struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + K []byte `protobuf:"bytes,1,opt,name=k,proto3" json:"k,omitempty"` + V []byte `protobuf:"bytes,2,opt,name=v,proto3" json:"v,omitempty"` + CursorId uint32 `protobuf:"varint,3,opt,name=cursor_id,json=cursorId,proto3" json:"cursor_id,omitempty"` + ViewId uint64 `protobuf:"varint,4,opt,name=view_id,json=viewId,proto3" json:"view_id,omitempty"` // not used + TxId uint64 `protobuf:"varint,5,opt,name=tx_id,json=txId,proto3" json:"tx_id,omitempty"` // not used unknownFields protoimpl.UnknownFields - - K []byte `protobuf:"bytes,1,opt,name=k,proto3" json:"k,omitempty"` - V []byte `protobuf:"bytes,2,opt,name=v,proto3" json:"v,omitempty"` - CursorId uint32 `protobuf:"varint,3,opt,name=cursor_id,json=cursorId,proto3" json:"cursor_id,omitempty"` - ViewId uint64 `protobuf:"varint,4,opt,name=view_id,json=viewId,proto3" json:"view_id,omitempty"` // not used - TxId uint64 `protobuf:"varint,5,opt,name=tx_id,json=txId,proto3" json:"tx_id,omitempty"` // not used + sizeCache protoimpl.SizeCache } func (x *Pair) Reset() { *x = Pair{} - if protoimpl.UnsafeEnabled { - mi := &file_kv_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_kv_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Pair) String() string { @@ -194,7 +188,7 @@ func (*Pair) ProtoMessage() {} func (x *Pair) ProtoReflect() protoreflect.Message { mi := &file_kv_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -245,22 +239,19 @@ func (x *Pair) GetTxId() uint64 { } type VersionReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Major uint32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` + Minor uint32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` + Patch uint32 `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"` unknownFields protoimpl.UnknownFields - - Major uint32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` - Minor uint32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` - Patch uint32 `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"` + sizeCache protoimpl.SizeCache } func (x *VersionReply) Reset() { *x = VersionReply{} - if protoimpl.UnsafeEnabled { - mi := &file_kv_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_kv_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *VersionReply) String() string { @@ -271,7 +262,7 @@ func (*VersionReply) ProtoMessage() {} func (x *VersionReply) ProtoReflect() protoreflect.Message { mi := &file_kv_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -364,7 +355,7 @@ func file_kv_proto_rawDescGZIP() []byte { var file_kv_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_kv_proto_msgTypes = make([]protoimpl.MessageInfo, 3) -var file_kv_proto_goTypes = []interface{}{ +var file_kv_proto_goTypes = []any{ (Op)(0), // 0: database.Op (*Cursor)(nil), // 1: database.Cursor (*Pair)(nil), // 2: database.Pair @@ -389,44 +380,6 @@ func file_kv_proto_init() { if File_kv_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_kv_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Cursor); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_kv_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Pair); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_kv_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VersionReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/grpc/gen/kv_grpc.pb.go b/grpc/gen/kv_grpc.pb.go index d64c885b5c..b0bf2f3486 100644 --- a/grpc/gen/kv_grpc.pb.go +++ b/grpc/gen/kv_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.12 +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) // source: kv.proto package gen @@ -16,15 +16,20 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + KV_Version_FullMethodName = "/database.KV/Version" + KV_Tx_FullMethodName = "/database.KV/Tx" +) // KVClient is the client API for KV service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type KVClient interface { Version(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*VersionReply, error) - Tx(ctx context.Context, opts ...grpc.CallOption) (KV_TxClient, error) + Tx(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[Cursor, Pair], error) } type kVClient struct { @@ -36,65 +41,52 @@ func NewKVClient(cc grpc.ClientConnInterface) KVClient { } func (c *kVClient) Version(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*VersionReply, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(VersionReply) - err := c.cc.Invoke(ctx, "/database.KV/Version", in, out, opts...) + err := c.cc.Invoke(ctx, KV_Version_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *kVClient) Tx(ctx context.Context, opts ...grpc.CallOption) (KV_TxClient, error) { - stream, err := c.cc.NewStream(ctx, &KV_ServiceDesc.Streams[0], "/database.KV/Tx", opts...) +func (c *kVClient) Tx(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[Cursor, Pair], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &KV_ServiceDesc.Streams[0], KV_Tx_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &kVTxClient{stream} + x := &grpc.GenericClientStream[Cursor, Pair]{ClientStream: stream} return x, nil } -type KV_TxClient interface { - Send(*Cursor) error - Recv() (*Pair, error) - grpc.ClientStream -} - -type kVTxClient struct { - grpc.ClientStream -} - -func (x *kVTxClient) Send(m *Cursor) error { - return x.ClientStream.SendMsg(m) -} - -func (x *kVTxClient) Recv() (*Pair, error) { - m := new(Pair) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type KV_TxClient = grpc.BidiStreamingClient[Cursor, Pair] // KVServer is the server API for KV service. // All implementations must embed UnimplementedKVServer -// for forward compatibility +// for forward compatibility. type KVServer interface { Version(context.Context, *emptypb.Empty) (*VersionReply, error) - Tx(KV_TxServer) error + Tx(grpc.BidiStreamingServer[Cursor, Pair]) error mustEmbedUnimplementedKVServer() } -// UnimplementedKVServer must be embedded to have forward compatible implementations. -type UnimplementedKVServer struct { -} +// UnimplementedKVServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedKVServer struct{} func (UnimplementedKVServer) Version(context.Context, *emptypb.Empty) (*VersionReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Version not implemented") } -func (UnimplementedKVServer) Tx(KV_TxServer) error { +func (UnimplementedKVServer) Tx(grpc.BidiStreamingServer[Cursor, Pair]) error { return status.Errorf(codes.Unimplemented, "method Tx not implemented") } func (UnimplementedKVServer) mustEmbedUnimplementedKVServer() {} +func (UnimplementedKVServer) testEmbeddedByValue() {} // UnsafeKVServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to KVServer will @@ -104,6 +96,13 @@ type UnsafeKVServer interface { } func RegisterKVServer(s grpc.ServiceRegistrar, srv KVServer) { + // If the following call pancis, it indicates UnimplementedKVServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&KV_ServiceDesc, srv) } @@ -117,7 +116,7 @@ func _KV_Version_Handler(srv interface{}, ctx context.Context, dec func(interfac } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/database.KV/Version", + FullMethod: KV_Version_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(KVServer).Version(ctx, req.(*emptypb.Empty)) @@ -126,30 +125,11 @@ func _KV_Version_Handler(srv interface{}, ctx context.Context, dec func(interfac } func _KV_Tx_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(KVServer).Tx(&kVTxServer{stream}) -} - -type KV_TxServer interface { - Send(*Pair) error - Recv() (*Cursor, error) - grpc.ServerStream -} - -type kVTxServer struct { - grpc.ServerStream + return srv.(KVServer).Tx(&grpc.GenericServerStream[Cursor, Pair]{ServerStream: stream}) } -func (x *kVTxServer) Send(m *Pair) error { - return x.ServerStream.SendMsg(m) -} - -func (x *kVTxServer) Recv() (*Cursor, error) { - m := new(Cursor) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type KV_TxServer = grpc.BidiStreamingServer[Cursor, Pair] // KV_ServiceDesc is the grpc.ServiceDesc for KV service. // It's only intended for direct use with grpc.RegisterService, diff --git a/grpc/handlers.go b/grpc/handlers.go index d063ee9bc2..b89f00bbfe 100644 --- a/grpc/handlers.go +++ b/grpc/handlers.go @@ -1,4 +1,4 @@ -//go:generate protoc --go_out=gen --go_opt=paths=source_relative --go-grpc_out=gen --go-grpc_opt=paths=source_relative kv.proto +//go:generate buf generate package grpc import ( diff --git a/buf.gen.yaml b/p2p/buf.gen.yaml similarity index 50% rename from buf.gen.yaml rename to p2p/buf.gen.yaml index db961ae4b4..644de382dd 100644 --- a/buf.gen.yaml +++ b/p2p/buf.gen.yaml @@ -1,6 +1,6 @@ version: v2 clean: true plugins: - - remote: buf.build/protocolbuffers/go - out: p2p/gen + - remote: buf.build/protocolbuffers/go:v1.36.3 + out: gen opt: paths=source_relative diff --git a/p2p/buf.yaml b/p2p/buf.yaml new file mode 100644 index 0000000000..67348d665e --- /dev/null +++ b/p2p/buf.yaml @@ -0,0 +1,12 @@ +version: v2 + +modules: + - path: spec/ +lint: + use: + - STANDARD +breaking: + use: + - FILE + + diff --git a/p2p/p2p.go b/p2p/p2p.go index ddb1ed955d..b0b8a838d4 100644 --- a/p2p/p2p.go +++ b/p2p/p2p.go @@ -1,3 +1,4 @@ +//go:generate buf generate package p2p import (