p2p

package
v0.0.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 23, 2019 License: MIT Imports: 31 Imported by: 0

Documentation

Index

Constants

View Source
const (
	QlcProtocolID    = "qlc/1.0.0"
	QlcProtocolFOUND = "/qlc/discovery/1.0.0"

	EachTimeFoundPeersLimit = 20
)
View Source
const (
	QlcMessageHeaderLength         = 22
	QlcMessageMagicNumberEndIdx    = 3
	QlcMessageVersionEndIdx        = 4
	QlcMessageTypeEndIdx           = 6
	QlcMessageDataLengthEndIdx     = 10
	QlcMessageReservedEndIdx       = 14
	QlcMessageHeaderCheckSumEndIdx = 18
	QlcMessageDataCheckSumEndIdx   = 22
)
View Source
const (
	PublishReq      = "0" //PublishReq
	ConfirmReq      = "1" //ConfirmReq
	ConfirmAck      = "2" //ConfirmAck
	FrontierRequest = "3" //frontierreq
	FrontierRsp     = "4" //frontierrsp
	BulkPullRequest = "5" //bulkpull
	BulkPullRsp     = "6" //bulkpullrsp
	BulkPushBlock   = "7" //bulkpushblock
)

Message Type

View Source
const (
	PingSize = 32
	ID       = "/qlc/ping/1.0.0"
)
View Source
const (
	FindPeerInterval = time.Second * 30
)

const

View Source
const (
	SyncInterval = time.Minute * 2
)

Variables

View Source
var (
	ErrInvalidMessageHeaderLength = errors.New("invalid message header length")
	ErrInvalidMessageDataLength   = errors.New("invalid message data length")
	ErrInvalidMagicNumber         = errors.New("invalid magic number")
	ErrInvalidHeaderCheckSum      = errors.New("invalid header checksum")
	ErrInvalidDataCheckSum        = errors.New("invalid data checksum")
)

Error types

View Source
var (
	ErrShouldCloseConnectionAndExitLoop = errors.New("should close connection and exit loop")
	ErrStreamIsNotConnected             = errors.New("stream is not connected")
	ErrNoStream                         = errors.New("no stream")
)

Stream Errors

View Source
var (
	ErrPeerIsNotConnected = errors.New("peer is not connected")
)

Error types

View Source
var (
	MagicNumber = []byte{0x51, 0x4C, 0x43} //QLC
)

Functions

func Equal

func Equal(a []byte, b []byte) bool

Equal checks whether byte slice a and b are equal.

func FromUint32

func FromUint32(v uint32) []byte

FromUint32 decodes uint32.

func NewQlcMessage

func NewQlcMessage(data []byte, currentVersion byte, messagetype string) []byte

NewQlcMessage new qlc message

func Ping

func Ping(ctx context.Context, h host.Host, p peer.ID) (<-chan time.Duration, error)

func Uint32

func Uint32(data []byte) uint32

Uint32 encodes []byte.

Types

type BaseMessage

type BaseMessage struct {
	// contains filtered or unexported fields
}

BaseMessage base message

func (*BaseMessage) Data

func (msg *BaseMessage) Data() []byte

Data get the message data

func (*BaseMessage) Hash

func (msg *BaseMessage) Hash() string

Hash return the message hash

func (*BaseMessage) MessageFrom

func (msg *BaseMessage) MessageFrom() string

MessageFrom get message who send

func (*BaseMessage) MessageType

func (msg *BaseMessage) MessageType() MessageType

MessageType get message type

func (*BaseMessage) String

func (msg *BaseMessage) String() string

String get the message to string

type DiscoveryOption

type DiscoveryOption func(context.Context, host.Host) (localdiscovery.Service, error)

type Dispatcher

type Dispatcher struct {
	// contains filtered or unexported fields
}

Dispatcher a message dispatcher service.

func NewDispatcher

func NewDispatcher() *Dispatcher

NewDispatcher create Dispatcher instance.

func (*Dispatcher) Deregister

func (dp *Dispatcher) Deregister(subscribers ...*Subscriber)

Deregister deregister subscribers.

func (*Dispatcher) PutMessage

func (dp *Dispatcher) PutMessage(msg Message)

PutMessage put new message to chan, then subscribers will be notified to process.

func (*Dispatcher) Register

func (dp *Dispatcher) Register(subscribers ...*Subscriber)

Register register subscribers.

func (*Dispatcher) Start

func (dp *Dispatcher) Start()

Start start message dispatch goroutine.

func (*Dispatcher) Stop

func (dp *Dispatcher) Stop()

Stop stop goroutine.

type Event

type Event struct {
	// contains filtered or unexported fields
}

func NewEvent

func NewEvent() *Event

func (*Event) Notify

func (e *Event) Notify(eventtype EventType, value interface{}) (err error)

Notify subscribers that Subscribe specified event

func (*Event) NotifyAll

func (e *Event) NotifyAll() (errs []error)

Notify all event subscribers

func (*Event) NotifySubscriber

func (e *Event) NotifySubscriber(eventfunc EventFunc, value interface{})

func (*Event) Subscribe

func (e *Event) Subscribe(eventtype EventType, eventfunc EventFunc) EventSubscriber

adds a new subscriber to Event.

func (*Event) UnSubscribe

func (e *Event) UnSubscribe(eventtype EventType, subscriber EventSubscriber) (err error)

UnSubscribe removes the specified subscriber

type EventFunc

type EventFunc func(v interface{})

type EventQueue

type EventQueue struct {
	Consensus *Event
}

func NeweventQueue

func NeweventQueue() *EventQueue

func (*EventQueue) GetEvent

func (eq *EventQueue) GetEvent(eventName string) *Event

type EventSubscriber

type EventSubscriber chan interface{}

type EventType

type EventType int16
const (
	EventPublish        EventType = 0
	EventConfirmReq     EventType = 1
	EventConfirmAck     EventType = 2
	EventSyncBlock      EventType = 3
	EventConfirmedBlock EventType = 4
)

Event Type

type Message

type Message interface {
	MessageType() MessageType
	MessageFrom() string
	Data() []byte
	Hash() string
}

Message interface for message.

func NewBaseMessage

func NewBaseMessage(messageType MessageType, from string, data []byte) Message

NewBaseMessage new base message

type MessageService

type MessageService struct {
	// contains filtered or unexported fields
}

func NewMessageService

func NewMessageService(netService *QlcService, ledger *ledger.Ledger) *MessageService

NewService return new Service.

func (*MessageService) Start

func (ms *MessageService) Start()

Start start message service.

func (*MessageService) Stop

func (ms *MessageService) Stop()

type MessageType

type MessageType string

MessageType a string for message type.

type PeersSlice

type PeersSlice []interface{}

PeersSlice is a slice which contains peers

type PingService

type PingService struct {
	Host host.Host
	// contains filtered or unexported fields
}

func NewPingService

func NewPingService(h host.Host) *PingService

func (*PingService) Ping

func (ps *PingService) Ping(ctx context.Context, p peer.ID) (<-chan time.Duration, error)

func (*PingService) PingHandler

func (p *PingService) PingHandler(s inet.Stream)

type QlcMessage

type QlcMessage struct {
	// contains filtered or unexported fields
}

func ParseQlcMessage

func ParseQlcMessage(data []byte) (*QlcMessage, error)

ParseqlcMessage parse qlc message

func (*QlcMessage) DataCheckSum

func (message *QlcMessage) DataCheckSum() uint32

DataCheckSum return data checkSum

func (*QlcMessage) DataLength

func (message *QlcMessage) DataLength() uint32

DataLength return dataLength

func (*QlcMessage) HeaderCheckSum

func (message *QlcMessage) HeaderCheckSum() uint32

HeaderCheckSum return header checkSum

func (*QlcMessage) HeaderData

func (message *QlcMessage) HeaderData() []byte

HeaderData return HeaderData

func (*QlcMessage) MagicNumber

func (message *QlcMessage) MagicNumber() []byte

