Skip to content

Commit

Permalink
chase master branch
Browse files Browse the repository at this point in the history
  • Loading branch information
abbychau committed Jun 25, 2018
2 parents d5fbc7b + 91f0a54 commit 5c1ec68
Show file tree
Hide file tree
Showing 22 changed files with 979 additions and 274 deletions.
14 changes: 7 additions & 7 deletions crypto/keys_test.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package crypto

import (
"testing"
"crypto/rand"
"reflect"
"testing"
)

func TestSignVerify(t *testing.T) {
Expand All @@ -12,34 +12,34 @@ func TestSignVerify(t *testing.T) {

_, err := rand.Read(message)
if err != nil {
panic(err)
t.Fatal(err)
}

sig, err := kp.Sign(message)
if err != nil {
panic(err)
t.Fatal(err)
}

ok := Verify(kp.PublicKey, message, sig)
if !ok {
panic("Signature verification failed")
t.Fatal("signature verification failed")
}

sig[0] = ^sig[0]
ok = Verify(kp.PublicKey, message, sig)
if ok {
panic("Invalid signature passed verification unexpectedly")
t.Fatal("invalid signature passed verification unexpectedly")
}
}

func TestFromPrivateKey(t *testing.T) {
kp1 := RandomKeyPair()
kp2, err := FromPrivateKey(kp1.PrivateKeyHex())
if err != nil {
panic(err)
t.Fatal(err)
}

if !reflect.DeepEqual(kp1, kp2) {
panic("kp1 and kp2 are not deep-equal.")
t.Fatal("kp1 and kp2 are not deep-equal.")
}
}
32 changes: 14 additions & 18 deletions dht/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ type RoutingTable struct {
// Current node's ID.
self peer.ID

buckets *sync.Map
buckets []*Bucket
}

type Bucket struct {
Expand All @@ -30,9 +30,12 @@ func NewBucket() *Bucket {
}

func CreateRoutingTable(id peer.ID) *RoutingTable {
table := &RoutingTable{self: id, buckets: &sync.Map{}}
table := &RoutingTable{
self: id,
buckets: make([]*Bucket, peer.IdSize*8),
}
for i := 0; i < peer.IdSize*8; i++ {
table.buckets.Store(i, NewBucket())
table.buckets[i] = NewBucket()
}

table.Update(id)
Expand Down Expand Up @@ -79,9 +82,7 @@ func (t *RoutingTable) GetPeers() (peers []peer.ID) {
visited := make(map[string]struct{})
visited[t.self.PublicKeyHex()] = struct{}{}

t.buckets.Range(func(key, value interface{}) bool {
bucket := value.(*Bucket)

for _, bucket := range t.buckets {
bucket.mutex.RLock()

for e := bucket.Front(); e != nil; e = e.Next() {
Expand All @@ -93,8 +94,7 @@ func (t *RoutingTable) GetPeers() (peers []peer.ID) {
}

bucket.mutex.RUnlock()
return true
})
}

return
}
Expand All @@ -104,9 +104,7 @@ func (t *RoutingTable) GetPeerAddresses() (peers []string) {
visited := make(map[string]struct{})
visited[t.self.PublicKeyHex()] = struct{}{}

t.buckets.Range(func(key, value interface{}) bool {
bucket := value.(*Bucket)

for _, bucket := range t.buckets {
bucket.mutex.RLock()

for e := bucket.Front(); e != nil; e = e.Next() {
Expand All @@ -118,8 +116,7 @@ func (t *RoutingTable) GetPeerAddresses() (peers []string) {
}

bucket.mutex.RUnlock()
return true
})
}

return
}
Expand Down Expand Up @@ -199,10 +196,9 @@ func (t *RoutingTable) FindClosestPeers(target peer.ID, count int) (peers []peer
}

func (t *RoutingTable) Bucket(id int) *Bucket {
if bucket, exists := t.buckets.Load(id); exists {
if bucket, ok := bucket.(*Bucket); ok {
return bucket
}
if id >= 0 && id < len(t.buckets) {
return t.buckets[id]
} else {
return nil
}
return nil
}
85 changes: 85 additions & 0 deletions examples/chat/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package main

import (
"bufio"
"flag"
"fmt"
"github.com/golang/glog"
"github.com/perlin-network/noise/crypto"
"github.com/perlin-network/noise/examples/chat/messages"
"github.com/perlin-network/noise/grpc_utils"
"github.com/perlin-network/noise/network"
"github.com/perlin-network/noise/network/builders"
"github.com/perlin-network/noise/network/discovery"
"os"
"strings"
"time"
)

type ChatMessageProcessor struct{}

func (*ChatMessageProcessor) Handle(client *network.PeerClient, raw *network.IncomingMessage) error {
message := raw.Message.(*messages.ChatMessage)

glog.Infof("<%s> %s", client.Id.Address, message.Message)

return nil
}

func main() {
// glog defaults to logging to a file, override this flag to log to console for testing
flag.Set("logtostderr", "true")

// process other flags
portFlag := flag.Int("port", 3000, "port to listen to")
hostFlag := flag.String("host", "localhost", "host to listen to")
peersFlag := flag.String("peers", "", "peers to connect to")
flag.Parse()

port := *portFlag
host := *hostFlag
peers := strings.Split(*peersFlag, ",")

keys := crypto.RandomKeyPair()

glog.Infof("Private Key: %s", keys.PrivateKeyHex())
glog.Infof("Public Key: %s", keys.PublicKeyHex())

builder := &builders.NetworkBuilder{}
builder.SetKeys(keys)
builder.SetHost(host)
builder.SetPort(port)

// Register peer discovery RPC handlers.
discovery.BootstrapPeerDiscovery(builder)

builder.AddProcessor((*messages.ChatMessage)(nil), new(ChatMessageProcessor))

net, err := builder.BuildNetwork()
if err != nil {
glog.Fatal(err)
return
}

go net.Listen()

if len(peers) > 0 {
blockTimeout := 10 * time.Second
if err := grpc_utils.BlockUntilConnectionReady(host, port, blockTimeout); err != nil {
glog.Warningf(fmt.Sprintf("Error: port was not available, cannot bootstrap peers, err=%+v", err))
}

net.Bootstrap(peers...)
}

reader := bufio.NewReader(os.Stdin)
for {
input, _ := reader.ReadString('\n')

glog.Infof("<%s> %s", net.Address(), input)

net.Broadcast(&messages.ChatMessage{Message: input})
}

glog.Flush()
}
72 changes: 72 additions & 0 deletions examples/chat/messages/chat.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions examples/chat/messages/chat.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
syntax = "proto3";

package messages;

message ChatMessage {
string message = 1;
}
3 changes: 3 additions & 0 deletions examples/chat/scripts.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
//go:generate protoc --go_out=plugins=grpc:. messages/chat.proto

package main
Loading

0 comments on commit 5c1ec68

Please sign in to comment.