Skip to content

Commit 2e36e0e

Browse files
author
auxten
committed
add MinNodeIDDifficulty limit for DHT.Ping server side implementation
1 parent 031ea0e commit 2e36e0e

9 files changed

Lines changed: 64 additions & 22 deletions

File tree

conf/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ type Config struct {
123123
ListenAddr string
124124
ThisNodeID proto.NodeID
125125
ValidDNSKeys map[string]string `yaml:"ValidDNSKeys"` // map[DNSKEY]domain
126+
// Check By BP DHT.Ping
127+
MinNodeIDDifficulty int `yaml:"MinNodeIDDifficulty"`
126128

127129
BP *BPInfo `yaml:"BlockProducer"`
128130
Miner *MinerInfo `yaml:"Miner,omitempty"`

metric/rpc.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,11 @@ func NewCollectServer() *CollectServer {
6565
func (cs *CollectServer) UploadMetrics(req *proto.UploadMetricsReq, resp *proto.UploadMetricsResp) (err error) {
6666
if req.NodeID == "" {
6767
err = errors.New("empty node id")
68-
resp.Msg = "empty node id"
69-
log.Errorln(resp.Msg)
68+
log.Error(err)
7069
return
7170
}
7271
if !route.IsPermitted(&req.Envelope, route.MetricUploadMetrics) {
7372
err = fmt.Errorf("calling from node %s is not permitted", req.NodeID)
74-
resp.Msg = fmt.Sprint(err)
7573
log.Error(err)
7674
return
7775
}
@@ -99,6 +97,7 @@ func (cs *CollectServer) UploadMetrics(req *proto.UploadMetricsReq, resp *proto.
9997
cs.NodeMetric.Store(req.NodeID, mfm)
10098
} else {
10199
err = errors.New("no valid metric received")
100+
log.Error(err)
102101
}
103102
return
104103
}

route/service.go

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ package route
1919
import (
2020
"fmt"
2121

22+
"gitlab.com/thunderdb/ThunderDB/conf"
2223
"gitlab.com/thunderdb/ThunderDB/consistent"
24+
"gitlab.com/thunderdb/ThunderDB/crypto/kms"
2325
"gitlab.com/thunderdb/ThunderDB/proto"
2426
"gitlab.com/thunderdb/ThunderDB/utils/log"
2527
)
@@ -51,14 +53,13 @@ func NewDHTService(DHTStorePath string, persistImpl consistent.Persistence, init
5153
func (DHT *DHTService) FindNode(req *proto.FindNodeReq, resp *proto.FindNodeResp) (err error) {
5254
if !IsPermitted(&req.Envelope, DHTFindNode) {
5355
err = fmt.Errorf("calling from node %s is not permitted", req.NodeID)
54-
resp.Msg = fmt.Sprint(err)
5556
log.Error(err)
5657
return
5758
}
5859
node, err := DHT.Consistent.GetNode(string(req.NodeID))
5960
if err != nil {
60-
log.Errorf("get node %s from DHT failed: %s", req.NodeID, err)
61-
resp.Msg = fmt.Sprint(err)
61+
err = fmt.Errorf("get node %s from DHT failed: %s", req.NodeID, err)
62+
log.Error(err)
6263
return
6364
}
6465
resp.Node = node
@@ -69,15 +70,14 @@ func (DHT *DHTService) FindNode(req *proto.FindNodeReq, resp *proto.FindNodeResp
6970
func (DHT *DHTService) FindNeighbor(req *proto.FindNeighborReq, resp *proto.FindNeighborResp) (err error) {
7071
if !IsPermitted(&req.Envelope, DHTFindNeighbor) {
7172
err = fmt.Errorf("calling from node %s is not permitted", req.NodeID)
72-
resp.Msg = fmt.Sprint(err)
7373
log.Error(err)
7474
return
7575
}
7676

7777
nodes, err := DHT.Consistent.GetNeighbors(string(req.NodeID), req.Count)
7878
if err != nil {
79-
log.Errorf("get nodes from DHT failed: %s", err)
80-
resp.Msg = fmt.Sprint(err)
79+
err = fmt.Errorf("get nodes from DHT failed: %s", err)
80+
log.Error(err)
8181
return
8282
}
8383
resp.Nodes = nodes
@@ -88,17 +88,28 @@ func (DHT *DHTService) FindNeighbor(req *proto.FindNeighborReq, resp *proto.Find
8888
func (DHT *DHTService) Ping(req *proto.PingReq, resp *proto.PingResp) (err error) {
8989
log.Debugf("got req: %#v", req)
9090
if !IsPermitted(&req.Envelope, DHTPing) {
91-
err = fmt.Errorf("calling from node %s is not permitted", req.NodeID)
92-
resp.Msg = fmt.Sprint(err)
91+
err = fmt.Errorf("calling Ping from node %s is not permitted", req.NodeID)
92+
log.Error(err)
93+
return
94+
}
95+
96+
// Checking if ID Nonce Pubkey matched
97+
if !kms.IsIDPubNonceValid(req.Node.ID.ToRawNodeID(), &req.Node.Nonce, req.Node.PublicKey) {
98+
err = fmt.Errorf("node: %s nonce public key not match", req.Node.ID)
99+
log.Error(err)
100+
return
101+
}
102+
103+
// Checking MinNodeIDDifficulty
104+
if req.Node.ID.Difficulty() < conf.GConf.MinNodeIDDifficulty {
105+
err = fmt.Errorf("node: %s difficulty too low", req.Node.ID)
93106
log.Error(err)
94107
return
95108
}
96109

97-
//TODO(auxten) nonce verification here is very necessary
98110
err = DHT.Consistent.Add(req.Node)
99111
if err != nil {
100-
log.Errorf("DHT.Consistent.Add %v failed: %s", req.Node, err)
101-
resp.Msg = err.Error()
112+
err = fmt.Errorf("DHT.Consistent.Add %v failed: %s", req.Node, err)
102113
} else {
103114
resp.Msg = "Pong"
104115
}

route/service_test.go

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,15 @@ package route
1919
import (
2020
"fmt"
2121
"net"
22-
"testing"
23-
2422
"net/rpc"
25-
2623
"os"
27-
24+
"strings"
25+
"testing"
2826
"time"
2927

3028
. "github.com/smartystreets/goconvey/convey"
3129
"github.com/ugorji/go/codec"
30+
"gitlab.com/thunderdb/ThunderDB/conf"
3231
"gitlab.com/thunderdb/ThunderDB/consistent"
3332
"gitlab.com/thunderdb/ThunderDB/crypto/kms"
3433
. "gitlab.com/thunderdb/ThunderDB/proto"
@@ -78,7 +77,7 @@ func TestDHTService_FindNeighbor_FindNode(t *testing.T) {
7877

7978
Convey("test FindNeighbor empty", t, func() {
8079
So(resp.Nodes, ShouldBeEmpty)
81-
So(err.Error(), ShouldEqual, consistent.ErrEmptyCircle.Error())
80+
So(err.Error(), ShouldContainSubstring, consistent.ErrEmptyCircle.Error())
8281
})
8382

8483
reqFN1 := &FindNodeReq{
@@ -92,7 +91,7 @@ func TestDHTService_FindNeighbor_FindNode(t *testing.T) {
9291
log.Debugf("respFN1: %v", respFN1)
9392
Convey("test FindNode", t, func() {
9493
So(respFN1.Node, ShouldBeNil)
95-
So(err.Error(), ShouldEqual, consistent.ErrKeyNotFound.Error())
94+
So(err.Error(), ShouldContainSubstring, consistent.ErrKeyNotFound.Error())
9695
})
9796

9897
node1 := NewNode()
@@ -219,9 +218,35 @@ func TestDHTService_Ping(t *testing.T) {
219218
}
220219
respA := new(PingResp)
221220
msgpackCodec := codec.MsgpackSpecRpc.ClientCodec(client, mh)
222-
err = rpc.NewClientWithCodec(msgpackCodec).Call("DHT.Ping", reqA, respA)
221+
rc := rpc.NewClientWithCodec(msgpackCodec)
222+
err = rc.Call("DHT.Ping", reqA, respA)
223223
if err != nil {
224-
log.Error(err)
224+
t.Error(err)
225225
}
226226
log.Debugf("respA: %v", respA)
227+
rc.Close()
228+
229+
respA3 := new(PingResp)
230+
conf.GConf.MinNodeIDDifficulty = 256
231+
client, _ = net.Dial("tcp", ln.Addr().String())
232+
msgpackCodec = codec.MsgpackSpecRpc.ClientCodec(client, mh)
233+
rc = rpc.NewClientWithCodec(msgpackCodec)
234+
err = rc.Call("DHT.Ping", reqA, respA3)
235+
if err == nil || !strings.Contains(err.Error(), "difficulty too low") {
236+
t.Error(err)
237+
}
238+
log.Debugf("respA3: %v", respA3)
239+
rc.Close()
240+
241+
respA2 := new(PingResp)
242+
reqA.Node.Nonce.A = ^uint64(0)
243+
client, _ = net.Dial("tcp", ln.Addr().String())
244+
msgpackCodec = codec.MsgpackSpecRpc.ClientCodec(client, mh)
245+
rc = rpc.NewClientWithCodec(msgpackCodec)
246+
err = rc.Call("DHT.Ping", reqA, respA2)
247+
if err == nil || !strings.Contains(err.Error(), "nonce public key not match") {
248+
t.Error(err)
249+
}
250+
log.Debugf("respA2: %v", respA2)
251+
rc.Close()
227252
}

test/node_0/config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ thisnodeid: "00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9"
88
ValidDNSKeys:
99
koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com
1010
mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com
11+
MinNodeIDDifficulty: 2
1112
BlockProducer:
1213
PublicKeyStr: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24"
1314
NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9

test/node_1/config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ thisnodeid: "00000381d46fd6cf7742d7fb94e2422033af989c0e348b5781b3219599a3af35"
88
ValidDNSKeys:
99
koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com
1010
mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com
11+
MinNodeIDDifficulty: 2
1112
BlockProducer:
1213
PublicKeyStr: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24"
1314
NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9

test/node_2/config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ thisnodeid: "000000172580063ded88e010556b0aca2851265be8845b1ef397e8fce6ab5582"
88
ValidDNSKeys:
99
koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com
1010
mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com
11+
MinNodeIDDifficulty: 2
1112
BlockProducer:
1213
PublicKeyStr: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24"
1314
NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9

test/node_c/config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ thisnodeid: "00000f3b43288fe99831eb533ab77ec455d13e11fc38ec35a42d4edd17aa320d"
88
ValidDNSKeys:
99
koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com
1010
mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com
11+
MinNodeIDDifficulty: 2
1112
BlockProducer:
1213
PublicKeyStr: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24"
1314
NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9

test/node_standalone/config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ thisnodeid: "00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9"
88
ValidDNSKeys:
99
koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com
1010
mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com
11+
MinNodeIDDifficulty: 2
1112
BlockProducer:
1213
PublicKeyStr: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24"
1314
NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9

0 commit comments

Comments
 (0)