diff --git a/dagconfig/params.go b/dagconfig/params.go index fc0875bd6..2af6e9aa5 100644 --- a/dagconfig/params.go +++ b/dagconfig/params.go @@ -189,7 +189,7 @@ func (p *Params) NormalizeRPCServerAddress(addr string) (string, error) { // MainnetParams defines the network parameters for the main Kaspa network. var MainnetParams = Params{ K: ghostdagK, - Name: "mainnet", + Name: "kaspa-mainnet", Net: domainmessage.Mainnet, RPCPort: "16110", DefaultPort: "16111", @@ -242,7 +242,7 @@ var MainnetParams = Params{ // 3), this network is sometimes simply called "testnet". var RegressionNetParams = Params{ K: ghostdagK, - Name: "regtest", + Name: "kaspa-regtest", Net: domainmessage.Regtest, RPCPort: "16210", DefaultPort: "16211", @@ -293,7 +293,7 @@ var RegressionNetParams = Params{ // TestnetParams defines the network parameters for the test Kaspa network. var TestnetParams = Params{ K: ghostdagK, - Name: "testnet", + Name: "kaspa-testnet", Net: domainmessage.Testnet, RPCPort: "16210", DefaultPort: "16211", @@ -350,7 +350,7 @@ var TestnetParams = Params{ // just turn into another public testnet. var SimnetParams = Params{ K: ghostdagK, - Name: "simnet", + Name: "kaspa-simnet", Net: domainmessage.Simnet, RPCPort: "16510", DefaultPort: "16511", @@ -399,7 +399,7 @@ var SimnetParams = Params{ // DevnetParams defines the network parameters for the development Kaspa network. var DevnetParams = Params{ K: ghostdagK, - Name: "devnet", + Name: "kaspa-devnet", Net: domainmessage.Devnet, RPCPort: "16610", DefaultPort: "16611", diff --git a/domainmessage/msgversion.go b/domainmessage/msgversion.go index fb648c218..c1afc81bf 100644 --- a/domainmessage/msgversion.go +++ b/domainmessage/msgversion.go @@ -34,6 +34,9 @@ type MsgVersion struct { // Version of the protocol the node is using. ProtocolVersion uint32 + // The peer's network (mainnet, testnet, etc.) + Network string + // Bitfield which identifies the enabled services. Services ServiceFlag @@ -81,13 +84,14 @@ func (msg *MsgVersion) Command() MessageCommand { // NewMsgVersion returns a new kaspa version message that conforms to the // Message interface using the passed parameters and defaults for the remaining // fields. -func NewMsgVersion(addr *NetAddress, id *id.ID, +func NewMsgVersion(addr *NetAddress, id *id.ID, network string, selectedTipHash *daghash.Hash, subnetworkID *subnetworkid.SubnetworkID) *MsgVersion { // Limit the timestamp to one millisecond precision since the protocol // doesn't support better. return &MsgVersion{ ProtocolVersion: ProtocolVersion, + Network: network, Services: 0, Timestamp: mstime.Now(), Address: addr, diff --git a/domainmessage/msgversion_test.go b/domainmessage/msgversion_test.go index a56719117..cb3317959 100644 --- a/domainmessage/msgversion_test.go +++ b/domainmessage/msgversion_test.go @@ -6,7 +6,7 @@ package domainmessage import ( "github.com/davecgh/go-spew/spew" - id "github.com/kaspanet/kaspad/netadapter/id" + "github.com/kaspanet/kaspad/netadapter/id" "github.com/kaspanet/kaspad/util/daghash" "net" "reflect" @@ -27,7 +27,7 @@ func TestVersion(t *testing.T) { } // Ensure we get the correct data back out. - msg := NewMsgVersion(me, generatedID, selectedTipHash, nil) + msg := NewMsgVersion(me, generatedID, "mainnet", selectedTipHash, nil) if msg.ProtocolVersion != pver { t.Errorf("NewMsgVersion: wrong protocol version - got %v, want %v", msg.ProtocolVersion, pver) diff --git a/go.mod b/go.mod index b175b84ae..a2d4c92c7 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 github.com/btcsuite/winsvc v1.0.0 github.com/davecgh/go-spew v1.1.1 - github.com/golang/protobuf v1.4.1 + github.com/golang/protobuf v1.4.2 github.com/golang/snappy v0.0.1 // indirect github.com/jessevdk/go-flags v1.4.0 github.com/jrick/logrotate v1.0.0 @@ -19,6 +19,7 @@ require ( golang.org/x/sys v0.0.0-20190426135247-a129542de9ae // indirect golang.org/x/text v0.3.2 // indirect google.golang.org/grpc v1.30.0 + google.golang.org/grpc/cmd/protoc-gen-go-grpc v0.0.0-20200805213715-b2f0b7930d06 // indirect google.golang.org/protobuf v1.25.0 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect gopkg.in/yaml.v2 v2.2.2 // indirect diff --git a/go.sum b/go.sum index a74cde740..ab647f39e 100644 --- a/go.sum +++ b/go.sum @@ -30,6 +30,8 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= @@ -116,12 +118,16 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0 h1:T7P4R73V3SSDPhH7WW7ATbfViLtmamH0DKrP3f9AuDI= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v0.0.0-20200805213715-b2f0b7930d06 h1:WOtSnnKPfWsgy//E8PUhDnNAj3o/3YqA6IAEKaj913o= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v0.0.0-20200805213715-b2f0b7930d06/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= diff --git a/netadapter/server/grpcserver/protowire/README.md b/netadapter/server/grpcserver/protowire/README.md new file mode 100644 index 000000000..e48911c74 --- /dev/null +++ b/netadapter/server/grpcserver/protowire/README.md @@ -0,0 +1,7 @@ +protowire +========= + +1. Download and place in your PATH: https://github.com/protocolbuffers/protobuf/releases/download/v3.12.3/protoc-3.12.3-linux-x86_64.zip +2. `go get github.com/golang/protobuf/protoc-gen-go` +3. `go get google.golang.org/grpc/cmd/protoc-gen-go-grpc` +4. In the protowire directory: `go generate .` \ No newline at end of file diff --git a/netadapter/server/grpcserver/protowire/message_version.go b/netadapter/server/grpcserver/protowire/message_version.go index daa6639f8..e8bdc7304 100644 --- a/netadapter/server/grpcserver/protowire/message_version.go +++ b/netadapter/server/grpcserver/protowire/message_version.go @@ -34,6 +34,7 @@ func (x *KaspadMessage_Version) toDomainMessage() (domainmessage.Message, error) return &domainmessage.MsgVersion{ ProtocolVersion: x.Version.ProtocolVersion, + Network: x.Version.Network, Services: domainmessage.ServiceFlag(x.Version.Services), Timestamp: mstime.UnixMilliseconds(x.Version.Timestamp), Address: address, @@ -64,6 +65,7 @@ func (x *KaspadMessage_Version) fromDomainMessage(msgVersion *domainmessage.MsgV x.Version = &VersionMessage{ ProtocolVersion: msgVersion.ProtocolVersion, + Network: msgVersion.Network, Services: uint64(msgVersion.Services), Timestamp: msgVersion.Timestamp.UnixMilliseconds(), Address: address, diff --git a/netadapter/server/grpcserver/protowire/messages.pb.go b/netadapter/server/grpcserver/protowire/messages.pb.go index efb5c12f2..cfe6f5dd6 100644 --- a/netadapter/server/grpcserver/protowire/messages.pb.go +++ b/netadapter/server/grpcserver/protowire/messages.pb.go @@ -1854,6 +1854,7 @@ type VersionMessage struct { SelectedTipHash *Hash `protobuf:"bytes,7,opt,name=selectedTipHash,proto3" json:"selectedTipHash,omitempty"` DisableRelayTx bool `protobuf:"varint,8,opt,name=disableRelayTx,proto3" json:"disableRelayTx,omitempty"` SubnetworkID *SubnetworkID `protobuf:"bytes,9,opt,name=subnetworkID,proto3" json:"subnetworkID,omitempty"` + Network string `protobuf:"bytes,10,opt,name=network,proto3" json:"network,omitempty"` } func (x *VersionMessage) Reset() { @@ -1951,6 +1952,13 @@ func (x *VersionMessage) GetSubnetworkID() *SubnetworkID { return nil } +func (x *VersionMessage) GetNetwork() string { + if x != nil { + return x.Network + } + return "" +} + var File_messages_proto protoreflect.FileDescriptor var file_messages_proto_rawDesc = []byte{ @@ -2214,7 +2222,7 @@ var file_messages_proto_rawDesc = []byte{ 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x52, 0x0f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x69, 0x70, 0x48, 0x61, 0x73, 0x68, 0x22, 0x0f, 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x61, 0x63, 0x6b, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x22, 0xf3, 0x02, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x61, 0x67, 0x65, 0x22, 0x8d, 0x03, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, @@ -2237,15 +2245,17 @@ var file_messages_proto_rawDesc = []byte{ 0x0c, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x44, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x44, 0x52, 0x0c, 0x73, 0x75, - 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x44, 0x32, 0x50, 0x0a, 0x03, 0x50, 0x32, - 0x50, 0x12, 0x49, 0x0a, 0x0d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4b, - 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x18, 0x2e, 0x70, + 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x32, 0x50, 0x0a, 0x03, 0x50, 0x32, 0x50, 0x12, 0x49, 0x0a, 0x0d, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x2e, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, 0x26, 0x5a, 0x24, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, - 0x6e, 0x65, 0x74, 0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x77, 0x69, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, + 0x72, 0x65, 0x2e, 0x4b, 0x61, 0x73, 0x70, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x61, 0x73, 0x70, 0x61, 0x6e, 0x65, 0x74, 0x2f, 0x6b, 0x61, + 0x73, 0x70, 0x61, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x77, 0x69, 0x72, 0x65, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/netadapter/server/grpcserver/protowire/messages.proto b/netadapter/server/grpcserver/protowire/messages.proto index 0cdaa6ba8..c4d76b93a 100644 --- a/netadapter/server/grpcserver/protowire/messages.proto +++ b/netadapter/server/grpcserver/protowire/messages.proto @@ -209,6 +209,7 @@ message VersionMessage{ Hash selectedTipHash = 7; bool disableRelayTx = 8; SubnetworkID subnetworkID = 9; + string network = 10; } // VersionMessage end diff --git a/protocol/flows/handshake/receiveversion.go b/protocol/flows/handshake/receiveversion.go index 6715557ef..a7e56579c 100644 --- a/protocol/flows/handshake/receiveversion.go +++ b/protocol/flows/handshake/receiveversion.go @@ -55,6 +55,11 @@ func (flow *receiveVersionFlow) start() (*domainmessage.NetAddress, error) { return nil, protocolerrors.New(true, "connected to self") } + // Disconnect and ban peers from a different network + if msgVersion.Network != flow.Config().ActiveNetParams.Name { + return nil, protocolerrors.Errorf(true, "wrong network") + } + // Notify and disconnect clients that have a protocol version that is // too old. // diff --git a/protocol/flows/handshake/sendversion.go b/protocol/flows/handshake/sendversion.go index 108449b71..6e721d013 100644 --- a/protocol/flows/handshake/sendversion.go +++ b/protocol/flows/handshake/sendversion.go @@ -49,7 +49,8 @@ func (flow *sendVersionFlow) start() error { if err != nil { return err } - msg := domainmessage.NewMsgVersion(localAddress, flow.NetAdapter().ID(), selectedTipHash, subnetworkID) + msg := domainmessage.NewMsgVersion(localAddress, flow.NetAdapter().ID(), + flow.Config().ActiveNetParams.Name, selectedTipHash, subnetworkID) msg.AddUserAgent(userAgentName, userAgentVersion, flow.Config().UserAgentComments...) // Advertise the services flag