Skip to content

Commit 4786cfc

Browse files
author
auxten
committed
pubkeystore drops protobuf uses msgpack
1 parent e8d9c21 commit 4786cfc

8 files changed

Lines changed: 140 additions & 303 deletions

File tree

consistent/consistent.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ func (c *Consistent) Add(node proto.Node) (err error) {
149149

150150
// need c.Lock() before calling
151151
func (c *Consistent) add(node proto.Node) (err error) {
152-
err = kms.SetNodeInfo(&node)
152+
err = kms.SetNode(&node)
153153
if err != nil {
154154
log.Errorf("set node info failed: %s", err)
155155
return

crypto/kms/pubkeystore.go

Lines changed: 22 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,16 @@ import (
2121

2222
"sync"
2323

24+
"bytes"
25+
2426
log "github.com/sirupsen/logrus"
2527

2628
"github.com/coreos/bbolt"
27-
pb "github.com/golang/protobuf/proto"
2829
"github.com/thunderdb/ThunderDB/crypto/asymmetric"
2930
"github.com/thunderdb/ThunderDB/crypto/hash"
3031
mine "github.com/thunderdb/ThunderDB/pow/cpuminer"
3132
"github.com/thunderdb/ThunderDB/proto"
32-
"github.com/thunderdb/ThunderDB/types"
33+
"github.com/ugorji/go/codec"
3334
)
3435

3536
// PublicKeyStore holds db and bucket name
@@ -113,7 +114,7 @@ func InitPublicKeyStore(dbPath string, initNode *proto.Node) (err error) {
113114
}
114115

115116
if initNode != nil {
116-
err = setPublicKey(initNode)
117+
err = setNode(initNode)
117118
}
118119

119120
return
@@ -141,27 +142,12 @@ func GetNodeInfo(id proto.NodeID) (nodeInfo *proto.Node, err error) {
141142
if byteVal == nil {
142143
return ErrKeyNotFound
143144
}
144-
145-
// error log will be done at the wrapper func
146-
nodeInfoTypes := &types.Node{}
147-
err = pb.Unmarshal(byteVal, nodeInfoTypes)
148-
if err == nil {
149-
publicKey, err := asymmetric.ParsePubKey(nodeInfoTypes.PublicKey.PublicKey)
150-
if err == nil {
151-
nodeInfo = &proto.Node{
152-
ID: proto.NodeID(nodeInfoTypes.ID.NodeID),
153-
Addr: nodeInfoTypes.Addr,
154-
PublicKey: publicKey,
155-
Nonce: mine.Uint256{
156-
A: nodeInfoTypes.Nonce.A,
157-
B: nodeInfoTypes.Nonce.B,
158-
C: nodeInfoTypes.Nonce.C,
159-
D: nodeInfoTypes.Nonce.D,
160-
},
161-
}
162-
}
163-
}
164-
145+
log.Debugf("get node: %#v", byteVal)
146+
reader := bytes.NewReader(byteVal)
147+
mh := &codec.MsgpackHandle{}
148+
dec := codec.NewDecoder(reader, mh)
149+
nodeInfo = proto.NewNode()
150+
err = dec.Decode(nodeInfo)
165151
return err // return from View func
166152
})
167153
if err != nil {
@@ -199,11 +185,11 @@ func SetPublicKey(id proto.NodeID, nonce mine.Uint256, publicKey *asymmetric.Pub
199185
PublicKey: publicKey,
200186
Nonce: nonce,
201187
}
202-
return SetNodeInfo(nodeInfo)
188+
return SetNode(nodeInfo)
203189
}
204190

205-
// SetNodeInfo verifies nonce and sets {proto.Node.ID: proto.Node}
206-
func SetNodeInfo(nodeInfo *proto.Node) (err error) {
191+
// SetNode verifies nonce and sets {proto.Node.ID: proto.Node}
192+
func SetNode(nodeInfo *proto.Node) (err error) {
207193
if nodeInfo == nil {
208194
return ErrNilNode
209195
}
@@ -222,37 +208,27 @@ func SetNodeInfo(nodeInfo *proto.Node) (err error) {
222208
}
223209
}
224210

225-
return setPublicKey(nodeInfo)
211+
return setNode(nodeInfo)
226212
}
227213

228-
// setPublicKey sets id and its publicKey
229-
func setPublicKey(nodeInfo *proto.Node) (err error) {
230-
nodeBuf, err := pb.Marshal(&types.Node{
231-
ID: &types.NodeID{
232-
NodeID: string(nodeInfo.ID),
233-
},
234-
Addr: nodeInfo.Addr,
235-
PublicKey: &types.PublicKey{
236-
PublicKey: nodeInfo.PublicKey.Serialize(),
237-
},
238-
Nonce: &types.Nonce{
239-
A: nodeInfo.Nonce.A,
240-
B: nodeInfo.Nonce.B,
241-
C: nodeInfo.Nonce.C,
242-
D: nodeInfo.Nonce.D,
243-
},
244-
})
214+
// setNode sets id and its publicKey
215+
func setNode(nodeInfo *proto.Node) (err error) {
216+
nodeBuf := new(bytes.Buffer)
217+
mh := &codec.MsgpackHandle{}
218+
enc := codec.NewEncoder(nodeBuf, mh)
219+
err = enc.Encode(*nodeInfo)
245220
if err != nil {
246221
log.Errorf("marshal node info failed: %s", err)
247222
return
248223
}
224+
log.Debugf("set node: %#v", nodeBuf.Bytes())
249225

250226
err = (*bolt.DB)(pks.db).Update(func(tx *bolt.Tx) error {
251227
bucket := tx.Bucket(pks.bucket)
252228
if bucket == nil {
253229
return ErrBucketNotInitialized
254230
}
255-
return bucket.Put([]byte(nodeInfo.ID), nodeBuf)
231+
return bucket.Put([]byte(nodeInfo.ID), nodeBuf.Bytes())
256232
})
257233
if err != nil {
258234
log.Errorf("get node info failed: %s", err)

crypto/kms/pubkeystore_test.go

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,22 @@ import (
2525

2626
"encoding/hex"
2727

28+
"bytes"
29+
30+
"reflect"
31+
32+
log "github.com/sirupsen/logrus"
2833
. "github.com/smartystreets/goconvey/convey"
2934
"github.com/thunderdb/ThunderDB/crypto/asymmetric"
3035
"github.com/thunderdb/ThunderDB/pow/cpuminer"
3136
"github.com/thunderdb/ThunderDB/proto"
37+
"github.com/ugorji/go/codec"
3238
)
3339

3440
const dbFile = ".test.db"
3541

3642
func TestDB(t *testing.T) {
43+
log.SetLevel(log.DebugLevel)
3744
privKey1, pubKey1, _ := asymmetric.GenSecp256k1KeyPair()
3845
privKey2, pubKey2, _ := asymmetric.GenSecp256k1KeyPair()
3946
node1 := &proto.Node{
@@ -59,10 +66,13 @@ func TestDB(t *testing.T) {
5966

6067
Convey("Init db", t, func() {
6168
pks = nil
69+
os.Remove(dbFile)
6270
defer os.Remove(dbFile)
6371
InitPublicKeyStore(dbFile, BPNode)
6472
So(pks.bucket, ShouldNotBeNil)
6573

74+
nodeInfo, err := GetNodeInfo(proto.NodeID(BPNodeID))
75+
log.Debugf("nodeInfo %v", nodeInfo)
6676
pubk, err := GetPublicKey(proto.NodeID(BPNodeID))
6777
So(pubk, ShouldNotBeNil)
6878
So(err, ShouldBeNil)
@@ -72,13 +82,13 @@ func TestDB(t *testing.T) {
7282
So(pubk, ShouldBeNil)
7383
So(err, ShouldEqual, ErrKeyNotFound)
7484

75-
err = SetNodeInfo(nil)
85+
err = SetNode(nil)
7686
So(err, ShouldEqual, ErrNilNode)
7787

78-
err = setPublicKey(node1)
88+
err = setNode(node1)
7989
So(err, ShouldBeNil)
8090

81-
err = setPublicKey(node2)
91+
err = setNode(node2)
8292
So(err, ShouldBeNil)
8393

8494
err = SetPublicKey(proto.NodeID(BPNodeID), BPNonce, BPPublicKey)
@@ -124,7 +134,7 @@ func TestDB(t *testing.T) {
124134
So(pubk, ShouldBeNil)
125135
So(err, ShouldEqual, ErrBucketNotInitialized)
126136

127-
err = setPublicKey(node1)
137+
err = setNode(node1)
128138
So(err, ShouldEqual, ErrBucketNotInitialized)
129139

130140
err = DelNode(proto.NodeID("node2"))
@@ -156,3 +166,33 @@ func TestErrorPath(t *testing.T) {
156166
So(err, ShouldNotBeNil)
157167
})
158168
}
169+
170+
func TestMarshalNode(t *testing.T) {
171+
Convey("marshal unmarshal node", t, func() {
172+
nodeInfo := &proto.Node{
173+
ID: "abc",
174+
Addr: "addr",
175+
PublicKey: nil,
176+
Nonce: cpuminer.Uint256{
177+
A: 1,
178+
B: 2,
179+
C: 3,
180+
D: 4,
181+
},
182+
}
183+
nodeBuf := new(bytes.Buffer)
184+
mh := &codec.MsgpackHandle{}
185+
enc := codec.NewEncoder(nodeBuf, mh)
186+
err := enc.Encode(nodeInfo)
187+
if err != nil {
188+
log.Errorf("encode error: %s", err)
189+
}
190+
191+
nodeDec := proto.NewNode()
192+
reader := bytes.NewReader(nodeBuf.Bytes())
193+
dec := codec.NewDecoder(reader, mh)
194+
err = dec.Decode(nodeDec)
195+
196+
So(reflect.DeepEqual(nodeDec, nodeInfo), ShouldBeTrue)
197+
})
198+
}

rpc/server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ func handleCipher(conn net.Conn) (cryptoConn *etls.CryptoConn, err error) {
177177
if conf.Role[0] == 'M' && err == kms.ErrKeyNotFound {
178178
// TODO(auxten): if Miner running and key not found, ask BlockProducer
179179
}
180-
log.Errorf("get public key failed, node id: %s", nodeID)
180+
log.Errorf("get public key failed, node id: %s, err: %s", nodeID, err)
181181
return
182182
}
183183
privateKey, err := kms.GetLocalPrivateKey()

types/rpc.pb.go

Lines changed: 0 additions & 29 deletions
This file was deleted.

types/rpc.proto

Lines changed: 0 additions & 5 deletions
This file was deleted.

0 commit comments

Comments
 (0)