Browse Source

added ipv6 responses

afeiszli 4 years ago
parent
commit
45eb3b4466
7 changed files with 1335 additions and 712 deletions
  1. 11 0
      controllers/nodeGrpcController.go
  2. 66 0
      docker-compose.nodns.yml
  3. 0 2
      docker-compose.yml
  4. 1 0
      go.mod
  5. 1253 710
      grpc/node.pb.go
  6. 3 0
      grpc/node.proto
  7. 1 0
      models/structs.go

+ 11 - 0
controllers/nodeGrpcController.go

@@ -7,6 +7,7 @@ import (
 	nodepb "github.com/gravitl/netmaker/grpc"
 	nodepb "github.com/gravitl/netmaker/grpc"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/functions"
 	"github.com/gravitl/netmaker/functions"
+	"github.com/gravitl/netmaker/servercfg"
 	"go.mongodb.org/mongo-driver/mongo"
 	"go.mongodb.org/mongo-driver/mongo"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/status"
 	"google.golang.org/grpc/status"
@@ -40,6 +41,7 @@ func (s *NodeServiceServer) ReadNode(ctx context.Context, req *nodepb.ReadNodeRe
 			Macaddress: node.MacAddress,
 			Macaddress: node.MacAddress,
 			Name:    node.Name,
 			Name:    node.Name,
 			Address:  node.Address,
 			Address:  node.Address,
+			Address6:  node.Address6,
 			Endpoint:  node.Endpoint,
 			Endpoint:  node.Endpoint,
 			Password:  node.Password,
 			Password:  node.Password,
 			Nodenetwork:  node.Network,
 			Nodenetwork:  node.Network,
@@ -48,6 +50,7 @@ func (s *NodeServiceServer) ReadNode(ctx context.Context, req *nodepb.ReadNodeRe
 			Postdown:  node.PostDown,
 			Postdown:  node.PostDown,
 			Postup:  node.PostUp,
 			Postup:  node.PostUp,
 			Checkininterval:  node.CheckInInterval,
 			Checkininterval:  node.CheckInInterval,
+			Dnsoff:  servercfg.IsDNSMode(),
 			Ispending:  node.IsPending,
 			Ispending:  node.IsPending,
 			Publickey:  node.PublicKey,
 			Publickey:  node.PublicKey,
 			Listenport:  node.ListenPort,
 			Listenport:  node.ListenPort,
@@ -71,6 +74,7 @@ func (s *NodeServiceServer) CreateNode(ctx context.Context, req *nodepb.CreateNo
                         LocalAddress: data.GetLocaladdress(),
                         LocalAddress: data.GetLocaladdress(),
                         Name:    data.GetName(),
                         Name:    data.GetName(),
                         Address:  data.GetAddress(),
                         Address:  data.GetAddress(),
+                        Address6:  data.GetAddress6(),
                         AccessKey:  data.GetAccesskey(),
                         AccessKey:  data.GetAccesskey(),
                         Endpoint:  data.GetEndpoint(),
                         Endpoint:  data.GetEndpoint(),
                         PersistentKeepalive:  data.GetKeepalive(),
                         PersistentKeepalive:  data.GetKeepalive(),
@@ -132,10 +136,12 @@ func (s *NodeServiceServer) CreateNode(ctx context.Context, req *nodepb.CreateNo
                         Localaddress: node.LocalAddress,
                         Localaddress: node.LocalAddress,
                         Name:    node.Name,
                         Name:    node.Name,
                         Address:  node.Address,
                         Address:  node.Address,
+                        Address6:  node.Address6,
                         Endpoint:  node.Endpoint,
                         Endpoint:  node.Endpoint,
                         Password:  node.Password,
                         Password:  node.Password,
                         Interface:  node.Interface,
                         Interface:  node.Interface,
                         Nodenetwork:  node.Network,
                         Nodenetwork:  node.Network,
+			Dnsoff:  servercfg.IsDNSMode(),
                         Ispending:  node.IsPending,
                         Ispending:  node.IsPending,
                         Publickey:  node.PublicKey,
                         Publickey:  node.PublicKey,
                         Listenport:  node.ListenPort,
                         Listenport:  node.ListenPort,
@@ -162,6 +168,7 @@ func (s *NodeServiceServer) CheckIn(ctx context.Context, req *nodepb.CheckInReq)
                 // ID:       primitive.NilObjectID,
                 // ID:       primitive.NilObjectID,
                         MacAddress: data.GetMacaddress(),
                         MacAddress: data.GetMacaddress(),
                         Address:  data.GetAddress(),
                         Address:  data.GetAddress(),
+                        Address6:  data.GetAddress6(),
                         Endpoint:  data.GetEndpoint(),
                         Endpoint:  data.GetEndpoint(),
                         Network:  data.GetNodenetwork(),
                         Network:  data.GetNodenetwork(),
                         Password:  data.GetPassword(),
                         Password:  data.GetPassword(),
@@ -207,6 +214,7 @@ func (s *NodeServiceServer) UpdateNode(ctx context.Context, req *nodepb.UpdateNo
                         MacAddress: data.GetMacaddress(),
                         MacAddress: data.GetMacaddress(),
                         Name:    data.GetName(),
                         Name:    data.GetName(),
                         Address:  data.GetAddress(),
                         Address:  data.GetAddress(),
+                        Address6:  data.GetAddress6(),
                         LocalAddress:  data.GetLocaladdress(),
                         LocalAddress:  data.GetLocaladdress(),
                         Endpoint:  data.GetEndpoint(),
                         Endpoint:  data.GetEndpoint(),
                         Password:  data.GetPassword(),
                         Password:  data.GetPassword(),
@@ -255,6 +263,7 @@ func (s *NodeServiceServer) UpdateNode(ctx context.Context, req *nodepb.UpdateNo
                         Localaddress: newnode.LocalAddress,
                         Localaddress: newnode.LocalAddress,
                         Name:    newnode.Name,
                         Name:    newnode.Name,
                         Address:  newnode.Address,
                         Address:  newnode.Address,
+                        Address6:  newnode.Address6,
                         Endpoint:  newnode.Endpoint,
                         Endpoint:  newnode.Endpoint,
                         Password:  newnode.Password,
                         Password:  newnode.Password,
                         Interface:  newnode.Interface,
                         Interface:  newnode.Interface,
@@ -263,6 +272,7 @@ func (s *NodeServiceServer) UpdateNode(ctx context.Context, req *nodepb.UpdateNo
                         Nodenetwork:  newnode.Network,
                         Nodenetwork:  newnode.Network,
                         Ispending:  newnode.IsPending,
                         Ispending:  newnode.IsPending,
                         Publickey:  newnode.PublicKey,
                         Publickey:  newnode.PublicKey,
+			Dnsoff:  servercfg.IsDNSMode(),
                         Listenport:  newnode.ListenPort,
                         Listenport:  newnode.ListenPort,
                         Keepalive:  newnode.PersistentKeepalive,
                         Keepalive:  newnode.PersistentKeepalive,
                         Islocal:  *network.IsLocal,
                         Islocal:  *network.IsLocal,
@@ -316,6 +326,7 @@ func (s *NodeServiceServer) GetPeers(req *nodepb.GetPeersReq, stream nodepb.Node
 		stream.Send(&nodepb.GetPeersRes{
 		stream.Send(&nodepb.GetPeersRes{
 			Peers: &nodepb.PeersResponse{
 			Peers: &nodepb.PeersResponse{
                             Address:  peers[i].Address,
                             Address:  peers[i].Address,
+                            Address6:  peers[i].Address6,
                             Endpoint:  peers[i].Endpoint,
                             Endpoint:  peers[i].Endpoint,
                             Gatewayrange:  peers[i].GatewayRange,
                             Gatewayrange:  peers[i].GatewayRange,
                             Isgateway:  peers[i].IsGateway,
                             Isgateway:  peers[i].IsGateway,

+ 66 - 0
docker-compose.nodns.yml

@@ -0,0 +1,66 @@
+version: "3.4"
+
+volumes:
+  dnsconfig:
+  driver: local
+services:
+  mongodb:
+    image: mongo:4.2
+    ports:
+      - "27017:27017"
+    container_name: mongodb
+    volumes:
+      - mongovol:/data/db
+    restart: always
+    environment:
+      MONGO_INITDB_ROOT_USERNAME: mongoadmin
+      MONGO_INITDB_ROOT_PASSWORD: mongopass
+  netmaker:
+    privileged: true
+    container_name: netmaker
+    build: netmaker
+    depends_on:
+      - mongodb
+    image: gravitl/netmaker:v0.3
+    ports:
+      - "8081:8081"
+      - "50051:50051"
+    volumes:
+      - ./:/local
+      - /etc/netclient:/etc/netclient
+      - dnsconfig:/root/config/dnsconfig
+      - /usr/bin/wg:/usr/bin/wg:ro
+      - /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket
+      - /run/systemd/system:/run/systemd/system
+      - /etc/systemd/system:/etc/systemd/system
+      - /sys/fs/cgroup:/sys/fs/cgroup
+    cap_add:
+      - NET_ADMIN
+      - SYS_MODULE
+    restart: always
+    network_mode: host
+  netmaker-ui:
+    container_name: netmaker-ui
+    depends_on:
+      - netmaker
+    image: gravitl/netmaker-ui:v0.3
+    links:
+      - "netmaker:api"
+    ports:
+      - "80:80"
+    environment:
+      BACKEND_URL: "http://3.236.149.180:8081"
+  coredns:
+    depends_on:
+      - netmaker 
+    image: coredns/coredns
+    command: -conf /root/dnsconfig/Corefile
+    container_name: coredns
+    restart: always
+    ports:
+      - "53:53/udp"
+    volumes:
+      - dnsconfig:/root/dnsconfig
+volumes:
+  mongovol: {}
+  dnsconfig: {}

+ 0 - 2
docker-compose.yml

@@ -34,8 +34,6 @@ services:
       - /run/systemd/system:/run/systemd/system
       - /run/systemd/system:/run/systemd/system
       - /etc/systemd/system:/etc/systemd/system
       - /etc/systemd/system:/etc/systemd/system
       - /sys/fs/cgroup:/sys/fs/cgroup
       - /sys/fs/cgroup:/sys/fs/cgroup
-    environment:
-      MONGO_HOST: "127.0.0.1"
     cap_add:
     cap_add:
       - NET_ADMIN
       - NET_ADMIN
       - SYS_MODULE
       - SYS_MODULE

+ 1 - 0
go.mod

@@ -22,6 +22,7 @@ require (
 	golang.zx2c4.com/wireguard/wgctrl v0.0.0-20200609130330-bd2cb7843e1b
 	golang.zx2c4.com/wireguard/wgctrl v0.0.0-20200609130330-bd2cb7843e1b
 	google.golang.org/genproto v0.0.0-20210201151548-94839c025ad4 // indirect
 	google.golang.org/genproto v0.0.0-20210201151548-94839c025ad4 // indirect
 	google.golang.org/grpc v1.35.0
 	google.golang.org/grpc v1.35.0
+	google.golang.org/protobuf v1.25.0 // indirect
 	gopkg.in/go-playground/assert.v1 v1.2.1 // indirect
 	gopkg.in/go-playground/assert.v1 v1.2.1 // indirect
 	gopkg.in/go-playground/validator.v9 v9.31.0
 	gopkg.in/go-playground/validator.v9 v9.31.0
 	gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c
 	gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c

+ 1253 - 710
grpc/node.pb.go

@@ -1,1104 +1,1647 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.25.0-devel
+// 	protoc        v3.14.0
 // source: grpc/node.proto
 // source: grpc/node.proto
 
 
 package nodepb
 package nodepb
 
 
 import (
 import (
-	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 )
 
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
 
 type LoginRequest struct {
 type LoginRequest struct {
-	Macaddress           string   `protobuf:"bytes,1,opt,name=macaddress,proto3" json:"macaddress,omitempty"`
-	Password             string   `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"`
-	Network              string   `protobuf:"bytes,3,opt,name=network,proto3" json:"network,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
 
-func (m *LoginRequest) Reset()         { *m = LoginRequest{} }
-func (m *LoginRequest) String() string { return proto.CompactTextString(m) }
-func (*LoginRequest) ProtoMessage()    {}
-func (*LoginRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_d13bd996b67da4ef, []int{0}
+	Macaddress string `protobuf:"bytes,1,opt,name=macaddress,proto3" json:"macaddress,omitempty"`
+	Password   string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"`
+	Network    string `protobuf:"bytes,3,opt,name=network,proto3" json:"network,omitempty"`
 }
 }
 
 
-func (m *LoginRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_LoginRequest.Unmarshal(m, b)
-}
-func (m *LoginRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_LoginRequest.Marshal(b, m, deterministic)
-}
-func (m *LoginRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_LoginRequest.Merge(m, src)
+func (x *LoginRequest) Reset() {
+	*x = LoginRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_grpc_node_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 }
-func (m *LoginRequest) XXX_Size() int {
-	return xxx_messageInfo_LoginRequest.Size(m)
+
+func (x *LoginRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 }
-func (m *LoginRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_LoginRequest.DiscardUnknown(m)
+
+func (*LoginRequest) ProtoMessage() {}
+
+func (x *LoginRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_grpc_node_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 }
 
 
-var xxx_messageInfo_LoginRequest proto.InternalMessageInfo
+// Deprecated: Use LoginRequest.ProtoReflect.Descriptor instead.
+func (*LoginRequest) Descriptor() ([]byte, []int) {
+	return file_grpc_node_proto_rawDescGZIP(), []int{0}
+}
 
 
-func (m *LoginRequest) GetMacaddress() string {
-	if m != nil {
-		return m.Macaddress
+func (x *LoginRequest) GetMacaddress() string {
+	if x != nil {
+		return x.Macaddress
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *LoginRequest) GetPassword() string {
-	if m != nil {
-		return m.Password
+func (x *LoginRequest) GetPassword() string {
+	if x != nil {
+		return x.Password
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *LoginRequest) GetNetwork() string {
-	if m != nil {
-		return m.Network
+func (x *LoginRequest) GetNetwork() string {
+	if x != nil {
+		return x.Network
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
 type LoginResponse struct {
 type LoginResponse struct {
-	Accesstoken          string   `protobuf:"bytes,1,opt,name=accesstoken,proto3" json:"accesstoken,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
 
-func (m *LoginResponse) Reset()         { *m = LoginResponse{} }
-func (m *LoginResponse) String() string { return proto.CompactTextString(m) }
-func (*LoginResponse) ProtoMessage()    {}
-func (*LoginResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_d13bd996b67da4ef, []int{1}
+	Accesstoken string `protobuf:"bytes,1,opt,name=accesstoken,proto3" json:"accesstoken,omitempty"`
 }
 }
 
 
-func (m *LoginResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_LoginResponse.Unmarshal(m, b)
-}
-func (m *LoginResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_LoginResponse.Marshal(b, m, deterministic)
-}
-func (m *LoginResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_LoginResponse.Merge(m, src)
+func (x *LoginResponse) Reset() {
+	*x = LoginResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_grpc_node_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 }
-func (m *LoginResponse) XXX_Size() int {
-	return xxx_messageInfo_LoginResponse.Size(m)
+
+func (x *LoginResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 }
-func (m *LoginResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_LoginResponse.DiscardUnknown(m)
+
+func (*LoginResponse) ProtoMessage() {}
+
+func (x *LoginResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_grpc_node_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 }
 
 
-var xxx_messageInfo_LoginResponse proto.InternalMessageInfo
+// Deprecated: Use LoginResponse.ProtoReflect.Descriptor instead.
+func (*LoginResponse) Descriptor() ([]byte, []int) {
+	return file_grpc_node_proto_rawDescGZIP(), []int{1}
+}
 
 
-func (m *LoginResponse) GetAccesstoken() string {
-	if m != nil {
-		return m.Accesstoken
+func (x *LoginResponse) GetAccesstoken() string {
+	if x != nil {
+		return x.Accesstoken
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
 type Node struct {
 type Node struct {
-	Id                   string   `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
-	Name                 string   `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
-	Address              string   `protobuf:"bytes,3,opt,name=address,proto3" json:"address,omitempty"`
-	Listenport           int32    `protobuf:"varint,4,opt,name=listenport,proto3" json:"listenport,omitempty"`
-	Publickey            string   `protobuf:"bytes,5,opt,name=publickey,proto3" json:"publickey,omitempty"`
-	Endpoint             string   `protobuf:"bytes,6,opt,name=endpoint,proto3" json:"endpoint,omitempty"`
-	Macaddress           string   `protobuf:"bytes,7,opt,name=macaddress,proto3" json:"macaddress,omitempty"`
-	Password             string   `protobuf:"bytes,8,opt,name=password,proto3" json:"password,omitempty"`
-	Nodenetwork          string   `protobuf:"bytes,9,opt,name=nodenetwork,proto3" json:"nodenetwork,omitempty"`
-	Ispending            bool     `protobuf:"varint,10,opt,name=ispending,proto3" json:"ispending,omitempty"`
-	Postup               string   `protobuf:"bytes,11,opt,name=postup,proto3" json:"postup,omitempty"`
-	Postdown             string   `protobuf:"bytes,12,opt,name=postdown,proto3" json:"postdown,omitempty"`
-	Keepalive            int32    `protobuf:"varint,13,opt,name=keepalive,proto3" json:"keepalive,omitempty"`
-	Saveconfig           bool     `protobuf:"varint,14,opt,name=saveconfig,proto3" json:"saveconfig,omitempty"`
-	Accesskey            string   `protobuf:"bytes,15,opt,name=accesskey,proto3" json:"accesskey,omitempty"`
-	Interface            string   `protobuf:"bytes,16,opt,name=interface,proto3" json:"interface,omitempty"`
-	Lastcheckin          string   `protobuf:"bytes,17,opt,name=lastcheckin,proto3" json:"lastcheckin,omitempty"`
-	Lastmodified         string   `protobuf:"bytes,18,opt,name=lastmodified,proto3" json:"lastmodified,omitempty"`
-	Checkininterval      int32    `protobuf:"varint,19,opt,name=checkininterval,proto3" json:"checkininterval,omitempty"`
-	Localaddress         string   `protobuf:"bytes,20,opt,name=localaddress,proto3" json:"localaddress,omitempty"`
-	Postchanges          string   `protobuf:"bytes,21,opt,name=postchanges,proto3" json:"postchanges,omitempty"`
-	Allowedips           string   `protobuf:"bytes,22,opt,name=allowedips,proto3" json:"allowedips,omitempty"`
-	Islocal              bool     `protobuf:"varint,23,opt,name=islocal,proto3" json:"islocal,omitempty"`
-	Dnsoff               bool     `protobuf:"varint,24,opt,name=dnsoff,proto3" json:"dnsoff,omitempty"`
-	Localrange           string   `protobuf:"bytes,25,opt,name=localrange,proto3" json:"localrange,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Node) Reset()         { *m = Node{} }
-func (m *Node) String() string { return proto.CompactTextString(m) }
-func (*Node) ProtoMessage()    {}
-func (*Node) Descriptor() ([]byte, []int) {
-	return fileDescriptor_d13bd996b67da4ef, []int{2}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id              string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	Name            string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+	Address         string `protobuf:"bytes,3,opt,name=address,proto3" json:"address,omitempty"`
+	Address6        string `protobuf:"bytes,26,opt,name=address6,proto3" json:"address6,omitempty"`
+	Listenport      int32  `protobuf:"varint,4,opt,name=listenport,proto3" json:"listenport,omitempty"`
+	Publickey       string `protobuf:"bytes,5,opt,name=publickey,proto3" json:"publickey,omitempty"`
+	Endpoint        string `protobuf:"bytes,6,opt,name=endpoint,proto3" json:"endpoint,omitempty"`
+	Macaddress      string `protobuf:"bytes,7,opt,name=macaddress,proto3" json:"macaddress,omitempty"`
+	Password        string `protobuf:"bytes,8,opt,name=password,proto3" json:"password,omitempty"`
+	Nodenetwork     string `protobuf:"bytes,9,opt,name=nodenetwork,proto3" json:"nodenetwork,omitempty"`
+	Ispending       bool   `protobuf:"varint,10,opt,name=ispending,proto3" json:"ispending,omitempty"`
+	Postup          string `protobuf:"bytes,11,opt,name=postup,proto3" json:"postup,omitempty"`
+	Postdown        string `protobuf:"bytes,12,opt,name=postdown,proto3" json:"postdown,omitempty"`
+	Keepalive       int32  `protobuf:"varint,13,opt,name=keepalive,proto3" json:"keepalive,omitempty"`
+	Saveconfig      bool   `protobuf:"varint,14,opt,name=saveconfig,proto3" json:"saveconfig,omitempty"`
+	Accesskey       string `protobuf:"bytes,15,opt,name=accesskey,proto3" json:"accesskey,omitempty"`
+	Interface       string `protobuf:"bytes,16,opt,name=interface,proto3" json:"interface,omitempty"`
+	Lastcheckin     string `protobuf:"bytes,17,opt,name=lastcheckin,proto3" json:"lastcheckin,omitempty"`
+	Lastmodified    string `protobuf:"bytes,18,opt,name=lastmodified,proto3" json:"lastmodified,omitempty"`
+	Checkininterval int32  `protobuf:"varint,19,opt,name=checkininterval,proto3" json:"checkininterval,omitempty"`
+	Localaddress    string `protobuf:"bytes,20,opt,name=localaddress,proto3" json:"localaddress,omitempty"`
+	Postchanges     string `protobuf:"bytes,21,opt,name=postchanges,proto3" json:"postchanges,omitempty"`
+	Allowedips      string `protobuf:"bytes,22,opt,name=allowedips,proto3" json:"allowedips,omitempty"`
+	Islocal         bool   `protobuf:"varint,23,opt,name=islocal,proto3" json:"islocal,omitempty"`
+	Isdualstack     bool   `protobuf:"varint,27,opt,name=isdualstack,proto3" json:"isdualstack,omitempty"`
+	Dnsoff          bool   `protobuf:"varint,24,opt,name=dnsoff,proto3" json:"dnsoff,omitempty"`
+	Localrange      string `protobuf:"bytes,25,opt,name=localrange,proto3" json:"localrange,omitempty"`
+}
+
+func (x *Node) Reset() {
+	*x = Node{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_grpc_node_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 }
 
 
-func (m *Node) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Node.Unmarshal(m, b)
-}
-func (m *Node) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Node.Marshal(b, m, deterministic)
+func (x *Node) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 }
-func (m *Node) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Node.Merge(m, src)
-}
-func (m *Node) XXX_Size() int {
-	return xxx_messageInfo_Node.Size(m)
+
+func (*Node) ProtoMessage() {}
+
+func (x *Node) ProtoReflect() protoreflect.Message {
+	mi := &file_grpc_node_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 }
-func (m *Node) XXX_DiscardUnknown() {
-	xxx_messageInfo_Node.DiscardUnknown(m)
+
+// Deprecated: Use Node.ProtoReflect.Descriptor instead.
+func (*Node) Descriptor() ([]byte, []int) {
+	return file_grpc_node_proto_rawDescGZIP(), []int{2}
 }
 }
 
 
-var xxx_messageInfo_Node proto.InternalMessageInfo
+func (x *Node) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
 
 
-func (m *Node) GetId() string {
-	if m != nil {
-		return m.Id
+func (x *Node) GetName() string {
+	if x != nil {
+		return x.Name
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *Node) GetName() string {
-	if m != nil {
-		return m.Name
+func (x *Node) GetAddress() string {
+	if x != nil {
+		return x.Address
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *Node) GetAddress() string {
-	if m != nil {
-		return m.Address
+func (x *Node) GetAddress6() string {
+	if x != nil {
+		return x.Address6
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *Node) GetListenport() int32 {
-	if m != nil {
-		return m.Listenport
+func (x *Node) GetListenport() int32 {
+	if x != nil {
+		return x.Listenport
 	}
 	}
 	return 0
 	return 0
 }
 }
 
 
-func (m *Node) GetPublickey() string {
-	if m != nil {
-		return m.Publickey
+func (x *Node) GetPublickey() string {
+	if x != nil {
+		return x.Publickey
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *Node) GetEndpoint() string {
-	if m != nil {
-		return m.Endpoint
+func (x *Node) GetEndpoint() string {
+	if x != nil {
+		return x.Endpoint
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *Node) GetMacaddress() string {
-	if m != nil {
-		return m.Macaddress
+func (x *Node) GetMacaddress() string {
+	if x != nil {
+		return x.Macaddress
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *Node) GetPassword() string {
-	if m != nil {
-		return m.Password
+func (x *Node) GetPassword() string {
+	if x != nil {
+		return x.Password
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *Node) GetNodenetwork() string {
-	if m != nil {
-		return m.Nodenetwork
+func (x *Node) GetNodenetwork() string {
+	if x != nil {
+		return x.Nodenetwork
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *Node) GetIspending() bool {
-	if m != nil {
-		return m.Ispending
+func (x *Node) GetIspending() bool {
+	if x != nil {
+		return x.Ispending
 	}
 	}
 	return false
 	return false
 }
 }
 
 
-func (m *Node) GetPostup() string {
-	if m != nil {
-		return m.Postup
+func (x *Node) GetPostup() string {
+	if x != nil {
+		return x.Postup
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *Node) GetPostdown() string {
-	if m != nil {
-		return m.Postdown
+func (x *Node) GetPostdown() string {
+	if x != nil {
+		return x.Postdown
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *Node) GetKeepalive() int32 {
-	if m != nil {
-		return m.Keepalive
+func (x *Node) GetKeepalive() int32 {
+	if x != nil {
+		return x.Keepalive
 	}
 	}
 	return 0
 	return 0
 }
 }
 
 
-func (m *Node) GetSaveconfig() bool {
-	if m != nil {
-		return m.Saveconfig
+func (x *Node) GetSaveconfig() bool {
+	if x != nil {
+		return x.Saveconfig
 	}
 	}
 	return false
 	return false
 }
 }
 
 
-func (m *Node) GetAccesskey() string {
-	if m != nil {
-		return m.Accesskey
+func (x *Node) GetAccesskey() string {
+	if x != nil {
+		return x.Accesskey
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *Node) GetInterface() string {
-	if m != nil {
-		return m.Interface
+func (x *Node) GetInterface() string {
+	if x != nil {
+		return x.Interface
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *Node) GetLastcheckin() string {
-	if m != nil {
-		return m.Lastcheckin
+func (x *Node) GetLastcheckin() string {
+	if x != nil {
+		return x.Lastcheckin
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *Node) GetLastmodified() string {
-	if m != nil {
-		return m.Lastmodified
+func (x *Node) GetLastmodified() string {
+	if x != nil {
+		return x.Lastmodified
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *Node) GetCheckininterval() int32 {
-	if m != nil {
-		return m.Checkininterval
+func (x *Node) GetCheckininterval() int32 {
+	if x != nil {
+		return x.Checkininterval
 	}
 	}
 	return 0
 	return 0
 }
 }
 
 
-func (m *Node) GetLocaladdress() string {
-	if m != nil {
-		return m.Localaddress
+func (x *Node) GetLocaladdress() string {
+	if x != nil {
+		return x.Localaddress
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *Node) GetPostchanges() string {
-	if m != nil {
-		return m.Postchanges
+func (x *Node) GetPostchanges() string {
+	if x != nil {
+		return x.Postchanges
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *Node) GetAllowedips() string {
-	if m != nil {
-		return m.Allowedips
+func (x *Node) GetAllowedips() string {
+	if x != nil {
+		return x.Allowedips
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *Node) GetIslocal() bool {
-	if m != nil {
-		return m.Islocal
+func (x *Node) GetIslocal() bool {
+	if x != nil {
+		return x.Islocal
 	}
 	}
 	return false
 	return false
 }
 }
 
 
-func (m *Node) GetDnsoff() bool {
-	if m != nil {
-		return m.Dnsoff
+func (x *Node) GetIsdualstack() bool {
+	if x != nil {
+		return x.Isdualstack
 	}
 	}
 	return false
 	return false
 }
 }
 
 
-func (m *Node) GetLocalrange() string {
-	if m != nil {
-		return m.Localrange
+func (x *Node) GetDnsoff() bool {
+	if x != nil {
+		return x.Dnsoff
+	}
+	return false
+}
+
+func (x *Node) GetLocalrange() string {
+	if x != nil {
+		return x.Localrange
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
 type CheckInResponse struct {
 type CheckInResponse struct {
-	Success              bool     `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
-	Needpeerupdate       bool     `protobuf:"varint,2,opt,name=needpeerupdate,proto3" json:"needpeerupdate,omitempty"`
-	Needconfigupdate     bool     `protobuf:"varint,3,opt,name=needconfigupdate,proto3" json:"needconfigupdate,omitempty"`
-	Nodemessage          string   `protobuf:"bytes,4,opt,name=nodemessage,proto3" json:"nodemessage,omitempty"`
-	Ispending            bool     `protobuf:"varint,5,opt,name=ispending,proto3" json:"ispending,omitempty"`
-	Needkeyupdate        bool     `protobuf:"varint,6,opt,name=needkeyupdate,proto3" json:"needkeyupdate,omitempty"`
-	Needdelete           bool     `protobuf:"varint,7,opt,name=needdelete,proto3" json:"needdelete,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *CheckInResponse) Reset()         { *m = CheckInResponse{} }
-func (m *CheckInResponse) String() string { return proto.CompactTextString(m) }
-func (*CheckInResponse) ProtoMessage()    {}
-func (*CheckInResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_d13bd996b67da4ef, []int{3}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Success          bool   `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
+	Needpeerupdate   bool   `protobuf:"varint,2,opt,name=needpeerupdate,proto3" json:"needpeerupdate,omitempty"`
+	Needconfigupdate bool   `protobuf:"varint,3,opt,name=needconfigupdate,proto3" json:"needconfigupdate,omitempty"`
+	Nodemessage      string `protobuf:"bytes,4,opt,name=nodemessage,proto3" json:"nodemessage,omitempty"`
+	Ispending        bool   `protobuf:"varint,5,opt,name=ispending,proto3" json:"ispending,omitempty"`
+	Needkeyupdate    bool   `protobuf:"varint,6,opt,name=needkeyupdate,proto3" json:"needkeyupdate,omitempty"`
+	Needdelete       bool   `protobuf:"varint,7,opt,name=needdelete,proto3" json:"needdelete,omitempty"`
+}
+
+func (x *CheckInResponse) Reset() {
+	*x = CheckInResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_grpc_node_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 }
 
 
-func (m *CheckInResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_CheckInResponse.Unmarshal(m, b)
-}
-func (m *CheckInResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_CheckInResponse.Marshal(b, m, deterministic)
-}
-func (m *CheckInResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CheckInResponse.Merge(m, src)
+func (x *CheckInResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 }
-func (m *CheckInResponse) XXX_Size() int {
-	return xxx_messageInfo_CheckInResponse.Size(m)
-}
-func (m *CheckInResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_CheckInResponse.DiscardUnknown(m)
+
+func (*CheckInResponse) ProtoMessage() {}
+
+func (x *CheckInResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_grpc_node_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 }
 
 
-var xxx_messageInfo_CheckInResponse proto.InternalMessageInfo
+// Deprecated: Use CheckInResponse.ProtoReflect.Descriptor instead.
+func (*CheckInResponse) Descriptor() ([]byte, []int) {
+	return file_grpc_node_proto_rawDescGZIP(), []int{3}
+}
 
 
-func (m *CheckInResponse) GetSuccess() bool {
-	if m != nil {
-		return m.Success
+func (x *CheckInResponse) GetSuccess() bool {
+	if x != nil {
+		return x.Success
 	}
 	}
 	return false
 	return false
 }
 }
 
 
-func (m *CheckInResponse) GetNeedpeerupdate() bool {
-	if m != nil {
-		return m.Needpeerupdate
+func (x *CheckInResponse) GetNeedpeerupdate() bool {
+	if x != nil {
+		return x.Needpeerupdate
 	}
 	}
 	return false
 	return false
 }
 }
 
 
-func (m *CheckInResponse) GetNeedconfigupdate() bool {
-	if m != nil {
-		return m.Needconfigupdate
+func (x *CheckInResponse) GetNeedconfigupdate() bool {
+	if x != nil {
+		return x.Needconfigupdate
 	}
 	}
 	return false
 	return false
 }
 }
 
 
-func (m *CheckInResponse) GetNodemessage() string {
-	if m != nil {
-		return m.Nodemessage
+func (x *CheckInResponse) GetNodemessage() string {
+	if x != nil {
+		return x.Nodemessage
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *CheckInResponse) GetIspending() bool {
-	if m != nil {
-		return m.Ispending
+func (x *CheckInResponse) GetIspending() bool {
+	if x != nil {
+		return x.Ispending
 	}
 	}
 	return false
 	return false
 }
 }
 
 
-func (m *CheckInResponse) GetNeedkeyupdate() bool {
-	if m != nil {
-		return m.Needkeyupdate
+func (x *CheckInResponse) GetNeedkeyupdate() bool {
+	if x != nil {
+		return x.Needkeyupdate
 	}
 	}
 	return false
 	return false
 }
 }
 
 
-func (m *CheckInResponse) GetNeeddelete() bool {
-	if m != nil {
-		return m.Needdelete
+func (x *CheckInResponse) GetNeeddelete() bool {
+	if x != nil {
+		return x.Needdelete
 	}
 	}
 	return false
 	return false
 }
 }
 
 
 type PeersResponse struct {
 type PeersResponse struct {
-	Isgateway            bool     `protobuf:"varint,1,opt,name=isgateway,proto3" json:"isgateway,omitempty"`
-	Gatewayrange         string   `protobuf:"bytes,2,opt,name=gatewayrange,proto3" json:"gatewayrange,omitempty"`
-	Publickey            string   `protobuf:"bytes,5,opt,name=publickey,proto3" json:"publickey,omitempty"`
-	Endpoint             string   `protobuf:"bytes,6,opt,name=endpoint,proto3" json:"endpoint,omitempty"`
-	Address              string   `protobuf:"bytes,3,opt,name=address,proto3" json:"address,omitempty"`
-	Listenport           int32    `protobuf:"varint,4,opt,name=listenport,proto3" json:"listenport,omitempty"`
-	Localaddress         string   `protobuf:"bytes,7,opt,name=localaddress,proto3" json:"localaddress,omitempty"`
-	Keepalive            int32    `protobuf:"varint,13,opt,name=keepalive,proto3" json:"keepalive,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *PeersResponse) Reset()         { *m = PeersResponse{} }
-func (m *PeersResponse) String() string { return proto.CompactTextString(m) }
-func (*PeersResponse) ProtoMessage()    {}
-func (*PeersResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_d13bd996b67da4ef, []int{4}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Isgateway    bool   `protobuf:"varint,1,opt,name=isgateway,proto3" json:"isgateway,omitempty"`
+	Gatewayrange string `protobuf:"bytes,2,opt,name=gatewayrange,proto3" json:"gatewayrange,omitempty"`
+	Publickey    string `protobuf:"bytes,5,opt,name=publickey,proto3" json:"publickey,omitempty"`
+	Endpoint     string `protobuf:"bytes,6,opt,name=endpoint,proto3" json:"endpoint,omitempty"`
+	Address      string `protobuf:"bytes,3,opt,name=address,proto3" json:"address,omitempty"`
+	Address6     string `protobuf:"bytes,8,opt,name=address6,proto3" json:"address6,omitempty"`
+	Listenport   int32  `protobuf:"varint,4,opt,name=listenport,proto3" json:"listenport,omitempty"`
+	Localaddress string `protobuf:"bytes,7,opt,name=localaddress,proto3" json:"localaddress,omitempty"`
+	Keepalive    int32  `protobuf:"varint,13,opt,name=keepalive,proto3" json:"keepalive,omitempty"`
+}
+
+func (x *PeersResponse) Reset() {
+	*x = PeersResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_grpc_node_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 }
 
 
-func (m *PeersResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_PeersResponse.Unmarshal(m, b)
-}
-func (m *PeersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_PeersResponse.Marshal(b, m, deterministic)
-}
-func (m *PeersResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_PeersResponse.Merge(m, src)
+func (x *PeersResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 }
-func (m *PeersResponse) XXX_Size() int {
-	return xxx_messageInfo_PeersResponse.Size(m)
-}
-func (m *PeersResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_PeersResponse.DiscardUnknown(m)
+
+func (*PeersResponse) ProtoMessage() {}
+
+func (x *PeersResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_grpc_node_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 }
 
 
-var xxx_messageInfo_PeersResponse proto.InternalMessageInfo
+// Deprecated: Use PeersResponse.ProtoReflect.Descriptor instead.
+func (*PeersResponse) Descriptor() ([]byte, []int) {
+	return file_grpc_node_proto_rawDescGZIP(), []int{4}
+}
 
 
-func (m *PeersResponse) GetIsgateway() bool {
-	if m != nil {
-		return m.Isgateway
+func (x *PeersResponse) GetIsgateway() bool {
+	if x != nil {
+		return x.Isgateway
 	}
 	}
 	return false
 	return false
 }
 }
 
 
-func (m *PeersResponse) GetGatewayrange() string {
-	if m != nil {
-		return m.Gatewayrange
+func (x *PeersResponse) GetGatewayrange() string {
+	if x != nil {
+		return x.Gatewayrange
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *PeersResponse) GetPublickey() string {
-	if m != nil {
-		return m.Publickey
+func (x *PeersResponse) GetPublickey() string {
+	if x != nil {
+		return x.Publickey
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *PeersResponse) GetEndpoint() string {
-	if m != nil {
-		return m.Endpoint
+func (x *PeersResponse) GetEndpoint() string {
+	if x != nil {
+		return x.Endpoint
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *PeersResponse) GetAddress() string {
-	if m != nil {
-		return m.Address
+func (x *PeersResponse) GetAddress() string {
+	if x != nil {
+		return x.Address
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *PeersResponse) GetListenport() int32 {
-	if m != nil {
-		return m.Listenport
+func (x *PeersResponse) GetAddress6() string {
+	if x != nil {
+		return x.Address6
+	}
+	return ""
+}
+
+func (x *PeersResponse) GetListenport() int32 {
+	if x != nil {
+		return x.Listenport
 	}
 	}
 	return 0
 	return 0
 }
 }
 
 
-func (m *PeersResponse) GetLocaladdress() string {
-	if m != nil {
-		return m.Localaddress
+func (x *PeersResponse) GetLocaladdress() string {
+	if x != nil {
+		return x.Localaddress
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *PeersResponse) GetKeepalive() int32 {
-	if m != nil {
-		return m.Keepalive
+func (x *PeersResponse) GetKeepalive() int32 {
+	if x != nil {
+		return x.Keepalive
 	}
 	}
 	return 0
 	return 0
 }
 }
 
 
 type CreateNodeReq struct {
 type CreateNodeReq struct {
-	Node                 *Node    `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
 
-func (m *CreateNodeReq) Reset()         { *m = CreateNodeReq{} }
-func (m *CreateNodeReq) String() string { return proto.CompactTextString(m) }
-func (*CreateNodeReq) ProtoMessage()    {}
-func (*CreateNodeReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_d13bd996b67da4ef, []int{5}
+	Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` // Node id blank
 }
 }
 
 
-func (m *CreateNodeReq) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_CreateNodeReq.Unmarshal(m, b)
-}
-func (m *CreateNodeReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_CreateNodeReq.Marshal(b, m, deterministic)
-}
-func (m *CreateNodeReq) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CreateNodeReq.Merge(m, src)
+func (x *CreateNodeReq) Reset() {
+	*x = CreateNodeReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_grpc_node_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 }
-func (m *CreateNodeReq) XXX_Size() int {
-	return xxx_messageInfo_CreateNodeReq.Size(m)
+
+func (x *CreateNodeReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 }
-func (m *CreateNodeReq) XXX_DiscardUnknown() {
-	xxx_messageInfo_CreateNodeReq.DiscardUnknown(m)
+
+func (*CreateNodeReq) ProtoMessage() {}
+
+func (x *CreateNodeReq) ProtoReflect() protoreflect.Message {
+	mi := &file_grpc_node_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 }
 
 
-var xxx_messageInfo_CreateNodeReq proto.InternalMessageInfo
+// Deprecated: Use CreateNodeReq.ProtoReflect.Descriptor instead.
+func (*CreateNodeReq) Descriptor() ([]byte, []int) {
+	return file_grpc_node_proto_rawDescGZIP(), []int{5}
+}
 
 
-func (m *CreateNodeReq) GetNode() *Node {
-	if m != nil {
-		return m.Node
+func (x *CreateNodeReq) GetNode() *Node {
+	if x != nil {
+		return x.Node
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
 type CreateNodeRes struct {
 type CreateNodeRes struct {
-	Node                 *Node    `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
 
-func (m *CreateNodeRes) Reset()         { *m = CreateNodeRes{} }
-func (m *CreateNodeRes) String() string { return proto.CompactTextString(m) }
-func (*CreateNodeRes) ProtoMessage()    {}
-func (*CreateNodeRes) Descriptor() ([]byte, []int) {
-	return fileDescriptor_d13bd996b67da4ef, []int{6}
+	Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` // Node id filled in
 }
 }
 
 
-func (m *CreateNodeRes) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_CreateNodeRes.Unmarshal(m, b)
-}
-func (m *CreateNodeRes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_CreateNodeRes.Marshal(b, m, deterministic)
-}
-func (m *CreateNodeRes) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CreateNodeRes.Merge(m, src)
+func (x *CreateNodeRes) Reset() {
+	*x = CreateNodeRes{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_grpc_node_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 }
-func (m *CreateNodeRes) XXX_Size() int {
-	return xxx_messageInfo_CreateNodeRes.Size(m)
+
+func (x *CreateNodeRes) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 }
-func (m *CreateNodeRes) XXX_DiscardUnknown() {
-	xxx_messageInfo_CreateNodeRes.DiscardUnknown(m)
+
+func (*CreateNodeRes) ProtoMessage() {}
+
+func (x *CreateNodeRes) ProtoReflect() protoreflect.Message {
+	mi := &file_grpc_node_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 }
 
 
-var xxx_messageInfo_CreateNodeRes proto.InternalMessageInfo
+// Deprecated: Use CreateNodeRes.ProtoReflect.Descriptor instead.
+func (*CreateNodeRes) Descriptor() ([]byte, []int) {
+	return file_grpc_node_proto_rawDescGZIP(), []int{6}
+}
 
 
-func (m *CreateNodeRes) GetNode() *Node {
-	if m != nil {
-		return m.Node
+func (x *CreateNodeRes) GetNode() *Node {
+	if x != nil {
+		return x.Node
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
 type UpdateNodeReq struct {
 type UpdateNodeReq struct {
-	Node                 *Node    `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
 
-func (m *UpdateNodeReq) Reset()         { *m = UpdateNodeReq{} }
-func (m *UpdateNodeReq) String() string { return proto.CompactTextString(m) }
-func (*UpdateNodeReq) ProtoMessage()    {}
-func (*UpdateNodeReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_d13bd996b67da4ef, []int{7}
+	Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"`
 }
 }
 
 
-func (m *UpdateNodeReq) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_UpdateNodeReq.Unmarshal(m, b)
-}
-func (m *UpdateNodeReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_UpdateNodeReq.Marshal(b, m, deterministic)
-}
-func (m *UpdateNodeReq) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_UpdateNodeReq.Merge(m, src)
+func (x *UpdateNodeReq) Reset() {
+	*x = UpdateNodeReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_grpc_node_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 }
-func (m *UpdateNodeReq) XXX_Size() int {
-	return xxx_messageInfo_UpdateNodeReq.Size(m)
+
+func (x *UpdateNodeReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 }
-func (m *UpdateNodeReq) XXX_DiscardUnknown() {
-	xxx_messageInfo_UpdateNodeReq.DiscardUnknown(m)
+
+func (*UpdateNodeReq) ProtoMessage() {}
+
+func (x *UpdateNodeReq) ProtoReflect() protoreflect.Message {
+	mi := &file_grpc_node_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 }
 
 
-var xxx_messageInfo_UpdateNodeReq proto.InternalMessageInfo
+// Deprecated: Use UpdateNodeReq.ProtoReflect.Descriptor instead.
+func (*UpdateNodeReq) Descriptor() ([]byte, []int) {
+	return file_grpc_node_proto_rawDescGZIP(), []int{7}
+}
 
 
-func (m *UpdateNodeReq) GetNode() *Node {
-	if m != nil {
-		return m.Node
+func (x *UpdateNodeReq) GetNode() *Node {
+	if x != nil {
+		return x.Node
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
 type UpdateNodeRes struct {
 type UpdateNodeRes struct {
-	Node                 *Node    `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
 
-func (m *UpdateNodeRes) Reset()         { *m = UpdateNodeRes{} }
-func (m *UpdateNodeRes) String() string { return proto.CompactTextString(m) }
-func (*UpdateNodeRes) ProtoMessage()    {}
-func (*UpdateNodeRes) Descriptor() ([]byte, []int) {
-	return fileDescriptor_d13bd996b67da4ef, []int{8}
+	Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"`
 }
 }
 
 
-func (m *UpdateNodeRes) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_UpdateNodeRes.Unmarshal(m, b)
-}
-func (m *UpdateNodeRes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_UpdateNodeRes.Marshal(b, m, deterministic)
-}
-func (m *UpdateNodeRes) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_UpdateNodeRes.Merge(m, src)
+func (x *UpdateNodeRes) Reset() {
+	*x = UpdateNodeRes{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_grpc_node_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 }
-func (m *UpdateNodeRes) XXX_Size() int {
-	return xxx_messageInfo_UpdateNodeRes.Size(m)
+
+func (x *UpdateNodeRes) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 }
-func (m *UpdateNodeRes) XXX_DiscardUnknown() {
-	xxx_messageInfo_UpdateNodeRes.DiscardUnknown(m)
+
+func (*UpdateNodeRes) ProtoMessage() {}
+
+func (x *UpdateNodeRes) ProtoReflect() protoreflect.Message {
+	mi := &file_grpc_node_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 }
 
 
-var xxx_messageInfo_UpdateNodeRes proto.InternalMessageInfo
+// Deprecated: Use UpdateNodeRes.ProtoReflect.Descriptor instead.
+func (*UpdateNodeRes) Descriptor() ([]byte, []int) {
+	return file_grpc_node_proto_rawDescGZIP(), []int{8}
+}
 
 
-func (m *UpdateNodeRes) GetNode() *Node {
-	if m != nil {
-		return m.Node
+func (x *UpdateNodeRes) GetNode() *Node {
+	if x != nil {
+		return x.Node
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
 type ReadNodeReq struct {
 type ReadNodeReq struct {
-	Macaddress           string   `protobuf:"bytes,1,opt,name=macaddress,proto3" json:"macaddress,omitempty"`
-	Network              string   `protobuf:"bytes,2,opt,name=network,proto3" json:"network,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
 
-func (m *ReadNodeReq) Reset()         { *m = ReadNodeReq{} }
-func (m *ReadNodeReq) String() string { return proto.CompactTextString(m) }
-func (*ReadNodeReq) ProtoMessage()    {}
-func (*ReadNodeReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_d13bd996b67da4ef, []int{9}
+	Macaddress string `protobuf:"bytes,1,opt,name=macaddress,proto3" json:"macaddress,omitempty"`
+	Network    string `protobuf:"bytes,2,opt,name=network,proto3" json:"network,omitempty"`
 }
 }
 
 
-func (m *ReadNodeReq) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ReadNodeReq.Unmarshal(m, b)
-}
-func (m *ReadNodeReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ReadNodeReq.Marshal(b, m, deterministic)
-}
-func (m *ReadNodeReq) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ReadNodeReq.Merge(m, src)
+func (x *ReadNodeReq) Reset() {
+	*x = ReadNodeReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_grpc_node_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 }
-func (m *ReadNodeReq) XXX_Size() int {
-	return xxx_messageInfo_ReadNodeReq.Size(m)
+
+func (x *ReadNodeReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 }
-func (m *ReadNodeReq) XXX_DiscardUnknown() {
-	xxx_messageInfo_ReadNodeReq.DiscardUnknown(m)
+
+func (*ReadNodeReq) ProtoMessage() {}
+
+func (x *ReadNodeReq) ProtoReflect() protoreflect.Message {
+	mi := &file_grpc_node_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 }
 
 
-var xxx_messageInfo_ReadNodeReq proto.InternalMessageInfo
+// Deprecated: Use ReadNodeReq.ProtoReflect.Descriptor instead.
+func (*ReadNodeReq) Descriptor() ([]byte, []int) {
+	return file_grpc_node_proto_rawDescGZIP(), []int{9}
+}
 
 
-func (m *ReadNodeReq) GetMacaddress() string {
-	if m != nil {
-		return m.Macaddress
+func (x *ReadNodeReq) GetMacaddress() string {
+	if x != nil {
+		return x.Macaddress
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *ReadNodeReq) GetNetwork() string {
-	if m != nil {
-		return m.Network
+func (x *ReadNodeReq) GetNetwork() string {
+	if x != nil {
+		return x.Network
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
 type ReadNodeRes struct {
 type ReadNodeRes struct {
-	Node                 *Node    `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
 
-func (m *ReadNodeRes) Reset()         { *m = ReadNodeRes{} }
-func (m *ReadNodeRes) String() string { return proto.CompactTextString(m) }
-func (*ReadNodeRes) ProtoMessage()    {}
-func (*ReadNodeRes) Descriptor() ([]byte, []int) {
-	return fileDescriptor_d13bd996b67da4ef, []int{10}
+	Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"`
 }
 }
 
 
-func (m *ReadNodeRes) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ReadNodeRes.Unmarshal(m, b)
-}
-func (m *ReadNodeRes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ReadNodeRes.Marshal(b, m, deterministic)
-}
-func (m *ReadNodeRes) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ReadNodeRes.Merge(m, src)
+func (x *ReadNodeRes) Reset() {
+	*x = ReadNodeRes{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_grpc_node_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 }
-func (m *ReadNodeRes) XXX_Size() int {
-	return xxx_messageInfo_ReadNodeRes.Size(m)
+
+func (x *ReadNodeRes) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 }
-func (m *ReadNodeRes) XXX_DiscardUnknown() {
-	xxx_messageInfo_ReadNodeRes.DiscardUnknown(m)
+
+func (*ReadNodeRes) ProtoMessage() {}
+
+func (x *ReadNodeRes) ProtoReflect() protoreflect.Message {
+	mi := &file_grpc_node_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 }
 
 
-var xxx_messageInfo_ReadNodeRes proto.InternalMessageInfo
+// Deprecated: Use ReadNodeRes.ProtoReflect.Descriptor instead.
+func (*ReadNodeRes) Descriptor() ([]byte, []int) {
+	return file_grpc_node_proto_rawDescGZIP(), []int{10}
+}
 
 
-func (m *ReadNodeRes) GetNode() *Node {
-	if m != nil {
-		return m.Node
+func (x *ReadNodeRes) GetNode() *Node {
+	if x != nil {
+		return x.Node
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
 type DeleteNodeReq struct {
 type DeleteNodeReq struct {
-	Macaddress           string   `protobuf:"bytes,1,opt,name=macaddress,proto3" json:"macaddress,omitempty"`
-	NetworkName          string   `protobuf:"bytes,2,opt,name=networkName,proto3" json:"networkName,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
 
-func (m *DeleteNodeReq) Reset()         { *m = DeleteNodeReq{} }
-func (m *DeleteNodeReq) String() string { return proto.CompactTextString(m) }
-func (*DeleteNodeReq) ProtoMessage()    {}
-func (*DeleteNodeReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_d13bd996b67da4ef, []int{11}
+	Macaddress  string `protobuf:"bytes,1,opt,name=macaddress,proto3" json:"macaddress,omitempty"`
+	NetworkName string `protobuf:"bytes,2,opt,name=networkName,proto3" json:"networkName,omitempty"`
 }
 }
 
 
-func (m *DeleteNodeReq) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_DeleteNodeReq.Unmarshal(m, b)
-}
-func (m *DeleteNodeReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_DeleteNodeReq.Marshal(b, m, deterministic)
-}
-func (m *DeleteNodeReq) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_DeleteNodeReq.Merge(m, src)
+func (x *DeleteNodeReq) Reset() {
+	*x = DeleteNodeReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_grpc_node_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 }
-func (m *DeleteNodeReq) XXX_Size() int {
-	return xxx_messageInfo_DeleteNodeReq.Size(m)
+
+func (x *DeleteNodeReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 }
-func (m *DeleteNodeReq) XXX_DiscardUnknown() {
-	xxx_messageInfo_DeleteNodeReq.DiscardUnknown(m)
+
+func (*DeleteNodeReq) ProtoMessage() {}
+
+func (x *DeleteNodeReq) ProtoReflect() protoreflect.Message {
+	mi := &file_grpc_node_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 }
 
 
-var xxx_messageInfo_DeleteNodeReq proto.InternalMessageInfo
+// Deprecated: Use DeleteNodeReq.ProtoReflect.Descriptor instead.
+func (*DeleteNodeReq) Descriptor() ([]byte, []int) {
+	return file_grpc_node_proto_rawDescGZIP(), []int{11}
+}
 
 
-func (m *DeleteNodeReq) GetMacaddress() string {
-	if m != nil {
-		return m.Macaddress
+func (x *DeleteNodeReq) GetMacaddress() string {
+	if x != nil {
+		return x.Macaddress
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *DeleteNodeReq) GetNetworkName() string {
-	if m != nil {
-		return m.NetworkName
+func (x *DeleteNodeReq) GetNetworkName() string {
+	if x != nil {
+		return x.NetworkName
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
 type DeleteNodeRes struct {
 type DeleteNodeRes struct {
-	Success              bool     `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
 
-func (m *DeleteNodeRes) Reset()         { *m = DeleteNodeRes{} }
-func (m *DeleteNodeRes) String() string { return proto.CompactTextString(m) }
-func (*DeleteNodeRes) ProtoMessage()    {}
-func (*DeleteNodeRes) Descriptor() ([]byte, []int) {
-	return fileDescriptor_d13bd996b67da4ef, []int{12}
+	Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
 }
 }
 
 
-func (m *DeleteNodeRes) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_DeleteNodeRes.Unmarshal(m, b)
-}
-func (m *DeleteNodeRes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_DeleteNodeRes.Marshal(b, m, deterministic)
-}
-func (m *DeleteNodeRes) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_DeleteNodeRes.Merge(m, src)
+func (x *DeleteNodeRes) Reset() {
+	*x = DeleteNodeRes{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_grpc_node_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 }
-func (m *DeleteNodeRes) XXX_Size() int {
-	return xxx_messageInfo_DeleteNodeRes.Size(m)
+
+func (x *DeleteNodeRes) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 }
-func (m *DeleteNodeRes) XXX_DiscardUnknown() {
-	xxx_messageInfo_DeleteNodeRes.DiscardUnknown(m)
+
+func (*DeleteNodeRes) ProtoMessage() {}
+
+func (x *DeleteNodeRes) ProtoReflect() protoreflect.Message {
+	mi := &file_grpc_node_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 }
 
 
-var xxx_messageInfo_DeleteNodeRes proto.InternalMessageInfo
+// Deprecated: Use DeleteNodeRes.ProtoReflect.Descriptor instead.
+func (*DeleteNodeRes) Descriptor() ([]byte, []int) {
+	return file_grpc_node_proto_rawDescGZIP(), []int{12}
+}
 
 
-func (m *DeleteNodeRes) GetSuccess() bool {
-	if m != nil {
-		return m.Success
+func (x *DeleteNodeRes) GetSuccess() bool {
+	if x != nil {
+		return x.Success
 	}
 	}
 	return false
 	return false
 }
 }
 
 
 type GetPeersReq struct {
 type GetPeersReq struct {
-	Macaddress           string   `protobuf:"bytes,1,opt,name=macaddress,proto3" json:"macaddress,omitempty"`
-	Network              string   `protobuf:"bytes,2,opt,name=network,proto3" json:"network,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
 
-func (m *GetPeersReq) Reset()         { *m = GetPeersReq{} }
-func (m *GetPeersReq) String() string { return proto.CompactTextString(m) }
-func (*GetPeersReq) ProtoMessage()    {}
-func (*GetPeersReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_d13bd996b67da4ef, []int{13}
+	Macaddress string `protobuf:"bytes,1,opt,name=macaddress,proto3" json:"macaddress,omitempty"`
+	Network    string `protobuf:"bytes,2,opt,name=network,proto3" json:"network,omitempty"`
 }
 }
 
 
-func (m *GetPeersReq) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetPeersReq.Unmarshal(m, b)
-}
-func (m *GetPeersReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetPeersReq.Marshal(b, m, deterministic)
-}
-func (m *GetPeersReq) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetPeersReq.Merge(m, src)
+func (x *GetPeersReq) Reset() {
+	*x = GetPeersReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_grpc_node_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 }
-func (m *GetPeersReq) XXX_Size() int {
-	return xxx_messageInfo_GetPeersReq.Size(m)
+
+func (x *GetPeersReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 }
-func (m *GetPeersReq) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetPeersReq.DiscardUnknown(m)
+
+func (*GetPeersReq) ProtoMessage() {}
+
+func (x *GetPeersReq) ProtoReflect() protoreflect.Message {
+	mi := &file_grpc_node_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 }
 
 
-var xxx_messageInfo_GetPeersReq proto.InternalMessageInfo
+// Deprecated: Use GetPeersReq.ProtoReflect.Descriptor instead.
+func (*GetPeersReq) Descriptor() ([]byte, []int) {
+	return file_grpc_node_proto_rawDescGZIP(), []int{13}
+}
 
 
-func (m *GetPeersReq) GetMacaddress() string {
-	if m != nil {
-		return m.Macaddress
+func (x *GetPeersReq) GetMacaddress() string {
+	if x != nil {
+		return x.Macaddress
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
-func (m *GetPeersReq) GetNetwork() string {
-	if m != nil {
-		return m.Network
+func (x *GetPeersReq) GetNetwork() string {
+	if x != nil {
+		return x.Network
 	}
 	}
 	return ""
 	return ""
 }
 }
 
 
 type GetPeersRes struct {
 type GetPeersRes struct {
-	Peers                *PeersResponse `protobuf:"bytes,1,opt,name=peers,proto3" json:"peers,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
-	XXX_unrecognized     []byte         `json:"-"`
-	XXX_sizecache        int32          `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
 
-func (m *GetPeersRes) Reset()         { *m = GetPeersRes{} }
-func (m *GetPeersRes) String() string { return proto.CompactTextString(m) }
-func (*GetPeersRes) ProtoMessage()    {}
-func (*GetPeersRes) Descriptor() ([]byte, []int) {
-	return fileDescriptor_d13bd996b67da4ef, []int{14}
+	Peers *PeersResponse `protobuf:"bytes,1,opt,name=peers,proto3" json:"peers,omitempty"`
 }
 }
 
 
-func (m *GetPeersRes) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetPeersRes.Unmarshal(m, b)
-}
-func (m *GetPeersRes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetPeersRes.Marshal(b, m, deterministic)
-}
-func (m *GetPeersRes) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetPeersRes.Merge(m, src)
+func (x *GetPeersRes) Reset() {
+	*x = GetPeersRes{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_grpc_node_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 }
-func (m *GetPeersRes) XXX_Size() int {
-	return xxx_messageInfo_GetPeersRes.Size(m)
+
+func (x *GetPeersRes) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 }
-func (m *GetPeersRes) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetPeersRes.DiscardUnknown(m)
+
+func (*GetPeersRes) ProtoMessage() {}
+
+func (x *GetPeersRes) ProtoReflect() protoreflect.Message {
+	mi := &file_grpc_node_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 }
 
 
-var xxx_messageInfo_GetPeersRes proto.InternalMessageInfo
+// Deprecated: Use GetPeersRes.ProtoReflect.Descriptor instead.
+func (*GetPeersRes) Descriptor() ([]byte, []int) {
+	return file_grpc_node_proto_rawDescGZIP(), []int{14}
+}
 
 
-func (m *GetPeersRes) GetPeers() *PeersResponse {
-	if m != nil {
-		return m.Peers
+func (x *GetPeersRes) GetPeers() *PeersResponse {
+	if x != nil {
+		return x.Peers
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
 type CheckInReq struct {
 type CheckInReq struct {
-	Node                 *Node    `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
 
-func (m *CheckInReq) Reset()         { *m = CheckInReq{} }
-func (m *CheckInReq) String() string { return proto.CompactTextString(m) }
-func (*CheckInReq) ProtoMessage()    {}
-func (*CheckInReq) Descriptor() ([]byte, []int) {
-	return fileDescriptor_d13bd996b67da4ef, []int{15}
+	Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` //   bool postchanges = 2;
 }
 }
 
 
-func (m *CheckInReq) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_CheckInReq.Unmarshal(m, b)
-}
-func (m *CheckInReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_CheckInReq.Marshal(b, m, deterministic)
-}
-func (m *CheckInReq) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CheckInReq.Merge(m, src)
+func (x *CheckInReq) Reset() {
+	*x = CheckInReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_grpc_node_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 }
-func (m *CheckInReq) XXX_Size() int {
-	return xxx_messageInfo_CheckInReq.Size(m)
+
+func (x *CheckInReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 }
-func (m *CheckInReq) XXX_DiscardUnknown() {
-	xxx_messageInfo_CheckInReq.DiscardUnknown(m)
+
+func (*CheckInReq) ProtoMessage() {}
+
+func (x *CheckInReq) ProtoReflect() protoreflect.Message {
+	mi := &file_grpc_node_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 }
 
 
-var xxx_messageInfo_CheckInReq proto.InternalMessageInfo
+// Deprecated: Use CheckInReq.ProtoReflect.Descriptor instead.
+func (*CheckInReq) Descriptor() ([]byte, []int) {
+	return file_grpc_node_proto_rawDescGZIP(), []int{15}
+}
 
 
-func (m *CheckInReq) GetNode() *Node {
-	if m != nil {
-		return m.Node
+func (x *CheckInReq) GetNode() *Node {
+	if x != nil {
+		return x.Node
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
 type CheckInRes struct {
 type CheckInRes struct {
-	Checkinresponse      *CheckInResponse `protobuf:"bytes,1,opt,name=checkinresponse,proto3" json:"checkinresponse,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
-	XXX_unrecognized     []byte           `json:"-"`
-	XXX_sizecache        int32            `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
 
-func (m *CheckInRes) Reset()         { *m = CheckInRes{} }
-func (m *CheckInRes) String() string { return proto.CompactTextString(m) }
-func (*CheckInRes) ProtoMessage()    {}
-func (*CheckInRes) Descriptor() ([]byte, []int) {
-	return fileDescriptor_d13bd996b67da4ef, []int{16}
+	Checkinresponse *CheckInResponse `protobuf:"bytes,1,opt,name=checkinresponse,proto3" json:"checkinresponse,omitempty"`
 }
 }
 
 
-func (m *CheckInRes) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_CheckInRes.Unmarshal(m, b)
-}
-func (m *CheckInRes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_CheckInRes.Marshal(b, m, deterministic)
-}
-func (m *CheckInRes) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CheckInRes.Merge(m, src)
+func (x *CheckInRes) Reset() {
+	*x = CheckInRes{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_grpc_node_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 }
-func (m *CheckInRes) XXX_Size() int {
-	return xxx_messageInfo_CheckInRes.Size(m)
+
+func (x *CheckInRes) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
 }
-func (m *CheckInRes) XXX_DiscardUnknown() {
-	xxx_messageInfo_CheckInRes.DiscardUnknown(m)
+
+func (*CheckInRes) ProtoMessage() {}
+
+func (x *CheckInRes) ProtoReflect() protoreflect.Message {
+	mi := &file_grpc_node_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 }
 
 
-var xxx_messageInfo_CheckInRes proto.InternalMessageInfo
+// Deprecated: Use CheckInRes.ProtoReflect.Descriptor instead.
+func (*CheckInRes) Descriptor() ([]byte, []int) {
+	return file_grpc_node_proto_rawDescGZIP(), []int{16}
+}
 
 
-func (m *CheckInRes) GetCheckinresponse() *CheckInResponse {
-	if m != nil {
-		return m.Checkinresponse
+func (x *CheckInRes) GetCheckinresponse() *CheckInResponse {
+	if x != nil {
+		return x.Checkinresponse
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
-func init() {
-	proto.RegisterType((*LoginRequest)(nil), "node.LoginRequest")
-	proto.RegisterType((*LoginResponse)(nil), "node.LoginResponse")
-	proto.RegisterType((*Node)(nil), "node.Node")
-	proto.RegisterType((*CheckInResponse)(nil), "node.CheckInResponse")
-	proto.RegisterType((*PeersResponse)(nil), "node.PeersResponse")
-	proto.RegisterType((*CreateNodeReq)(nil), "node.CreateNodeReq")
-	proto.RegisterType((*CreateNodeRes)(nil), "node.CreateNodeRes")
-	proto.RegisterType((*UpdateNodeReq)(nil), "node.UpdateNodeReq")
-	proto.RegisterType((*UpdateNodeRes)(nil), "node.UpdateNodeRes")
-	proto.RegisterType((*ReadNodeReq)(nil), "node.ReadNodeReq")
-	proto.RegisterType((*ReadNodeRes)(nil), "node.ReadNodeRes")
-	proto.RegisterType((*DeleteNodeReq)(nil), "node.DeleteNodeReq")
-	proto.RegisterType((*DeleteNodeRes)(nil), "node.DeleteNodeRes")
-	proto.RegisterType((*GetPeersReq)(nil), "node.GetPeersReq")
-	proto.RegisterType((*GetPeersRes)(nil), "node.GetPeersRes")
-	proto.RegisterType((*CheckInReq)(nil), "node.CheckInReq")
-	proto.RegisterType((*CheckInRes)(nil), "node.CheckInRes")
-}
-
-func init() { proto.RegisterFile("grpc/node.proto", fileDescriptor_d13bd996b67da4ef) }
-
-var fileDescriptor_d13bd996b67da4ef = []byte{
-	// 915 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0x5f, 0x6f, 0x23, 0x35,
-	0x10, 0x57, 0x72, 0x4d, 0x93, 0x4e, 0x9a, 0xb6, 0xe7, 0x72, 0x87, 0x89, 0x50, 0x15, 0xad, 0x10,
-	0xea, 0x21, 0xda, 0x94, 0x22, 0x21, 0xde, 0x90, 0x38, 0xa4, 0x13, 0x12, 0x9c, 0x60, 0x11, 0x2f,
-	0xbc, 0xb9, 0xeb, 0xc9, 0xde, 0x2a, 0x5b, 0x7b, 0xbb, 0xde, 0x34, 0xea, 0x07, 0x40, 0x7c, 0x5d,
-	0x3e, 0x00, 0x0f, 0xc8, 0x63, 0x6f, 0xd6, 0xbb, 0x0d, 0xed, 0x71, 0x7d, 0x5b, 0xff, 0x3c, 0x7f,
-	0x3c, 0xbf, 0xf9, 0x8d, 0xd7, 0x70, 0x98, 0x96, 0x45, 0x32, 0x57, 0x5a, 0xe2, 0x79, 0x51, 0xea,
-	0x4a, 0xb3, 0x1d, 0xfb, 0x1d, 0x49, 0xd8, 0xff, 0x49, 0xa7, 0x99, 0x8a, 0xf1, 0x66, 0x85, 0xa6,
-	0x62, 0x27, 0x00, 0xd7, 0x22, 0x11, 0x52, 0x96, 0x68, 0x0c, 0xef, 0xcd, 0x7a, 0xa7, 0x7b, 0x71,
-	0x80, 0xb0, 0x29, 0x8c, 0x0a, 0x61, 0xcc, 0x5a, 0x97, 0x92, 0xf7, 0x69, 0x77, 0xb3, 0x66, 0x1c,
-	0x86, 0x0a, 0xab, 0xb5, 0x2e, 0x97, 0xfc, 0x19, 0x6d, 0xd5, 0xcb, 0xe8, 0x2b, 0x98, 0xf8, 0x2c,
-	0xa6, 0xd0, 0xca, 0x20, 0x9b, 0xc1, 0x58, 0x24, 0x09, 0x1a, 0x53, 0xe9, 0x25, 0x2a, 0x9f, 0x27,
-	0x84, 0xa2, 0xbf, 0x07, 0xb0, 0xf3, 0x56, 0x4b, 0x64, 0x07, 0xd0, 0xcf, 0xa4, 0xb7, 0xe8, 0x67,
-	0x92, 0x31, 0xd8, 0x51, 0xe2, 0x1a, 0x7d, 0x76, 0xfa, 0xb6, 0x99, 0xeb, 0x23, 0xfb, 0xcc, 0xf5,
-	0x79, 0x4f, 0x00, 0xf2, 0xcc, 0x54, 0xa8, 0x0a, 0x5d, 0x56, 0x7c, 0x67, 0xd6, 0x3b, 0x1d, 0xc4,
-	0x01, 0xc2, 0x3e, 0x85, 0xbd, 0x62, 0x75, 0x95, 0x67, 0xc9, 0x12, 0xef, 0xf8, 0x80, 0x7c, 0x1b,
-	0xc0, 0x56, 0x8b, 0x4a, 0x16, 0x3a, 0x53, 0x15, 0xdf, 0x75, 0xd5, 0xd6, 0xeb, 0x0e, 0x53, 0xc3,
-	0x07, 0x99, 0x1a, 0x75, 0x98, 0x9a, 0xc1, 0xd8, 0xb2, 0x5f, 0xb3, 0xb5, 0xe7, 0xca, 0x0f, 0x20,
-	0x7b, 0xae, 0xcc, 0x14, 0xa8, 0x64, 0xa6, 0x52, 0x0e, 0xb3, 0xde, 0xe9, 0x28, 0x6e, 0x00, 0xf6,
-	0x12, 0x76, 0x0b, 0x6d, 0xaa, 0x55, 0xc1, 0xc7, 0xe4, 0xea, 0x57, 0x94, 0x53, 0x9b, 0x4a, 0xea,
-	0xb5, 0xe2, 0xfb, 0x3e, 0xa7, 0x5f, 0xdb, 0x88, 0x4b, 0xc4, 0x42, 0xe4, 0xd9, 0x2d, 0xf2, 0x09,
-	0x11, 0xd1, 0x00, 0xb6, 0x1a, 0x23, 0x6e, 0x31, 0xd1, 0x6a, 0x91, 0xa5, 0xfc, 0x80, 0x12, 0x06,
-	0x88, 0xf5, 0x76, 0xdd, 0xb1, 0x3c, 0x1d, 0x3a, 0x9e, 0x36, 0x00, 0x9d, 0x56, 0x55, 0x58, 0x2e,
-	0x44, 0x82, 0xfc, 0xc8, 0xed, 0x6e, 0x00, 0x5b, 0x6d, 0x2e, 0x4c, 0x95, 0xbc, 0xc3, 0x64, 0x99,
-	0x29, 0xfe, 0xdc, 0x55, 0x1b, 0x40, 0x2c, 0x82, 0x7d, 0xbb, 0xbc, 0xd6, 0x32, 0x5b, 0x64, 0x28,
-	0x39, 0x23, 0x93, 0x16, 0xc6, 0x4e, 0xe1, 0xd0, 0x9b, 0x53, 0xe4, 0x5b, 0x91, 0xf3, 0x63, 0xaa,
-	0xa2, 0x0b, 0x53, 0x34, 0x9d, 0x88, 0xbc, 0xee, 0xcd, 0x47, 0x3e, 0x5a, 0x80, 0xd9, 0x33, 0x59,
-	0x66, 0x92, 0x77, 0x42, 0xa5, 0x68, 0xf8, 0x0b, 0x77, 0xa6, 0x00, 0xb2, 0x8c, 0x88, 0x3c, 0xd7,
-	0x6b, 0x94, 0x59, 0x61, 0xf8, 0x4b, 0xd7, 0xdf, 0x06, 0xb1, 0x9a, 0xcb, 0x0c, 0xc5, 0xe4, 0x1f,
-	0x13, 0x5d, 0xf5, 0xd2, 0x76, 0x47, 0x2a, 0xa3, 0x17, 0x0b, 0xce, 0x69, 0xc3, 0xaf, 0x48, 0x8b,
-	0xd6, 0xa0, 0xb4, 0x09, 0xf8, 0x27, 0x2e, 0x62, 0x83, 0x44, 0x7f, 0xf6, 0xe1, 0xf0, 0xb5, 0xad,
-	0xe5, 0xc7, 0x66, 0x50, 0x38, 0x0c, 0xcd, 0x8a, 0x78, 0xa6, 0x11, 0x18, 0xc5, 0xf5, 0x92, 0x7d,
-	0x0e, 0x07, 0x0a, 0x51, 0x16, 0x88, 0xe5, 0xaa, 0x90, 0xa2, 0x72, 0x13, 0x31, 0x8a, 0x3b, 0x28,
-	0xfb, 0x02, 0x8e, 0x2c, 0xe2, 0xfa, 0xe8, 0x2d, 0x9f, 0x91, 0xe5, 0x3d, 0xbc, 0xd6, 0xe5, 0x35,
-	0x1a, 0x23, 0x52, 0xa4, 0x71, 0xf1, 0xba, 0xf4, 0x50, 0x5b, 0x97, 0x83, 0xae, 0x2e, 0x3f, 0x83,
-	0x89, 0x8d, 0xb9, 0xc4, 0x3b, 0x9f, 0x68, 0x97, 0x2c, 0xda, 0xa0, 0xe5, 0xc1, 0x02, 0x12, 0x73,
-	0xac, 0x90, 0x26, 0x67, 0x14, 0x07, 0x48, 0xf4, 0x57, 0x1f, 0x26, 0xbf, 0x20, 0x96, 0x66, 0xc3,
-	0x02, 0x65, 0x4d, 0x45, 0x85, 0x6b, 0x71, 0xe7, 0x79, 0x68, 0x00, 0xdb, 0x6f, 0xff, 0xe9, 0x98,
-	0x75, 0x37, 0x43, 0x0b, 0x7b, 0xc2, 0x9c, 0x7f, 0xf8, 0xdd, 0xd2, 0xd5, 0xe1, 0x70, 0x8b, 0x0e,
-	0x1f, 0x9c, 0xca, 0x68, 0x0e, 0x93, 0xd7, 0x25, 0x8a, 0x0a, 0xed, 0x4d, 0x18, 0xe3, 0x0d, 0x3b,
-	0x01, 0xba, 0xb6, 0x89, 0x83, 0xf1, 0x25, 0x9c, 0xd3, 0x7d, 0x4e, 0x9b, 0xee, 0x3a, 0xef, 0x38,
-	0x98, 0xf7, 0x71, 0xf8, 0x9d, 0xba, 0xf2, 0x3f, 0x32, 0x84, 0x0e, 0x8f, 0x67, 0x78, 0x03, 0xe3,
-	0x18, 0x85, 0x6c, 0xe2, 0x3f, 0xfc, 0x83, 0x09, 0x7e, 0x22, 0xfd, 0xf6, 0x4f, 0xe4, 0x2c, 0x0c,
-	0xf4, 0x78, 0xde, 0x5f, 0x61, 0xf2, 0x03, 0xe9, 0xe9, 0x7d, 0x33, 0x5b, 0xf1, 0xbb, 0x54, 0x6f,
-	0x9b, 0xff, 0x4b, 0x08, 0x45, 0xaf, 0xda, 0x21, 0xcd, 0x7f, 0x4f, 0xa7, 0xad, 0xfa, 0x0d, 0x56,
-	0x5e, 0xc5, 0x4f, 0xa9, 0xfa, 0xdb, 0x30, 0x90, 0x61, 0xaf, 0x60, 0x60, 0x67, 0xdb, 0xf8, 0xb2,
-	0x8f, 0x5d, 0xd9, 0xad, 0x69, 0x89, 0x9d, 0x45, 0xf4, 0x25, 0xc0, 0xe6, 0x36, 0x79, 0xbc, 0xaf,
-	0x3f, 0x07, 0xd6, 0x86, 0x7d, 0xb7, 0xb9, 0x6c, 0x4b, 0x1f, 0xd5, 0x3b, 0xbe, 0x70, 0x8e, 0x9d,
-	0x6b, 0x2a, 0xee, 0x5a, 0x5f, 0xfe, 0xd3, 0x87, 0xb1, 0x8d, 0xfe, 0x1b, 0x96, 0xb7, 0x59, 0x82,
-	0xec, 0x02, 0x06, 0xf4, 0x02, 0x60, 0xcc, 0x05, 0x08, 0x1f, 0x1d, 0xd3, 0xe3, 0x16, 0xe6, 0x67,
-	0xfe, 0x1b, 0x80, 0x46, 0xca, 0xcc, 0x9b, 0xb4, 0xa6, 0x61, 0xba, 0x05, 0x34, 0xec, 0x02, 0x46,
-	0xb5, 0x4c, 0xd8, 0x73, 0x67, 0x10, 0xe8, 0x6f, 0x7a, 0x0f, 0x32, 0x36, 0x53, 0x23, 0xe9, 0x3a,
-	0x53, 0x6b, 0x2a, 0xa6, 0x5b, 0x40, 0xf2, 0x6b, 0xe4, 0x50, 0xfb, 0xb5, 0x34, 0x37, 0xdd, 0x02,
-	0x1a, 0x76, 0x09, 0xa3, 0xba, 0xa5, 0xf5, 0x09, 0x03, 0xad, 0x4c, 0xef, 0x41, 0xe6, 0xa2, 0xc7,
-	0xce, 0x60, 0xe8, 0x39, 0x67, 0x47, 0x9d, 0x16, 0xdc, 0x4c, 0xbb, 0x88, 0xf9, 0x7e, 0xfe, 0xc7,
-	0x59, 0xaa, 0x75, 0x9a, 0xe3, 0x79, 0xaa, 0x73, 0xa1, 0xd2, 0x73, 0x5d, 0xa6, 0x73, 0x7a, 0xf7,
-	0x5d, 0xad, 0x16, 0xf3, 0xea, 0xae, 0x40, 0x33, 0x5f, 0x2a, 0xbd, 0x56, 0xf4, 0x22, 0x2c, 0xae,
-	0xae, 0x76, 0x69, 0xf3, 0xeb, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x0e, 0xb4, 0x28, 0x5a, 0x27,
-	0x0a, 0x00, 0x00,
+var File_grpc_node_proto protoreflect.FileDescriptor
+
+var file_grpc_node_proto_rawDesc = []byte{
+	0x0a, 0x0f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x12, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x22, 0x64, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x69, 0x6e,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x61, 0x64,
+	0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x61, 0x63,
+	0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,
+	0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77,
+	0x6f, 0x72, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x31, 0x0a,
+	0x0d, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20,
+	0x0a, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x74, 0x6f, 0x6b, 0x65, 0x6e,
+	0x22, 0xae, 0x06, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
+	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a,
+	0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
+	0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x64, 0x64, 0x72, 0x65,
+	0x73, 0x73, 0x36, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x64, 0x64, 0x72, 0x65,
+	0x73, 0x73, 0x36, 0x12, 0x1e, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x70, 0x6f, 0x72,
+	0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x70,
+	0x6f, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x6b, 0x65, 0x79,
+	0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x6b, 0x65,
+	0x79, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x06, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1e, 0x0a,
+	0x0a, 0x6d, 0x61, 0x63, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0a, 0x6d, 0x61, 0x63, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a,
+	0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x6f, 0x64,
+	0x65, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,
+	0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x1c, 0x0a, 0x09, 0x69,
+	0x73, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09,
+	0x69, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x73,
+	0x74, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6f, 0x73, 0x74, 0x75,
+	0x70, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x0c, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1c, 0x0a,
+	0x09, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05,
+	0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73,
+	0x61, 0x76, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52,
+	0x0a, 0x73, 0x61, 0x76, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x61,
+	0x63, 0x63, 0x65, 0x73, 0x73, 0x6b, 0x65, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
+	0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x63,
+	0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61,
+	0x73, 0x74, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x6c, 0x61, 0x73,
+	0x74, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0c, 0x6c, 0x61, 0x73, 0x74, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x28, 0x0a,
+	0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c,
+	0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x6c,
+	0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c,
+	0x6f, 0x63, 0x61, 0x6c, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70,
+	0x6f, 0x73, 0x74, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0b, 0x70, 0x6f, 0x73, 0x74, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x1e, 0x0a,
+	0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x69, 0x70, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x69, 0x70, 0x73, 0x12, 0x18, 0x0a,
+	0x07, 0x69, 0x73, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07,
+	0x69, 0x73, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x64, 0x75, 0x61,
+	0x6c, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73,
+	0x64, 0x75, 0x61, 0x6c, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6e, 0x73,
+	0x6f, 0x66, 0x66, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x6e, 0x73, 0x6f, 0x66,
+	0x66, 0x12, 0x1e, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18,
+	0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x72, 0x61, 0x6e, 0x67,
+	0x65, 0x22, 0x85, 0x02, 0x0a, 0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12,
+	0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x65, 0x64, 0x70, 0x65, 0x65, 0x72, 0x75, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x65, 0x65, 0x64, 0x70, 0x65, 0x65,
+	0x72, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x6e, 0x65, 0x65, 0x64, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x08, 0x52, 0x10, 0x6e, 0x65, 0x65, 0x64, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x6d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x69,
+	0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x70, 0x65, 0x6e, 0x64,
+	0x69, 0x6e, 0x67, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x65, 0x65, 0x64, 0x6b, 0x65, 0x79, 0x75, 0x70,
+	0x64, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x6e, 0x65, 0x65, 0x64,
+	0x6b, 0x65, 0x79, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x65, 0x65,
+	0x64, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x6e,
+	0x65, 0x65, 0x64, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0xa3, 0x02, 0x0a, 0x0d, 0x50, 0x65,
+	0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69,
+	0x73, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09,
+	0x69, 0x73, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x61, 0x74,
+	0x65, 0x77, 0x61, 0x79, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0c, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a,
+	0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x65,
+	0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65,
+	0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65,
+	0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,
+	0x73, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x36, 0x18, 0x08, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x36, 0x12, 0x1e, 0x0a,
+	0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x05, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x22, 0x0a,
+	0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,
+	0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x0d,
+	0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x22,
+	0x2f, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71,
+	0x12, 0x1e, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a,
+	0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65,
+	0x22, 0x2f, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65,
+	0x73, 0x12, 0x1e, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x0a, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64,
+	0x65, 0x22, 0x2f, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52,
+	0x65, 0x71, 0x12, 0x1e, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x0a, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f,
+	0x64, 0x65, 0x22, 0x2f, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65,
+	0x52, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x0a, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e,
+	0x6f, 0x64, 0x65, 0x22, 0x47, 0x0a, 0x0b, 0x52, 0x65, 0x61, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52,
+	0x65, 0x71, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x61, 0x63, 0x61, 0x64, 0x64, 0x72, 0x65,
+	0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x2d, 0x0a, 0x0b,
+	0x52, 0x65, 0x61, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x04, 0x6e,
+	0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x6e, 0x6f, 0x64, 0x65,
+	0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x22, 0x51, 0x0a, 0x0d, 0x44,
+	0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x0a,
+	0x6d, 0x61, 0x63, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0a, 0x6d, 0x61, 0x63, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x0a, 0x0b,
+	0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x29,
+	0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x12,
+	0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08,
+	0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x47, 0x0a, 0x0b, 0x47, 0x65, 0x74,
+	0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x61,
+	0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x61,
+	0x63, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77,
+	0x6f, 0x72, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f,
+	0x72, 0x6b, 0x22, 0x38, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65,
+	0x73, 0x12, 0x29, 0x0a, 0x05, 0x70, 0x65, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x13, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x70, 0x65, 0x65, 0x72, 0x73, 0x22, 0x2c, 0x0a, 0x0a,
+	0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x04, 0x6e, 0x6f,
+	0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e,
+	0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x22, 0x4d, 0x0a, 0x0a, 0x43, 0x68,
+	0x65, 0x63, 0x6b, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0f, 0x63, 0x68, 0x65, 0x63,
+	0x6b, 0x69, 0x6e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x15, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69,
+	0x6e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xfc, 0x02, 0x0a, 0x0b, 0x4e, 0x6f,
+	0x64, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x4c, 0x6f, 0x67,
+	0x69, 0x6e, 0x12, 0x12, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x4c, 0x6f,
+	0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0a, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x13, 0x2e, 0x6e, 0x6f, 0x64, 0x65,
+	0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13,
+	0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65,
+	0x52, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x12,
+	0x11, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52,
+	0x65, 0x71, 0x1a, 0x11, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x4e, 0x6f,
+	0x64, 0x65, 0x52, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e,
+	0x6f, 0x64, 0x65, 0x12, 0x13, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e,
+	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x12, 0x36, 0x0a,
+	0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x13, 0x2e, 0x6e, 0x6f,
+	0x64, 0x65, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71,
+	0x1a, 0x13, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f,
+	0x64, 0x65, 0x52, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72,
+	0x73, 0x12, 0x11, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x65, 0x65, 0x72,
+	0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x50,
+	0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x30, 0x01, 0x12, 0x2d, 0x0a, 0x07, 0x43, 0x68, 0x65,
+	0x63, 0x6b, 0x49, 0x6e, 0x12, 0x10, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x68, 0x65, 0x63,
+	0x6b, 0x49, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x43, 0x68,
+	0x65, 0x63, 0x6b, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x6b, 0x6e, 0x6f,
+	0x77, 0x6e, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x33,
+}
+
+var (
+	file_grpc_node_proto_rawDescOnce sync.Once
+	file_grpc_node_proto_rawDescData = file_grpc_node_proto_rawDesc
+)
+
+func file_grpc_node_proto_rawDescGZIP() []byte {
+	file_grpc_node_proto_rawDescOnce.Do(func() {
+		file_grpc_node_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_node_proto_rawDescData)
+	})
+	return file_grpc_node_proto_rawDescData
+}
+
+var file_grpc_node_proto_msgTypes = make([]protoimpl.MessageInfo, 17)
+var file_grpc_node_proto_goTypes = []interface{}{
+	(*LoginRequest)(nil),    // 0: node.LoginRequest
+	(*LoginResponse)(nil),   // 1: node.LoginResponse
+	(*Node)(nil),            // 2: node.Node
+	(*CheckInResponse)(nil), // 3: node.CheckInResponse
+	(*PeersResponse)(nil),   // 4: node.PeersResponse
+	(*CreateNodeReq)(nil),   // 5: node.CreateNodeReq
+	(*CreateNodeRes)(nil),   // 6: node.CreateNodeRes
+	(*UpdateNodeReq)(nil),   // 7: node.UpdateNodeReq
+	(*UpdateNodeRes)(nil),   // 8: node.UpdateNodeRes
+	(*ReadNodeReq)(nil),     // 9: node.ReadNodeReq
+	(*ReadNodeRes)(nil),     // 10: node.ReadNodeRes
+	(*DeleteNodeReq)(nil),   // 11: node.DeleteNodeReq
+	(*DeleteNodeRes)(nil),   // 12: node.DeleteNodeRes
+	(*GetPeersReq)(nil),     // 13: node.GetPeersReq
+	(*GetPeersRes)(nil),     // 14: node.GetPeersRes
+	(*CheckInReq)(nil),      // 15: node.CheckInReq
+	(*CheckInRes)(nil),      // 16: node.CheckInRes
+}
+var file_grpc_node_proto_depIdxs = []int32{
+	2,  // 0: node.CreateNodeReq.node:type_name -> node.Node
+	2,  // 1: node.CreateNodeRes.node:type_name -> node.Node
+	2,  // 2: node.UpdateNodeReq.node:type_name -> node.Node
+	2,  // 3: node.UpdateNodeRes.node:type_name -> node.Node
+	2,  // 4: node.ReadNodeRes.node:type_name -> node.Node
+	4,  // 5: node.GetPeersRes.peers:type_name -> node.PeersResponse
+	2,  // 6: node.CheckInReq.node:type_name -> node.Node
+	3,  // 7: node.CheckInRes.checkinresponse:type_name -> node.CheckInResponse
+	0,  // 8: node.NodeService.Login:input_type -> node.LoginRequest
+	5,  // 9: node.NodeService.CreateNode:input_type -> node.CreateNodeReq
+	9,  // 10: node.NodeService.ReadNode:input_type -> node.ReadNodeReq
+	7,  // 11: node.NodeService.UpdateNode:input_type -> node.UpdateNodeReq
+	11, // 12: node.NodeService.DeleteNode:input_type -> node.DeleteNodeReq
+	13, // 13: node.NodeService.GetPeers:input_type -> node.GetPeersReq
+	15, // 14: node.NodeService.CheckIn:input_type -> node.CheckInReq
+	1,  // 15: node.NodeService.Login:output_type -> node.LoginResponse
+	6,  // 16: node.NodeService.CreateNode:output_type -> node.CreateNodeRes
+	10, // 17: node.NodeService.ReadNode:output_type -> node.ReadNodeRes
+	8,  // 18: node.NodeService.UpdateNode:output_type -> node.UpdateNodeRes
+	12, // 19: node.NodeService.DeleteNode:output_type -> node.DeleteNodeRes
+	14, // 20: node.NodeService.GetPeers:output_type -> node.GetPeersRes
+	16, // 21: node.NodeService.CheckIn:output_type -> node.CheckInRes
+	15, // [15:22] is the sub-list for method output_type
+	8,  // [8:15] is the sub-list for method input_type
+	8,  // [8:8] is the sub-list for extension type_name
+	8,  // [8:8] is the sub-list for extension extendee
+	0,  // [0:8] is the sub-list for field type_name
+}
+
+func init() { file_grpc_node_proto_init() }
+func file_grpc_node_proto_init() {
+	if File_grpc_node_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_grpc_node_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LoginRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_grpc_node_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*LoginResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_grpc_node_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Node); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_grpc_node_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CheckInResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_grpc_node_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*PeersResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_grpc_node_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreateNodeReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_grpc_node_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CreateNodeRes); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_grpc_node_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UpdateNodeReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_grpc_node_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UpdateNodeRes); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_grpc_node_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReadNodeReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_grpc_node_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ReadNodeRes); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_grpc_node_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteNodeReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_grpc_node_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DeleteNodeRes); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_grpc_node_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetPeersReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_grpc_node_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetPeersRes); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_grpc_node_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CheckInReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_grpc_node_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CheckInRes); 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{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_grpc_node_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   17,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_grpc_node_proto_goTypes,
+		DependencyIndexes: file_grpc_node_proto_depIdxs,
+		MessageInfos:      file_grpc_node_proto_msgTypes,
+	}.Build()
+	File_grpc_node_proto = out.File
+	file_grpc_node_proto_rawDesc = nil
+	file_grpc_node_proto_goTypes = nil
+	file_grpc_node_proto_depIdxs = nil
 }
 }

+ 3 - 0
grpc/node.proto

@@ -24,6 +24,7 @@ message Node {
     string id = 1;
     string id = 1;
     string name = 2;
     string name = 2;
     string address = 3;
     string address = 3;
+    string address6 = 26;
     int32 listenport = 4;
     int32 listenport = 4;
     string publickey = 5;
     string publickey = 5;
     string endpoint = 6;
     string endpoint = 6;
@@ -44,6 +45,7 @@ message Node {
     string postchanges = 21;
     string postchanges = 21;
     string allowedips = 22;
     string allowedips = 22;
     bool islocal = 23;
     bool islocal = 23;
+    bool isdualstack = 27;
     bool dnsoff = 24;
     bool dnsoff = 24;
     string localrange = 25;
     string localrange = 25;
 }
 }
@@ -64,6 +66,7 @@ message PeersResponse {
     string publickey = 5;
     string publickey = 5;
     string endpoint = 6;
     string endpoint = 6;
     string address = 3;
     string address = 3;
+    string address6 = 8;
     int32 listenport = 4;
     int32 listenport = 4;
     string localaddress = 7;
     string localaddress = 7;
     int32 keepalive = 13;
     int32 keepalive = 13;

+ 1 - 0
models/structs.go

@@ -94,6 +94,7 @@ type PeersResponse struct {
     PublicKey string `json:"publickey" bson:"publickey"`
     PublicKey string `json:"publickey" bson:"publickey"`
     Endpoint string `json:"endpoint" bson:"endpoint"`
     Endpoint string `json:"endpoint" bson:"endpoint"`
     Address string `json:"address" bson:"address"`
     Address string `json:"address" bson:"address"`
+    Address6 string `json:"address6" bson:"address6"`
     LocalAddress string `json:"localaddress" bson:"localaddress"`
     LocalAddress string `json:"localaddress" bson:"localaddress"`
     IsGateway bool `json:"isgateway" bson:"isgateway"`
     IsGateway bool `json:"isgateway" bson:"isgateway"`
     GatewayRange string `json:"gatewayrange" bson:"gatewayrange"`
     GatewayRange string `json:"gatewayrange" bson:"gatewayrange"`