forked from cerc-io/plugeth
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()),
|
||
|
}
|
||
|
}
|