Skip to content
Snippets Groups Projects
Commit 249bc066 authored by capossele's avatar capossele
Browse files

:sparkles: adds new autopeering

parent c2d1b2f9
No related branches found
No related tags found
No related merge requests found
Showing
with 357 additions and 131 deletions
...@@ -3,27 +3,27 @@ module github.com/iotaledger/goshimmer ...@@ -3,27 +3,27 @@ module github.com/iotaledger/goshimmer
go 1.13 go 1.13
require ( require (
github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 // indirect
github.com/dgraph-io/badger v1.6.0 github.com/dgraph-io/badger v1.6.0
github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/dgryski/go-farm v0.0.0-20191112170834-c2139c5d712b // indirect
github.com/ethereum/go-ethereum v1.9.3 github.com/ethereum/go-ethereum v1.9.3
github.com/gdamore/tcell v1.2.0 github.com/gdamore/tcell v1.2.0
github.com/go-zeromq/zmq4 v0.5.0 github.com/go-zeromq/zmq4 v0.5.0
github.com/golang/protobuf v1.3.2 // indirect github.com/google/open-location-code/go v0.0.0-20190903173953-119bc96a3a51
github.com/google/open-location-code/go v0.0.0-20190723034300-2c7115db77a3
github.com/gorilla/websocket v1.4.1 github.com/gorilla/websocket v1.4.1
github.com/iotaledger/iota.go v1.0.0-beta.7 github.com/iotaledger/autopeering-sim v0.0.0-20191120103907-203d7715f04c
github.com/kr/pretty v0.1.0 // indirect github.com/iotaledger/hive.go v0.0.0-20191118130432-89eebe8fe8eb
github.com/iotaledger/iota.go v1.0.0-beta.9
github.com/labstack/echo v3.3.10+incompatible github.com/labstack/echo v3.3.10+incompatible
github.com/labstack/gommon v0.3.0 // indirect
github.com/magiconair/properties v1.8.1 github.com/magiconair/properties v1.8.1
github.com/pkg/errors v0.8.1 github.com/pkg/errors v0.8.1
github.com/rivo/tview v0.0.0-20190829161255-f8bc69b90341 github.com/rivo/tview v0.0.0-20190829161255-f8bc69b90341
github.com/rivo/uniseg v0.1.0 // indirect go.uber.org/atomic v1.5.1 // indirect
go.uber.org/multierr v1.4.0 // indirect
go.uber.org/zap v1.13.0 // indirect
golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472 golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 golang.org/x/net v0.0.0-20191119073136-fc4aabc6c914
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd // indirect golang.org/x/sys v0.0.0-20191119195528-f068ffe820e4 // indirect
golang.org/x/text v0.3.2 // indirect golang.org/x/tools v0.0.0-20191120001058-ad01d5993d97 // indirect
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect google.golang.org/grpc v1.21.0
gopkg.in/zeromq/goczmq.v4 v4.1.0 // indirect
) )
This diff is collapsed.
...@@ -3,13 +3,15 @@ package accountability ...@@ -3,13 +3,15 @@ package accountability
import ( import (
"sync" "sync"
"github.com/iotaledger/goshimmer/packages/database" "github.com/dgraph-io/badger"
"github.com/iotaledger/goshimmer/packages/identity" "github.com/iotaledger/goshimmer/packages/identity"
"github.com/iotaledger/goshimmer/packages/settings" "github.com/iotaledger/goshimmer/packages/settings"
) )
var ownId *identity.Identity // Name of the key under which the node identity is stored.
const identityKey = "IDENTITY"
var ownId *identity.Identity
var lazyInit sync.Once var lazyInit sync.Once
func OwnId() *identity.Identity { func OwnId() *identity.Identity {
...@@ -23,13 +25,13 @@ func initOwnId() { ...@@ -23,13 +25,13 @@ func initOwnId() {
} }
func generateNewIdentity() *identity.Identity { func generateNewIdentity() *identity.Identity {
newIdentity := identity.GenerateRandomIdentity()
if err := settings.Set([]byte("ACCOUNTABILITY_PUBLIC_KEY"), newIdentity.PublicKey); err != nil { newIdentity := identity.GeneratePrivateIdentity()
panic(err)
} key := []byte(identityKey)
value := newIdentity.Marshal()
if err := settings.Set([]byte("ACCOUNTABILITY_PRIVATE_KEY"), newIdentity.PrivateKey); err != nil { if err := settings.Set(key, value); err != nil {
panic(err) panic(err)
} }
...@@ -37,23 +39,21 @@ func generateNewIdentity() *identity.Identity { ...@@ -37,23 +39,21 @@ func generateNewIdentity() *identity.Identity {
} }
func getIdentity() *identity.Identity { func getIdentity() *identity.Identity {
publicKey, err := settings.Get([]byte("ACCOUNTABILITY_PUBLIC_KEY")) key := []byte(identityKey)
value, err := settings.Get(key)
if err != nil { if err != nil {
if err == database.ErrKeyNotFound { if err == badger.ErrKeyNotFound {
return generateNewIdentity() return generateNewIdentity()
} else { } else {
panic(err) panic(err)
} }
} }
privateKey, err := settings.Get([]byte("ACCOUNTABILITY_PRIVATE_KEY")) result, err := identity.Unmarshal(value)
if err != nil { if err != nil {
if err == database.ErrKeyNotFound {
return generateNewIdentity()
} else {
panic(err) panic(err)
} }
}
return identity.NewIdentity(publicKey, privateKey) return result
} }
package daemon package daemon
import ( import (
"github.com/iotaledger/goshimmer/packages/events" "github.com/iotaledger/hive.go/events"
) )
var Events = struct { var Events = struct {
......
package identity package identity
import "crypto/ed25519"
const ( const (
PRIVATE_TYPE = IdentityType(0) IDENTIFIER_BYTE_LENGTH = 20
PUBLIC_TYPE = IdentityType(1) PUBLIC_KEY_BYTE_LENGTH = ed25519.PublicKeySize
SIGNATURE_BYTE_LENGTH = ed25519.PublicKeySize + ed25519.SignatureSize
MARSHALED_IDENTITY_PUBLIC_KEY_START = 0
MARSHALED_IDENTITY_PRIVATE_KEY_START = MARSHALED_IDENTITY_PUBLIC_KEY_END
MARSHALED_IDENTITY_PUBLIC_KEY_SIZE = PUBLIC_KEY_BYTE_LENGTH
MARSHALED_IDENTITY_PRIVATE_KEY_SIZE = ed25519.PrivateKeySize
MARSHALED_IDENTITY_PUBLIC_KEY_END = MARSHALED_IDENTITY_PUBLIC_KEY_START + MARSHALED_IDENTITY_PUBLIC_KEY_SIZE
MARSHALED_IDENTITY_PRIVATE_KEY_END = MARSHALED_IDENTITY_PRIVATE_KEY_START + MARSHALED_IDENTITY_PRIVATE_KEY_SIZE
PUBLIC_KEY_BYTE_LENGTH = 65 MARSHALED_IDENTITY_TOTAL_SIZE = MARSHALED_IDENTITY_PRIVATE_KEY_END
) )
package identity
import "errors"
var (
ErrInvalidDataLen = errors.New("identity: invalid input data length")
ErrInvalidSignature = errors.New("identity: invalid signature")
)
package identity package identity
import ( import (
"crypto/ecdsa" "crypto/ed25519"
"crypto/elliptic"
"crypto/rand"
"crypto/sha256" "crypto/sha256"
"fmt" "encoding/hex"
"github.com/ethereum/go-ethereum/crypto/secp256k1" "github.com/iotaledger/autopeering-sim/peer"
"github.com/iotaledger/goshimmer/packages/crypto"
) )
type Identity struct { type Identity struct {
Type IdentityType Identifier peer.ID
Identifier []byte
StringIdentifier string StringIdentifier string
PublicKey []byte PublicKey ed25519.PublicKey
PrivateKey []byte privateKey ed25519.PrivateKey
} }
func NewIdentity(publicKey []byte, optionalPrivateKey ...[]byte) *Identity { // Creates a new identity based on the given public key.
this := &Identity{ func NewPublicIdentity(publicKey ed25519.PublicKey) *Identity {
Identifier: crypto.Hash20(publicKey), identifier := sha256.Sum256(publicKey)
PublicKey: make([]byte, len(publicKey)),
return &Identity{
Identifier: identifier,
StringIdentifier: hex.EncodeToString(identifier[:8]),
PublicKey: publicKey,
privateKey: nil,
}
}
// Generates a identity based on a newly generated public/private key pair.
// It will panic if no such pair could be generated.
func GeneratePrivateIdentity() *Identity {
publicKey, privateKey, err := ed25519.GenerateKey(nil)
if err != nil {
panic("identity: failed generating key: " + err.Error())
}
return newPrivateIdentity(publicKey, privateKey)
} }
copy(this.PublicKey, publicKey) // Sign signs the message with privateKey and returns the message plus the signature.
func (id *Identity) AddSignature(msg []byte) []byte {
signatureStart := len(msg)
signature := ed25519.Sign(id.privateKey, msg)
data := make([]byte, signatureStart+SIGNATURE_BYTE_LENGTH)
this.StringIdentifier = fmt.Sprintf("%x", this.Identifier) copy(data[:signatureStart], msg)
if len(optionalPrivateKey) == 1 { // add public key and signature
this.Type = PRIVATE_TYPE copy(data[signatureStart:signatureStart+ed25519.PublicKeySize], id.PublicKey)
this.PrivateKey = optionalPrivateKey[0] copy(data[signatureStart+ed25519.PublicKeySize:], signature)
} else {
this.Type = PUBLIC_TYPE return data
} }
return this // Verifies whether the data contains a valid signature of the message.
func (id *Identity) VerifySignature(data []byte) error {
signatureStart := len(data) - SIGNATURE_BYTE_LENGTH
if signatureStart <= 0 {
return ErrInvalidDataLen
} }
func (this *Identity) Sign(data []byte) ([]byte, error) { msg := data[:signatureStart]
sha256Hasher := sha256.New()
sha256Hasher.Write(data)
sig, err := secp256k1.Sign(sha256Hasher.Sum(nil), this.PrivateKey) // ignore the public key
if err != nil { sig := data[signatureStart+ed25519.PublicKeySize:]
return nil, err
if !ed25519.Verify(id.PublicKey, msg, sig) {
return ErrInvalidSignature
}
return nil
} }
return sig, nil // Returns the identitiy derived from the signed message.
func FromSignedData(data []byte) (*Identity, error) {
signatureStart := len(data) - SIGNATURE_BYTE_LENGTH
if signatureStart <= 0 {
return nil, ErrInvalidDataLen
} }
func (this *Identity) VerifySignature(data []byte, signature []byte) bool { pubKey := data[signatureStart : signatureStart+ed25519.PublicKeySize]
sha256Hasher := sha256.New()
sha256Hasher.Write(data)
return secp256k1.VerifySignature(this.PublicKey, sha256Hasher.Sum(nil), signature[:64]) identity := NewPublicIdentity(pubKey)
if err := identity.VerifySignature(data); err != nil {
return nil, err
} }
func GenerateRandomIdentity() *Identity { return identity, nil
// generate key pair
keyPair, err := ecdsa.GenerateKey(secp256k1.S256(), rand.Reader)
if err != nil {
panic(err)
} }
// build public key bytes func (id *Identity) Marshal() []byte {
publicKey := elliptic.Marshal(secp256k1.S256(), keyPair.X, keyPair.Y) data := make([]byte, MARSHALED_IDENTITY_TOTAL_SIZE)
// build private key bytes copy(data[MARSHALED_IDENTITY_PUBLIC_KEY_START:MARSHALED_IDENTITY_PUBLIC_KEY_END], id.PublicKey)
privkey := make([]byte, 32) copy(data[MARSHALED_IDENTITY_PRIVATE_KEY_START:MARSHALED_IDENTITY_PRIVATE_KEY_END], id.privateKey)
blob := keyPair.D.Bytes()
copy(privkey[32-len(blob):], blob)
return NewIdentity(publicKey, privkey) return data
} }
func FromSignedData(data []byte, signature []byte) (*Identity, error) { func Unmarshal(data []byte) (*Identity, error) {
sha256Hasher := sha256.New() if len(data) != MARSHALED_IDENTITY_TOTAL_SIZE {
sha256Hasher.Write(data) return nil, ErrInvalidDataLen
}
pubKey, err := secp256k1.RecoverPubkey(sha256Hasher.Sum(nil), signature) publicKey := data[MARSHALED_IDENTITY_PUBLIC_KEY_START:MARSHALED_IDENTITY_PUBLIC_KEY_END]
if err != nil { privateKey := data[MARSHALED_IDENTITY_PRIVATE_KEY_START:MARSHALED_IDENTITY_PRIVATE_KEY_END]
return nil, err
return newPrivateIdentity(publicKey, privateKey), nil
} }
return NewIdentity(pubKey), nil func newPrivateIdentity(publicKey []byte, privateKey []byte) *Identity {
identity := NewPublicIdentity(publicKey)
identity.privateKey = privateKey
return identity
} }
package network package network
import ( import (
"github.com/iotaledger/goshimmer/packages/events" "github.com/iotaledger/hive.go/events"
) )
type BufferedConnectionEvents struct { type BufferedConnectionEvents struct {
......
...@@ -6,7 +6,7 @@ import ( ...@@ -6,7 +6,7 @@ import (
"sync" "sync"
"time" "time"
"github.com/iotaledger/goshimmer/packages/events" "github.com/iotaledger/hive.go/events"
) )
type ManagedConnection struct { type ManagedConnection struct {
......
...@@ -5,7 +5,7 @@ import ( ...@@ -5,7 +5,7 @@ import (
"strconv" "strconv"
"sync" "sync"
"github.com/iotaledger/goshimmer/packages/events" "github.com/iotaledger/hive.go/events"
"github.com/iotaledger/goshimmer/packages/network" "github.com/iotaledger/goshimmer/packages/network"
) )
......
package tcp package tcp
import ( import (
"github.com/iotaledger/goshimmer/packages/events" "github.com/iotaledger/hive.go/events"
"github.com/iotaledger/goshimmer/packages/network" "github.com/iotaledger/goshimmer/packages/network"
) )
......
...@@ -3,7 +3,7 @@ package udp ...@@ -3,7 +3,7 @@ package udp
import ( import (
"net" "net"
"github.com/iotaledger/goshimmer/packages/events" "github.com/iotaledger/hive.go/events"
) )
type serverEvents struct { type serverEvents struct {
......
...@@ -5,7 +5,7 @@ import ( ...@@ -5,7 +5,7 @@ import (
"strconv" "strconv"
"sync" "sync"
"github.com/iotaledger/goshimmer/packages/events" "github.com/iotaledger/hive.go/events"
) )
type Server struct { type Server struct {
......
package node package node
import ( import (
"github.com/iotaledger/goshimmer/packages/events" "github.com/iotaledger/hive.go/events"
) )
type pluginEvents struct { type pluginEvents struct {
......
...@@ -4,7 +4,7 @@ import ( ...@@ -4,7 +4,7 @@ import (
"strings" "strings"
"sync" "sync"
"github.com/iotaledger/goshimmer/packages/events" "github.com/iotaledger/hive.go/events"
"github.com/iotaledger/goshimmer/packages/parameter" "github.com/iotaledger/goshimmer/packages/parameter"
) )
......
package parameter package parameter
import ( import (
"github.com/iotaledger/goshimmer/packages/events" "github.com/iotaledger/hive.go/events"
) )
var Events = struct { var Events = struct {
......
...@@ -4,9 +4,10 @@ import ( ...@@ -4,9 +4,10 @@ import (
"net" "net"
"time" "time"
"github.com/iotaledger/autopeering-sim/discover"
"github.com/iotaledger/autopeering-sim/selection"
"github.com/iotaledger/goshimmer/packages/accountability" "github.com/iotaledger/goshimmer/packages/accountability"
"github.com/iotaledger/goshimmer/packages/daemon" "github.com/iotaledger/goshimmer/packages/daemon"
"github.com/iotaledger/goshimmer/packages/events"
"github.com/iotaledger/goshimmer/packages/network" "github.com/iotaledger/goshimmer/packages/network"
"github.com/iotaledger/goshimmer/packages/node" "github.com/iotaledger/goshimmer/packages/node"
"github.com/iotaledger/goshimmer/packages/timeutil" "github.com/iotaledger/goshimmer/packages/timeutil"
...@@ -14,10 +15,7 @@ import ( ...@@ -14,10 +15,7 @@ import (
"github.com/iotaledger/goshimmer/plugins/analysis/types/connectnodes" "github.com/iotaledger/goshimmer/plugins/analysis/types/connectnodes"
"github.com/iotaledger/goshimmer/plugins/analysis/types/disconnectnodes" "github.com/iotaledger/goshimmer/plugins/analysis/types/disconnectnodes"
"github.com/iotaledger/goshimmer/plugins/analysis/types/ping" "github.com/iotaledger/goshimmer/plugins/analysis/types/ping"
"github.com/iotaledger/goshimmer/plugins/autopeering/instances/acceptedneighbors" "github.com/iotaledger/hive.go/events"
"github.com/iotaledger/goshimmer/plugins/autopeering/instances/chosenneighbors"
"github.com/iotaledger/goshimmer/plugins/autopeering/instances/knownpeers"
"github.com/iotaledger/goshimmer/plugins/autopeering/types/peer"
) )
func Run(plugin *node.Plugin) { func Run(plugin *node.Plugin) {
...@@ -63,7 +61,7 @@ func getEventDispatchers(conn *network.ManagedConnection) *EventDispatchers { ...@@ -63,7 +61,7 @@ func getEventDispatchers(conn *network.ManagedConnection) *EventDispatchers {
} }
func reportCurrentStatus(eventDispatchers *EventDispatchers) { func reportCurrentStatus(eventDispatchers *EventDispatchers) {
eventDispatchers.AddNode(accountability.OwnId().Identifier) eventDispatchers.AddNode(accountability.OwnId().Identifier.Bytes())
reportChosenNeighbors(eventDispatchers) reportChosenNeighbors(eventDispatchers)
} }
...@@ -71,43 +69,38 @@ func reportCurrentStatus(eventDispatchers *EventDispatchers) { ...@@ -71,43 +69,38 @@ func reportCurrentStatus(eventDispatchers *EventDispatchers) {
func setupHooks(conn *network.ManagedConnection, eventDispatchers *EventDispatchers) { func setupHooks(conn *network.ManagedConnection, eventDispatchers *EventDispatchers) {
// define hooks //////////////////////////////////////////////////////////////////////////////////////////////////// // define hooks ////////////////////////////////////////////////////////////////////////////////////////////////////
onDiscoverPeer := events.NewClosure(func(p *peer.Peer) { onDiscoverPeer := events.NewClosure(func(ev *discover.DiscoveredEvent) {
go eventDispatchers.AddNode(p.GetIdentity().Identifier) go eventDispatchers.AddNode(ev.Peer.ID().Bytes())
}) })
onAddAcceptedNeighbor := events.NewClosure(func(p *peer.Peer) { onAddAcceptedNeighbor := events.NewClosure(func(ev *selection.PeeringEvent) {
eventDispatchers.ConnectNodes(p.GetIdentity().Identifier, accountability.OwnId().Identifier) eventDispatchers.ConnectNodes(ev.Peer.ID().Bytes(), accountability.OwnId().Identifier.Bytes())
}) })
onRemoveAcceptedNeighbor := events.NewClosure(func(p *peer.Peer) { onRemoveNeighbor := events.NewClosure(func(ev *selection.DroppedEvent) {
eventDispatchers.DisconnectNodes(p.GetIdentity().Identifier, accountability.OwnId().Identifier) eventDispatchers.DisconnectNodes(ev.DroppedID.Bytes(), accountability.OwnId().Identifier.Bytes())
eventDispatchers.DisconnectNodes(accountability.OwnId().Identifier.Bytes(), ev.DroppedID.Bytes())
}) })
onAddChosenNeighbor := events.NewClosure(func(p *peer.Peer) { onAddChosenNeighbor := events.NewClosure(func(ev *selection.PeeringEvent) {
eventDispatchers.ConnectNodes(accountability.OwnId().Identifier, p.GetIdentity().Identifier) eventDispatchers.ConnectNodes(accountability.OwnId().Identifier.Bytes(), ev.Peer.ID().Bytes())
})
onRemoveChosenNeighbor := events.NewClosure(func(p *peer.Peer) {
eventDispatchers.DisconnectNodes(accountability.OwnId().Identifier, p.GetIdentity().Identifier)
}) })
// setup hooks ///////////////////////////////////////////////////////////////////////////////////////////////////// // setup hooks /////////////////////////////////////////////////////////////////////////////////////////////////////
knownpeers.INSTANCE.Events.Add.Attach(onDiscoverPeer) discover.Events.PeerDiscovered.Attach(onDiscoverPeer)
acceptedneighbors.INSTANCE.Events.Add.Attach(onAddAcceptedNeighbor) selection.Events.IncomingPeering.Attach(onAddAcceptedNeighbor)
acceptedneighbors.INSTANCE.Events.Remove.Attach(onRemoveAcceptedNeighbor) selection.Events.OutgoingPeering.Attach(onAddChosenNeighbor)
chosenneighbors.INSTANCE.Events.Add.Attach(onAddChosenNeighbor) selection.Events.Dropped.Attach(onRemoveNeighbor)
chosenneighbors.INSTANCE.Events.Remove.Attach(onRemoveChosenNeighbor)
// clean up hooks on close ///////////////////////////////////////////////////////////////////////////////////////// // clean up hooks on close /////////////////////////////////////////////////////////////////////////////////////////
var onClose *events.Closure var onClose *events.Closure
onClose = events.NewClosure(func() { onClose = events.NewClosure(func() {
knownpeers.INSTANCE.Events.Add.Detach(onDiscoverPeer) discover.Events.PeerDiscovered.Detach(onDiscoverPeer)
acceptedneighbors.INSTANCE.Events.Add.Detach(onAddAcceptedNeighbor) selection.Events.IncomingPeering.Detach(onAddAcceptedNeighbor)
acceptedneighbors.INSTANCE.Events.Remove.Detach(onRemoveAcceptedNeighbor) selection.Events.OutgoingPeering.Detach(onAddChosenNeighbor)
chosenneighbors.INSTANCE.Events.Add.Detach(onAddChosenNeighbor) selection.Events.Dropped.Detach(onRemoveNeighbor)
chosenneighbors.INSTANCE.Events.Remove.Detach(onRemoveChosenNeighbor)
conn.Events.Close.Detach(onClose) conn.Events.Close.Detach(onClose)
}) })
...@@ -115,12 +108,12 @@ func setupHooks(conn *network.ManagedConnection, eventDispatchers *EventDispatch ...@@ -115,12 +108,12 @@ func setupHooks(conn *network.ManagedConnection, eventDispatchers *EventDispatch
} }
func reportChosenNeighbors(dispatchers *EventDispatchers) { func reportChosenNeighbors(dispatchers *EventDispatchers) {
for _, chosenNeighbor := range chosenneighbors.INSTANCE.Peers.GetMap() { // for _, chosenNeighbor := range chosenneighbors.INSTANCE.Peers.GetMap() {
dispatchers.AddNode(chosenNeighbor.GetIdentity().Identifier) // dispatchers.AddNode(chosenNeighbor.GetIdentity().Identifier)
} // }
for _, chosenNeighbor := range chosenneighbors.INSTANCE.Peers.GetMap() { // for _, chosenNeighbor := range chosenneighbors.INSTANCE.Peers.GetMap() {
dispatchers.ConnectNodes(accountability.OwnId().Identifier, chosenNeighbor.GetIdentity().Identifier) // dispatchers.ConnectNodes(accountability.OwnId().Identifier, chosenNeighbor.GetIdentity().Identifier)
} // }
} }
func keepConnectionAlive(conn *network.ManagedConnection) bool { func keepConnectionAlive(conn *network.ManagedConnection) bool {
......
...@@ -2,7 +2,7 @@ package analysis ...@@ -2,7 +2,7 @@ package analysis
import ( import (
"github.com/iotaledger/goshimmer/packages/daemon" "github.com/iotaledger/goshimmer/packages/daemon"
"github.com/iotaledger/goshimmer/packages/events" "github.com/iotaledger/hive.go/events"
"github.com/iotaledger/goshimmer/packages/node" "github.com/iotaledger/goshimmer/packages/node"
"github.com/iotaledger/goshimmer/plugins/analysis/client" "github.com/iotaledger/goshimmer/plugins/analysis/client"
"github.com/iotaledger/goshimmer/plugins/analysis/server" "github.com/iotaledger/goshimmer/plugins/analysis/server"
......
package server package server
import ( import (
"github.com/iotaledger/goshimmer/packages/events" "github.com/iotaledger/hive.go/events"
) )
var Events = struct { var Events = struct {
......
...@@ -6,7 +6,7 @@ import ( ...@@ -6,7 +6,7 @@ import (
"strconv" "strconv"
"github.com/iotaledger/goshimmer/packages/daemon" "github.com/iotaledger/goshimmer/packages/daemon"
"github.com/iotaledger/goshimmer/packages/events" "github.com/iotaledger/hive.go/events"
"github.com/iotaledger/goshimmer/packages/network" "github.com/iotaledger/goshimmer/packages/network"
"github.com/iotaledger/goshimmer/packages/network/tcp" "github.com/iotaledger/goshimmer/packages/network/tcp"
"github.com/iotaledger/goshimmer/packages/node" "github.com/iotaledger/goshimmer/packages/node"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment