94 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			94 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|   | package network | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"fmt" | ||
|  | 	"io" | ||
|  | 
 | ||
|  | 	"github.com/ethereum/go-ethereum/p2p" | ||
|  | 	"github.com/ethereum/go-ethereum/p2p/enode" | ||
|  | 	"github.com/ethereum/go-ethereum/p2p/protocols" | ||
|  | 	"github.com/ethereum/go-ethereum/rlp" | ||
|  | 	"github.com/ethereum/go-ethereum/swarm/log" | ||
|  | ) | ||
|  | 
 | ||
|  | // ENRAddrEntry is the entry type to store the bzz key in the enode | ||
|  | type ENRAddrEntry struct { | ||
|  | 	data []byte | ||
|  | } | ||
|  | 
 | ||
|  | func NewENRAddrEntry(addr []byte) *ENRAddrEntry { | ||
|  | 	return &ENRAddrEntry{ | ||
|  | 		data: addr, | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | func (b ENRAddrEntry) Address() []byte { | ||
|  | 	return b.data | ||
|  | } | ||
|  | 
 | ||
|  | // ENRKey implements enr.Entry | ||
|  | func (b ENRAddrEntry) ENRKey() string { | ||
|  | 	return "bzzkey" | ||
|  | } | ||
|  | 
 | ||
|  | // EncodeRLP implements rlp.Encoder | ||
|  | func (b ENRAddrEntry) EncodeRLP(w io.Writer) error { | ||
|  | 	log.Debug("in encoderlp", "b", b, "p", fmt.Sprintf("%p", &b)) | ||
|  | 	return rlp.Encode(w, &b.data) | ||
|  | } | ||
|  | 
 | ||
|  | // DecodeRLP implements rlp.Decoder | ||
|  | func (b *ENRAddrEntry) DecodeRLP(s *rlp.Stream) error { | ||
|  | 	byt, err := s.Bytes() | ||
|  | 	if err != nil { | ||
|  | 		return err | ||
|  | 	} | ||
|  | 	b.data = byt | ||
|  | 	log.Debug("in decoderlp", "b", b, "p", fmt.Sprintf("%p", &b)) | ||
|  | 	return nil | ||
|  | } | ||
|  | 
 | ||
|  | type ENRLightNodeEntry bool | ||
|  | 
 | ||
|  | func (b ENRLightNodeEntry) ENRKey() string { | ||
|  | 	return "bzzlightnode" | ||
|  | } | ||
|  | 
 | ||
|  | type ENRBootNodeEntry bool | ||
|  | 
 | ||
|  | func (b ENRBootNodeEntry) ENRKey() string { | ||
|  | 	return "bzzbootnode" | ||
|  | } | ||
|  | 
 | ||
|  | func getENRBzzPeer(p *p2p.Peer, rw p2p.MsgReadWriter, spec *protocols.Spec) *BzzPeer { | ||
|  | 	var lightnode ENRLightNodeEntry | ||
|  | 	var bootnode ENRBootNodeEntry | ||
|  | 
 | ||
|  | 	// retrieve the ENR Record data | ||
|  | 	record := p.Node().Record() | ||
|  | 	record.Load(&lightnode) | ||
|  | 	record.Load(&bootnode) | ||
|  | 
 | ||
|  | 	// get the address; separate function as long as we need swarm/network:NewAddr() to call it | ||
|  | 	addr := getENRBzzAddr(p.Node()) | ||
|  | 
 | ||
|  | 	// build the peer using the retrieved data | ||
|  | 	return &BzzPeer{ | ||
|  | 		Peer:      protocols.NewPeer(p, rw, spec), | ||
|  | 		LightNode: bool(lightnode), | ||
|  | 		BzzAddr:   addr, | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | func getENRBzzAddr(nod *enode.Node) *BzzAddr { | ||
|  | 	var addr ENRAddrEntry | ||
|  | 
 | ||
|  | 	record := nod.Record() | ||
|  | 	record.Load(&addr) | ||
|  | 
 | ||
|  | 	return &BzzAddr{ | ||
|  | 		OAddr: addr.data, | ||
|  | 		UAddr: []byte(nod.String()), | ||
|  | 	} | ||
|  | } |