Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat:beacon rpc #64

Merged
merged 2 commits into from
Mar 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cmd/shisui/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ func TestGenConfig(t *testing.T) {
ctx := cli.NewContext(nil, flagSet, nil)
ctx.Command = command

config, err := getPortalHistoryConfig(ctx)
config, err := getPortalConfig(ctx)
require.NoError(t, err)

require.Equal(t, config.DataCapacity, size)
Expand Down
109 changes: 102 additions & 7 deletions cmd/shisui/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"crypto/ecdsa"
"fmt"
"net"
"net/http"
"strings"

"os"
Expand All @@ -16,8 +17,10 @@ import (
"github.com/ethereum/go-ethereum/p2p/discover"
"github.com/ethereum/go-ethereum/p2p/discover/portalwire"
"github.com/ethereum/go-ethereum/p2p/enode"
"github.com/ethereum/go-ethereum/portalnetwork/beacon"
"github.com/ethereum/go-ethereum/portalnetwork/history"
"github.com/ethereum/go-ethereum/portalnetwork/storage/sqlite"
"github.com/ethereum/go-ethereum/rpc"
"github.com/urfave/cli/v2"
)

Expand All @@ -36,6 +39,9 @@ var (
portalProtocolFlags = []cli.Flag{
utils.PortalUDPListenAddrFlag,
utils.PortalUDPPortFlag,
utils.PortalBootNodesFlag,
utils.PortalPrivateKeyFlag,
utils.PortalNetworksFlag,
}
historyRpcFlags = []cli.Flag{
utils.PortalRPCListenAddrFlag,
Expand All @@ -60,25 +66,77 @@ func main() {
}

func shisui(ctx *cli.Context) error {
config, err := getPortalHistoryConfig(ctx)
config, err := getPortalConfig(ctx)
if err != nil {
return nil
}

glogger := log.NewGlogHandler(log.NewTerminalHandler(os.Stderr, true))
slogVerbosity := log.FromLegacyLevel(config.LogLevel)
glogger.Verbosity(slogVerbosity)
log.SetDefault(log.NewLogger(glogger))
defaultLogger := log.NewLogger(glogger)
log.SetDefault(defaultLogger)

nodeId := enode.PubkeyToIDV4(&config.PrivateKey.PublicKey)
contentStorage, err := sqlite.NewContentStorage(config.DataCapacity, nodeId, config.DataDir)
if err != nil {
return err
}

addr, err := net.ResolveUDPAddr("udp", config.Protocol.ListenAddr)
if err != nil {
return err
}
conn, err := net.ListenUDP("udp", addr)
if err != nil {
return err
}

discCfg := discover.Config{
PrivateKey: config.PrivateKey,
NetRestrict: config.Protocol.NetRestrict,
Bootnodes: config.Protocol.BootstrapNodes,
Log: defaultLogger,
}

nodeDB, err := enode.OpenDB(config.Protocol.NodeDBPath)
if err != nil {
return err
}

localNode := enode.NewLocalNode(nodeDB, config.PrivateKey)
localNode.SetFallbackIP(net.IP{127, 0, 0, 1})
localNode.Set(discover.Tag)

var addrs []net.Addr
if config.Protocol.NodeIP != nil {
localNode.SetStaticIP(config.Protocol.NodeIP)
} else {
addrs, err = net.InterfaceAddrs()

if err != nil {
return err
}

for _, address := range addrs {
// check ip addr is loopback addr
if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
localNode.SetStaticIP(ipnet.IP)
break
}
}
}
}

discV5, err := discover.ListenV5(conn, localNode, discCfg)
if err != nil {
return err
}

contentQueue := make(chan *discover.ContentElement, 50)

protocol, err := discover.NewPortalProtocol(config.Protocol, string(portalwire.HistoryNetwork), config.PrivateKey, contentStorage, contentQueue)
historyProtocol, err := discover.NewPortalProtocol(config.Protocol, string(portalwire.HistoryNetwork), config.PrivateKey, conn, localNode, discV5, contentStorage, contentQueue)

if err != nil {
return err
Expand All @@ -89,19 +147,18 @@ func shisui(ctx *cli.Context) error {
return err
}

historyNetwork := history.NewHistoryNetwork(protocol, &accumulator)
historyNetwork := history.NewHistoryNetwork(historyProtocol, &accumulator)
err = historyNetwork.Start()
if err != nil {
return err
}
defer historyNetwork.Stop()

discover.StartHistoryRpcServer(protocol, config.RpcAddr)

startPortalRpcServer(discover.NewDiscV5API(discV5), discover.NewPortalAPI(historyProtocol), nil, config.RpcAddr)
return nil
}

func getPortalHistoryConfig(ctx *cli.Context) (*Config, error) {
func getPortalConfig(ctx *cli.Context) (*Config, error) {
config := &Config{
Protocol: discover.DefaultPortalProtocolConfig(),
}
Expand Down Expand Up @@ -167,3 +224,41 @@ func setPrivateKey(ctx *cli.Context, config *Config) error {
config.PrivateKey = privateKey
return nil
}

func startPortalRpcServer(discV5API *discover.DiscV5API, historyAPI *discover.PortalProtocolAPI, beaconAPI *discover.PortalProtocolAPI, addr string) error {
disv5 := discV5API

server := rpc.NewServer()
err := server.RegisterName("discv5", disv5)
if err != nil {
return err
}

var historyNetworkAPI *history.API
if historyAPI != nil {
historyNetworkAPI = history.NewHistoryNetworkAPI(historyAPI)
err = server.RegisterName("portal", historyNetworkAPI)

if err != nil {
return err
}
}

var beaconNetworkAPI *beacon.API
if beaconAPI != nil {
beaconNetworkAPI = beacon.NewBeaconNetworkAPI(beaconAPI)
err = server.RegisterName("portal", beaconNetworkAPI)

if err != nil {
return err
}
}

httpServer := &http.Server{
Addr: addr,
Handler: server,
}

httpServer.ListenAndServe()
return nil
}
9 changes: 7 additions & 2 deletions cmd/utils/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -948,7 +948,6 @@ Please note that --` + MetricsHTTPFlag.Name + ` must be set to start the server.
PortalRPCListenAddrFlag = &cli.StringFlag{
Name: "rpc.addr",
Usage: "HTTP-RPC server listening interface",
Value: node.DefaultHTTPHost,
Category: flags.PortalNetworkCategory,
}

Expand Down Expand Up @@ -1001,10 +1000,16 @@ Please note that --` + MetricsHTTPFlag.Name + ` must be set to start the server.
}

PortalBootNodesFlag = &cli.StringSliceFlag{
Name: "bootnode",
Name: "bootnodes",
Usage: "bootnode of p2p network with ENR format for portal hive test",
Category: flags.PortalNetworkCategory,
}

PortalNetworksFlag = &cli.StringSliceFlag{
Name: "networks",
Usage: "portal sub networks: history, beacon, state",
Category: flags.PortalNetworkCategory,
}
)

var (
Expand Down
Loading