You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
2.5 KiB

10 years ago
10 years ago
  1. # `tendermint/p2p`
  2. `tendermint/p2p` provides an abstraction around peer-to-peer communication.<br/>
  3. ## Peer/MConnection/Channel
  4. Each peer has one `MConnection` (multiplex connection) instance.
  5. __multiplex__ *noun* a system or signal involving simultaneous transmission of
  6. several messages along a single channel of communication.
  7. Each `MConnection` handles message transmission on multiple abstract communication
  8. `Channel`s. Each channel has a globally unique byte id.
  9. The byte id and the relative priorities of each `Channel` are configured upon
  10. initialization of the connection.
  11. There are two methods for sending messages:
  12. ```go
  13. func (m MConnection) Send(chId byte, msg interface{}) bool {}
  14. func (m MConnection) TrySend(chId byte, msg interface{}) bool {}
  15. ```
  16. `Send(chId, msg)` is a blocking call that waits until `msg` is successfully queued
  17. for the channel with the given id byte `chId`. The message `msg` is serialized
  18. using the `tendermint/binary` submodule's `WriteBinary()` reflection routine.
  19. `TrySend(chId, msg)` is a nonblocking call that returns false if the channel's
  20. queue is full.
  21. `Send()` and `TrySend()` are also exposed for each `Peer`.
  22. ## Switch/Reactor
  23. The `Switch` handles peer connections and exposes an API to receive incoming messages
  24. on `Reactors`. Each `Reactor` is responsible for handling incoming messages of one
  25. or more `Channels`. So while sending outgoing messages is typically performed on the peer,
  26. incoming messages are received on the reactor.
  27. ```go
  28. // Declare a MyReactor reactor that handles messages on MyChannelId.
  29. type MyReactor struct{}
  30. func (reactor MyReactor) GetChannels() []*ChannelDescriptor {
  31. return []*ChannelDescriptor{ChannelDescriptor{Id:MyChannelId, Priority: 1}}
  32. }
  33. func (reactor MyReactor) Receive(chId byte, peer *Peer, msgBytes []byte) {
  34. r, n, err := bytes.NewBuffer(msgBytes), new(int64), new(error)
  35. msgString := ReadString(r, n, err)
  36. fmt.Println(msgString)
  37. }
  38. // Other Reactor methods omitted for brevity
  39. ...
  40. switch := NewSwitch([]Reactor{MyReactor{}})
  41. ...
  42. // Send a random message to all outbound connections
  43. for _, peer := range switch.Peers().List() {
  44. if peer.IsOutbound() {
  45. peer.Send(MyChannelId, "Here's a random message")
  46. }
  47. }
  48. ```
  49. ### PexReactor/AddrBook
  50. A `PEXReactor` reactor implementation is provided to automate peer discovery.
  51. ```go
  52. book := p2p.NewAddrBook(config.App.GetString("AddrBookFile"))
  53. pexReactor := p2p.NewPEXReactor(book)
  54. ...
  55. switch := NewSwitch([]Reactor{pexReactor, myReactor, ...})
  56. ```