MagicNumber return magicNumber

func (*QlcMessage) MessageData

func (message *QlcMessage) MessageData() []byte

func (*QlcMessage) MessageType

func (message *QlcMessage) MessageType() MessageType

func (*QlcMessage) ParseMessageData

func (message *QlcMessage) ParseMessageData(data []byte) error

ParseMessageData parse qlc message data

func (*QlcMessage) Reserved

func (message *QlcMessage) Reserved() []byte

Reserved return reserved

func (*QlcMessage) VerifyData

func (message *QlcMessage) VerifyData() error

VerifyData verify qlc message data

func (*QlcMessage) VerifyHeader

func (message *QlcMessage) VerifyHeader() error

VerifyHeader verify qlc message header

func (*QlcMessage) Version

func (message *QlcMessage) Version() byte

type QlcNode

type QlcNode struct {
	ID peer.ID
	// contains filtered or unexported fields
}

func NewNode

func NewNode(config *config.Config) (*QlcNode, error)

NewNode return new QlcNode according to the config.

func (*QlcNode) BroadcastMessage

func (node *QlcNode) BroadcastMessage(messageName string, data []byte)

BroadcastMessage broadcast message.

func (*QlcNode) GetID

func (node *QlcNode) GetID() string

ID return node ID.

func (*QlcNode) HandlePeerFound

func (node *QlcNode) HandlePeerFound(p pstore.PeerInfo)

HandlePeerFound attempts to connect to peer from `PeerInfo`.

func (*QlcNode) SendMessageToPeer

func (node *QlcNode) SendMessageToPeer(messageName string, data []byte, peerID string) error

SendMessageToPeer send message to a peer.

func (*QlcNode) SetQlcService

func (node *QlcNode) SetQlcService(ns *QlcService)

SetQlcService set netService

func (*QlcNode) StartServices

func (node *QlcNode) StartServices() error

func (*QlcNode) Stop

func (node *QlcNode) Stop()

Stop stop a node.

func (*QlcNode) StreamManager

func (node *QlcNode) StreamManager() *StreamManager

ID return node ID.

type QlcService

type QlcService struct {
	common.ServiceLifecycle
	// contains filtered or unexported fields
}

QlcService service for qlc p2p network

func NewQlcService

func NewQlcService(cfg *config.Config) (*QlcService, error)

NewQlcService create netService

func (*QlcService) Broadcast

func (ns *QlcService) Broadcast(name string, msg []byte)

Broadcast message.

func (*QlcService) Deregister

func (ns *QlcService) Deregister(subscribers ...*Subscriber)

Deregister Deregister the subscribers.

func (*QlcService) Init

func (ns *QlcService) Init() error

func (*QlcService) MessageEvent

func (ns *QlcService) MessageEvent() *EventQueue

EventQueue return EventQueue

func (*QlcService) Node

func (ns *QlcService) Node() *QlcNode

Node return the peer node

func (*QlcService) PutMessage

func (ns *QlcService) PutMessage(msg Message)

PutMessage put message to dispatcher.

func (*QlcService) Register

func (ns *QlcService) Register(subscribers ...*Subscriber)

Register register the subscribers.

func (*QlcService) SendMessageToPeer

func (ns *QlcService) SendMessageToPeer(messageName string, data []byte, peerID string) error

SendMessageToPeer send message to a peer.

func (*QlcService) Start

func (ns *QlcService) Start() error

Start start p2p manager.

func (*QlcService) Status

func (ns *QlcService) Status() int32

func (*QlcService) Stop

func (ns *QlcService) Stop() error

Stop stop p2p manager.

type Service

type Service interface {
	common.Service
	Node() *QlcNode
	MessageEvent() *EventQueue
	Broadcast(string, []byte)
	SendMessageToPeer(messageName string, data []byte, peerID string) error
}

Service net Service interface

type ServiceSync

type ServiceSync struct {
	// contains filtered or unexported fields
}

Service manage sync tasks

func NewSyncService

