我正在使用 libp2p Go 库来制作 p2p 网络堆栈。
我需要将消息单播给我网络上的其他对等方。我想将 AddrInfo 结构存储在我单播的消息中,以便我可以发回响应。
以下是 libp2p 库代码:
AddrInfo 结构包含
type ID string
// AddrInfo is a small struct used to pass around a peer with
// a set of addresses (and later, keys?).
type AddrInfo struct {
ID ID
Addrs []ma.Multiaddr
}
多地址如下
type Multiaddr interface {
json.Marshaler
json.Unmarshaler
encoding.TextMarshaler
encoding.TextUnmarshaler
encoding.BinaryMarshaler
encoding.BinaryUnmarshaler
}
这是我使用 libp2p 库的代码:
我像这样将它包含在我的消息结构中
func init() {
gob.Register(&Message{})
}
// Message stores a type of message and a body.
// The message is the data that gets passed between nodes when they communicate.
type Message struct {
ID string `json:"id"`
Body []byte `json:"body"` // the actual payload.
OriginNode peer.AddrInfo `json:"origin_node"` // the node that sent the message
}
// NewMessage builds up a new message.
func NewMessage(b []byte, o peer.AddrInfo) Message {
return Message{
ID: uuid.New().String(),
Body: b,
OriginNode: o,
}
}
// Marshal takes a node message and marshals it into an array of bytes.
func (m Message) Marshal() []byte {
var buf bytes.Buffer
enc := gob.NewEncoder(&buf)
if err := enc.Encode(m); err != nil {
zap.S().Fatal(err)
}
return buf.Bytes()
}
// UnmarshalMessage takes a slice of bytes and a returns a message struct.
func UnmarshalMessage(input []byte) (Message, error) {
msg := Message{}
buf := bytes.NewBuffer(input)
dec := gob.NewDecoder(buf)
if err := dec.Decode(&msg); err != nil {
return Message{}, err
}
return msg, nil
}
当我编组我的消息结构然后尝试解组时,我收到以下错误:
panic: interface conversion: interface is nil, not encoding.BinaryUnmarshaler [recovered] panic: interface conversion: interface is nil, not encoding.BinaryUnmarshaler UnmarshalMessage(0xc0001c7200, 0x454, 0x480, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
我无法编辑 libp2p 源代码,但需要在我的结构中添加 AddrInfo。