diff --git a/p2p/peer.go b/p2p/peer.go index af019d07a8..79a0aa9e2a 100644 --- a/p2p/peer.go +++ b/p2p/peer.go @@ -345,6 +345,17 @@ outer: return result } +func (p *Peer) GetRW(name string, version uint) (MsgReadWriter, error) { + for _, proto := range p.running { + if proto.Name == name && proto.Version == version { + var rw MsgReadWriter = proto + return rw, nil + } + } + + return nil, errors.New("not found") +} + func (p *Peer) startProtocols(writeStart <-chan struct{}, writeErr chan<- error) { p.wg.Add(len(p.running)) for _, proto := range p.running { diff --git a/p2p/protocols/protocol.go b/p2p/protocols/protocol.go index f25ae1b3bf..a54114b214 100644 --- a/p2p/protocols/protocol.go +++ b/p2p/protocols/protocol.go @@ -223,10 +223,15 @@ func NewPeer(p *p2p.Peer, rw p2p.MsgReadWriter, spec *Spec) *Peer { } // ClonePeer constructs a peer object with an arbitrary Spec, based on an existing Peer +// if Peer doesn't support Spec, it returns nil func ClonePeer(p *Peer, spec *Spec) *Peer { + rw, err := p.Peer.GetRW(spec.Name, spec.Version) + if err != nil { + return nil + } return &Peer{ Peer: p.Peer, - rw: p.rw, + rw: rw, spec: spec, } }