Added comments and updated readme

This commit is contained in:
Aviv Eyal 2017-11-29 13:18:40 +02:00 committed by Steven Allen
parent 2dbb78f88f
commit a13480f00a
4 changed files with 22 additions and 5 deletions

View File

@ -33,10 +33,19 @@ The example creates two LibP2P Hosts supporting 2 protocols: ping and echo.
Each protocol consists RPC-style requests and respones and each request and response is a typed protobufs message (and a go data object). Each protocol consists RPC-style requests and respones and each request and response is a typed protobufs message (and a go data object).
This is a different pattern then defining a whole p2p protocol as 1 protobuf message with lots of optional fields (as can be observed in various p2p-lib protocols using protobufs such as dht). This is a different pattern then defining a whole p2p protocol as one protobuf message with lots of optional fields (as can be observed in various p2p-lib protocols using protobufs such as dht).
The example shows how to match async received responses with their requests. This is useful when processing a response requires access to the request data. The example shows how to match async received responses with their requests. This is useful when processing a response requires access to the request data.
The idea is to use lib-p2p protocol multiplexing on a per-message basis.
### Features
1. 2 fully implemented protocols using an RPC-like request-response pattern - Ping and Echo
2. Scaffolding for quickly implementing new app-level versioned RPC-like protocols
3. Full authentication of incoming message data by author (who might not be the message's sender peer)
4. Base p2p format in protobufs with fields shared by all protocol messages
5. Full access to request data when processing a response.
## Author ## Author
@avive @avive

View File

@ -29,6 +29,10 @@ func NewEchoProtocol(node *Node, done chan bool) *EchoProtocol {
e := EchoProtocol{node: node, requests: make(map[string]*p2p.EchoRequest), done: done} e := EchoProtocol{node: node, requests: make(map[string]*p2p.EchoRequest), done: done}
node.SetStreamHandler(echoRequest, e.onEchoRequest) node.SetStreamHandler(echoRequest, e.onEchoRequest)
node.SetStreamHandler(echoResponse, e.onEchoResponse) node.SetStreamHandler(echoResponse, e.onEchoResponse)
// design note: to implement fire-and-forget style messages you may just skip specifying a response callback.
// a fire-and-forget message will just include a request and not specify a response object
return &e return &e
} }

View File

@ -35,6 +35,7 @@ func NewNode(host host.Host, done chan bool) *Node {
func (n *Node) authenticateMessage(message proto.Message, data *p2p.MessageData) bool { func (n *Node) authenticateMessage(message proto.Message, data *p2p.MessageData) bool {
// store a temp ref to signature and remove it from message data // store a temp ref to signature and remove it from message data
// sign is a string to allow easy reset to zero-value (empty string)
sign := data.Sign sign := data.Sign
data.Sign = "" data.Sign = ""

View File

@ -30,7 +30,8 @@ message PingResponse {
// response specific data // response specific data
string message = 2; string message = 2;
// ... add any data here
// ... add any additional message data here
} }
//// echo protocol //// echo protocol
@ -41,7 +42,8 @@ message EchoRequest {
// method specific data // method specific data
string message = 2; string message = 2;
// add any data here....
// add any additional message data here....
} }
message EchoResponse { message EchoResponse {
@ -49,5 +51,6 @@ message EchoResponse {
// response specific data // response specific data
string message = 2; string message = 2;
// ... add any data here
// ... add any additional message data here....
} }