code: func (b *Bzz) runBzz(p *p2p.Peer, rw p2p.MsgReadWriter) error {
  	handshake, _ := b.GetOrCreateHandshake(p.ID())
  	if !<-handshake.init {
  		return fmt.Errorf("%08x: bzz already started on peer %08x", b.localAddr.Over()[:4], p.ID().Bytes()[:4])
  	}
  	close(handshake.init)
  	defer b.removeHandshake(p.ID())
  	peer := protocols.NewPeer(p, rw, BzzSpec)
  	err := b.performHandshake(peer, handshake)
  	if err != nil {
  		log.Warn(fmt.Sprintf("%08x: handshake failed with remote peer %08x: %v", b.localAddr.Over()[:4], p.ID().Bytes()[:4], err))
  
  		return err
  	}
  	// fail if we get another handshake
  	msg, err := rw.ReadMsg()
  	if err != nil {
  		return err
  	}
  	msg.Discard()
  	return errors.New("received multiple handshakes")
  }
docs: // runBzz is the p2p protocol run function for the bzz base protocol
  // that negotiates the bzz handshake