feat:add default bootnodes

Signed-off-by: Chen Kai <281165273grape@gmail.com>
This commit is contained in:
Chen Kai 2024-06-18 15:08:15 +08:00
parent 346440e510
commit f8c05e17eb
4 changed files with 61 additions and 27 deletions

View file

@ -3,14 +3,16 @@
![AppVeyor Build (with branch)](https://ci.appveyor.com/api/projects/status/github/optimism-java/shisui?branch=portal&svg=true)
[![Discord](https://img.shields.io/badge/discord-join%20chat-blue.svg)](https://discord.gg/HBAgaHCBuY)
Shisui is an [Ethereum portal client](https://github.com/ethereum/portal-network-specs) written in Go language based on [go-ethereum](https://github.com/ethereum/go-ethereum).
Shisui is an [Ethereum portal client](https://github.com/ethereum/portal-network-specs) written in Go language based
on [go-ethereum](https://github.com/ethereum/go-ethereum).
The name is inspired by Uchiha Shisui from the anime Naruto, who is renowned as "Shisui of the Body Flicker".
> **Note:** Shisui is still **under heavy development** and is not yet ready for production use.
## Building the source
For prerequisites and detailed build instructions please read the [Installation Instructions](https://geth.ethereum.org/docs/getting-started/installing-geth).
For prerequisites and detailed build instructions please read
the [Installation Instructions](https://geth.ethereum.org/docs/getting-started/installing-geth).
Building `shisui` requires both a Go (version 1.19 or later) and a C compiler. You can install
them using your favourite package manager. Once the dependencies are installed, run
@ -48,14 +50,14 @@ docker run -d -p 8545:8545 -p 9009:9009/udp ghcr.io/optimism-java/shisui:latest
* `--nat` p2p address(default `none`)
* `none`, find local address
* `any` uses the first auto-detected mechanism
* `extip:77.12.33.4` will assume the local machine is reachable on the given IP
* `upnp` uses the Universal Plug and Play protocol
* `pmp` uses NAT-PMP with an auto-detected gateway address
* `pmp:192.168.0.1` uses NAT-PMP with the given gateway address
* `extip:77.12.33.4` will assume the local machine is reachable on the given IP
* `upnp` uses the Universal Plug and Play protocol
* `pmp` uses NAT-PMP with an auto-detected gateway address
* `pmp:192.168.0.1` uses NAT-PMP with the given gateway address
* `--udp.addr` protocol UDP server listening port(default: `9009`)
* `--loglevel` loglevel of portal network, `1` to `5`, from `error` to `trace`(default: `1`)
* `--private.key` private key of p2p node, hex format without `0x` prifix
* `--bootnodes` bootnode of p2p network with ENR format
* `--bootnodes` bootnode of p2p network with ENR format, use `none` to config empty bootnodes
* `--networks` portal sub networks: history, beacon, state
all the options above can be set with envs.

View file

@ -21,6 +21,7 @@ import (
"github.com/ethereum/go-ethereum/p2p/discover/portalwire"
"github.com/ethereum/go-ethereum/p2p/enode"
"github.com/ethereum/go-ethereum/p2p/nat"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/portalnetwork/beacon"
"github.com/ethereum/go-ethereum/portalnetwork/history"
"github.com/ethereum/go-ethereum/portalnetwork/storage"
@ -269,17 +270,7 @@ func getPortalConfig(ctx *cli.Context) (*Config, error) {
config.Protocol.NAT = natInterface
}
bootNodes := ctx.StringSlice(utils.PortalBootNodesFlag.Name)
if len(bootNodes) > 0 {
for _, node := range bootNodes {
bootNode := new(enode.Node)
err = bootNode.UnmarshalText([]byte(node))
if err != nil {
return config, err
}
config.Protocol.BootstrapNodes = append(config.Protocol.BootstrapNodes, bootNode)
}
}
setPortalBootstrapNodes(ctx, config)
config.Networks = ctx.StringSlice(utils.PortalNetworksFlag.Name)
return config, nil
}
@ -306,3 +297,27 @@ func setPrivateKey(ctx *cli.Context, config *Config) error {
config.PrivateKey = privateKey
return nil
}
// setPortalBootstrapNodes creates a list of bootstrap nodes from the command line
// flags, reverting to pre-configured ones if none have been specified.
func setPortalBootstrapNodes(ctx *cli.Context, config *Config) {
urls := params.PortalBootnodes
if ctx.IsSet(utils.PortalBootNodesFlag.Name) {
flag := ctx.String(utils.PortalBootNodesFlag.Name)
if flag == "none" {
return
}
urls = utils.SplitAndTrim(flag)
}
for _, url := range urls {
if url != "" {
node, err := enode.Parse(enode.ValidSchemes, url)
if err != nil {
log.Error("Bootstrap URL invalid", "enode", url, "err", err)
continue
}
config.Protocol.BootstrapNodes = append(config.Protocol.BootstrapNodes, node)
}
}
}

View file

@ -976,14 +976,14 @@ Please note that --` + MetricsHTTPFlag.Name + ` must be set to start the server.
PortalDataDirFlag = &cli.StringFlag{
Name: "data.dir",
Usage: "data dir of where the data file located",
Usage: "Data dir of where the data file located",
Value: "./",
Category: flags.PortalNetworkCategory,
}
PortalDataCapacityFlag = &cli.Uint64Flag{
Name: "data.capacity",
Usage: "the capacity of the data stored, the unit is MB",
Usage: "The capacity of the data stored, the unit is MB",
Value: 1000 * 10, // 10 GB
Category: flags.PortalNetworkCategory,
}
@ -997,40 +997,40 @@ Please note that --` + MetricsHTTPFlag.Name + ` must be set to start the server.
PortalUDPListenAddrFlag = &cli.StringFlag{
Name: "udp.addr",
Usage: "protocol UDP server listening interface",
Usage: "Protocol UDP server listening interface",
Value: "",
Category: flags.PortalNetworkCategory,
}
PortalUDPPortFlag = &cli.IntFlag{
Name: "udp.port",
Usage: "protocol UDP server listening port",
Usage: "Protocol UDP server listening port",
Value: node.DefaultUDPPort,
Category: flags.PortalNetworkCategory,
}
PortalLogLevelFlag = &cli.IntFlag{
Name: "loglevel",
Usage: "loglevel of portal network",
Usage: "Loglevel of portal network",
Value: node.DefaultLoglevel,
Category: flags.PortalNetworkCategory,
}
PortalPrivateKeyFlag = &cli.StringFlag{
Name: "private.key",
Usage: "private key of p2p node, hex format without 0x prifix",
Usage: "Private key of p2p node, hex format without 0x prifix",
Category: flags.PortalNetworkCategory,
}
PortalBootNodesFlag = &cli.StringSliceFlag{
PortalBootNodesFlag = &cli.StringFlag{
Name: "bootnodes",
Usage: "bootnode of p2p network with ENR format for portal hive test",
Usage: "Comma separated enode URLs for P2P discovery bootstrap",
Category: flags.PortalNetworkCategory,
}
PortalNetworksFlag = &cli.StringSliceFlag{
Name: "networks",
Usage: "portal sub networks: history, beacon, state",
Usage: "Portal sub networks: history, beacon, state",
Category: flags.PortalNetworkCategory,
Value: cli.NewStringSlice(portalwire.HistoryNetworkName),
}

View file

@ -87,6 +87,23 @@ var V5Bootnodes = []string{
"enr:-LK4QKWrXTpV9T78hNG6s8AM6IO4XH9kFT91uZtFg1GcsJ6dKovDOr1jtAAFPnS2lvNltkOGA9k29BUN7lFh_sjuc9QBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpC1MD8qAAAAAP__________gmlkgnY0gmlwhANAdd-Jc2VjcDI1NmsxoQLQa6ai7y9PMN5hpLe5HmiJSlYzMuzP7ZhwRiwHvqNXdoN0Y3CCI4yDdWRwgiOM", // 3.64.117.223 | aws-eu-central-1-frankfurt}
}
var PortalBootnodes = []string{
// Trin team's bootnodes
"enr:-Jy4QIs2pCyiKna9YWnAF0zgf7bT0GzlAGoF8MEKFJOExmtofBIqzm71zDvmzRiiLkxaEJcs_Amr7XIhLI74k1rtlXICY5Z0IDAuMS4xLWFscGhhLjEtMTEwZjUwgmlkgnY0gmlwhKEjVaWJc2VjcDI1NmsxoQLSC_nhF1iRwsCw0n3J4jRjqoaRxtKgsEe5a-Dz7y0JloN1ZHCCIyg",
"enr:-Jy4QKSLYMpku9F0Ebk84zhIhwTkmn80UnYvE4Z4sOcLukASIcofrGdXVLAUPVHh8oPCfnEOZm1W1gcAxB9kV2FJywkCY5Z0IDAuMS4xLWFscGhhLjEtMTEwZjUwgmlkgnY0gmlwhJO2oc6Jc2VjcDI1NmsxoQLMSGVlxXL62N3sPtaV-n_TbZFCEM5AR7RDyIwOadbQK4N1ZHCCIyg",
"enr:-Jy4QH4_H4cW--ejWDl_W7ngXw2m31MM2GT8_1ZgECnfWxMzZTiZKvHDgkmwUS_l2aqHHU54Q7hcFSPz6VGzkUjOqkcCY5Z0IDAuMS4xLWFscGhhLjEtMTEwZjUwgmlkgnY0gmlwhJ31OTWJc2VjcDI1NmsxoQPC0eRkjRajDiETr_DRa5N5VJRm-ttCWDoO1QAMMCg5pIN1ZHCCIyg",
// Fluffy team's bootnodes
"enr:-IS4QGUtAA29qeT3cWVr8lmJfySmkceR2wp6oFQtvO_uMe7KWaK_qd1UQvd93MJKXhMnubSsTQPJ6KkbIu0ywjvNdNEBgmlkgnY0gmlwhMIhKO6Jc2VjcDI1NmsxoQJ508pIqRqsjsvmUQfYGvaUFTxfsELPso_62FKDqlxI24N1ZHCCI40",
"enr:-IS4QNaaoQuHGReAMJKoDd6DbQKMbQ4Mked3Gi3GRatwgRVVPXynPlO_-gJKRF_ZSuJr3wyHfwMHyJDbd6q1xZQVZ2kBgmlkgnY0gmlwhMIhKO6Jc2VjcDI1NmsxoQM2kBHT5s_Uh4gsNiOclQDvLK4kPpoQucge3mtbuLuUGYN1ZHCCI44",
"enr:-IS4QBdIjs6S1ZkvlahSkuYNq5QW3DbD-UDcrm1l81f2PPjnNjb_NDa4B5x4olHCXtx0d2ZeZBHQyoHyNnuVZ-P1GVkBgmlkgnY0gmlwhMIhKO-Jc2VjcDI1NmsxoQOO3gFuaCAyQKscaiNLC9HfLbVzFdIerESFlOGcEuKWH4N1ZHCCI40",
"enr:-IS4QM731tV0CvQXLTDcZNvgFyhhpAjYDKU5XLbM7sZ1WEzIRq4zsakgrv3KO3qyOYZ8jFBK-VzENF8o-vnykuQ99iABgmlkgnY0gmlwhMIhKO-Jc2VjcDI1NmsxoQMTq6Cdx3HmL3Q9sitavcPHPbYKyEibKPKvyVyOlNF8J4N1ZHCCI44",
// Ultralight team's bootnodes
"enr:-IS4QFV_wTNknw7qiCGAbHf6LxB-xPQCktyrCEZX-b-7PikMOIKkBg-frHRBkfwhI3XaYo_T-HxBYmOOQGNwThkBBHYDgmlkgnY0gmlwhKRc9_OJc2VjcDI1NmsxoQKHPt5CQ0D66ueTtSUqwGjfhscU_LiwS28QvJ0GgJFd-YN1ZHCCE4k",
"enr:-IS4QDpUz2hQBNt0DECFm8Zy58Hi59PF_7sw780X3qA0vzJEB2IEd5RtVdPUYZUbeg4f0LMradgwpyIhYUeSxz2Tfa8DgmlkgnY0gmlwhKRc9_OJc2VjcDI1NmsxoQJd4NAVKOXfbdxyjSOUJzmA4rjtg43EDeEJu1f8YRhb_4N1ZHCCE4o",
"enr:-IS4QGG6moBhLW1oXz84NaKEHaRcim64qzFn1hAG80yQyVGNLoKqzJe887kEjthr7rJCNlt6vdVMKMNoUC9OCeNK-EMDgmlkgnY0gmlwhKRc9-KJc2VjcDI1NmsxoQLJhXByb3LmxHQaqgLDtIGUmpANXaBbFw3ybZWzGqb9-IN1ZHCCE4k",
"enr:-IS4QA5hpJikeDFf1DD1_Le6_ylgrLGpdwn3SRaneGu9hY2HUI7peHep0f28UUMzbC0PvlWjN8zSfnqMG07WVcCyBhADgmlkgnY0gmlwhKRc9-KJc2VjcDI1NmsxoQJMpHmGj1xSP1O-Mffk_jYIHVcg6tY5_CjmWVg1gJEsPIN1ZHCCE4o",
}
const dnsPrefix = "enrtree://AKA3AM6LPBYEUDMVNU3BSVQJ5AD45Y7YPOHJLEF6W26QOE4VTUDPE@"
// KnownDNSNetwork returns the address of a public DNS-based node list for the given