func NewSyncService(netService *QlcService, ledger *ledger.Ledger) *ServiceSync

NewService return new Service.

func (*ServiceSync) Start

func (ss *ServiceSync) Start()

func (*ServiceSync) Stop

func (ss *ServiceSync) Stop()

Stop sync service

type Stream

type Stream struct {
	// contains filtered or unexported fields
}

Stream define the structure of a stream in p2p network

func NewStream

func NewStream(stream libnet.Stream, node *QlcNode) *Stream

NewStream return a new Stream

func NewStreamFromPID

func NewStreamFromPID(pid peer.ID, node *QlcNode) *Stream

NewStreamFromPID return a new Stream based on the pid

func (*Stream) Connect

func (s *Stream) Connect() error

Connect to the stream

func (*Stream) IsConnected

func (s *Stream) IsConnected() bool

IsConnected return if the stream is connected

func (*Stream) SendMessage

func (s *Stream) SendMessage(messageType string, data []byte) error

SendMessage send msg to buffer

func (*Stream) StartLoop

func (s *Stream) StartLoop()

StartLoop start stream ping loop.

func (*Stream) String

func (s *Stream) String() string

func (*Stream) Write

func (s *Stream) Write(data []byte) error

func (*Stream) WriteQlcMessage

func (s *Stream) WriteQlcMessage(message []byte) error

WriteQlcMessage write qlc msg in the stream

type StreamManager

type StreamManager struct {
	// contains filtered or unexported fields
}

StreamManager manages all streams

func NewStreamManager

func NewStreamManager() *StreamManager

NewStreamManager return a new stream manager

func (*StreamManager) Add

func (sm *StreamManager) Add(s libnet.Stream)

Add a new stream into the stream manager

func (*StreamManager) AddStream

func (sm *StreamManager) AddStream(stream *Stream)

AddStream into the stream manager

func (*StreamManager) BroadcastMessage

func (sm *StreamManager) BroadcastMessage(messageName string, messageContent []byte)

BroadcastMessage broadcast the message

func (*StreamManager) CloseStream

func (sm *StreamManager) CloseStream(peerID string)

CloseStream with the given pid and reason

func (*StreamManager) CreateStreamWithPeer

func (sm *StreamManager) CreateStreamWithPeer(pid peer.ID)

CreateStreamWithPeer create stream with a peer.

func (*StreamManager) Find

func (sm *StreamManager) Find(pid peer.ID) *Stream

Find the stream with the given pid

func (*StreamManager) FindByPeerID

func (sm *StreamManager) FindByPeerID(peerID string) *Stream

FindByPeerID find the stream with the given peerID

func (*StreamManager) PeerCounts added in v0.0.4

func (sm *StreamManager) PeerCounts() int

func (*StreamManager) RandomPeer

func (sm *StreamManager) RandomPeer() (string, error)

func (*StreamManager) RemoveStream

func (sm *StreamManager) RemoveStream(s *Stream)

RemoveStream from the stream manager

func (*StreamManager) SetQlcNode

func (sm *StreamManager) SetQlcNode(node *QlcNode)

SetQlcService set netService

func (*StreamManager) Start

func (sm *StreamManager) Start()

Start stream manager service

func (*StreamManager) Stop

func (sm *StreamManager) Stop()

Stop stream manager service

type Subscriber

type Subscriber struct {
	// contains filtered or unexported fields
}

Subscriber subscriber.

func NewSubscriber

func NewSubscriber(id interface{}, msgChan chan Message, doFilter bool, msgType MessageType) *Subscriber

NewSubscriber return new Subscriber instance.

func (*Subscriber) DoFilter

func (s *Subscriber) DoFilter() bool

DoFilter return doFilter

func (*Subscriber) ID

func (s *Subscriber) ID() interface{}

ID return id.

func (*Subscriber) MessageChan

func (s *Subscriber) MessageChan() chan Message

MessageChan return msgChan.

func (*Subscriber) MessageType

func (s *Subscriber) MessageType() MessageType

MessageType return msgTypes.

Directories

Path Synopsis
pb

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL