Merge pull request #16073 from karalabe/puppeth-unify-discovery
cmd/puppeth: unify discv4 and discv5 ports
This commit is contained in:
commit
da41a7258d
@ -117,7 +117,7 @@ var dashboardContent = `
|
|||||||
<br/>
|
<br/>
|
||||||
<p>To run an archive node, download <a href="/{{.GethGenesis}}"><code>{{.GethGenesis}}</code></a> and start Geth with:
|
<p>To run an archive node, download <a href="/{{.GethGenesis}}"><code>{{.GethGenesis}}</code></a> and start Geth with:
|
||||||
<pre>geth --datadir=$HOME/.{{.Network}} init {{.GethGenesis}}</pre>
|
<pre>geth --datadir=$HOME/.{{.Network}} init {{.GethGenesis}}</pre>
|
||||||
<pre>geth --networkid={{.NetworkID}} --datadir=$HOME/.{{.Network}} --cache=1024 --syncmode=full{{if .Ethstats}} --ethstats='{{.Ethstats}}'{{end}} --bootnodes={{.BootnodesFullFlat}}</pre>
|
<pre>geth --networkid={{.NetworkID}} --datadir=$HOME/.{{.Network}} --cache=1024 --syncmode=full{{if .Ethstats}} --ethstats='{{.Ethstats}}'{{end}} --bootnodes={{.BootnodesFlat}}</pre>
|
||||||
</p>
|
</p>
|
||||||
<br/>
|
<br/>
|
||||||
<p>You can download Geth from <a href="https://geth.ethereum.org/downloads/" target="about:blank">https://geth.ethereum.org/downloads/</a>.</p>
|
<p>You can download Geth from <a href="https://geth.ethereum.org/downloads/" target="about:blank">https://geth.ethereum.org/downloads/</a>.</p>
|
||||||
@ -136,7 +136,7 @@ var dashboardContent = `
|
|||||||
<br/>
|
<br/>
|
||||||
<p>To run a full node, download <a href="/{{.GethGenesis}}"><code>{{.GethGenesis}}</code></a> and start Geth with:
|
<p>To run a full node, download <a href="/{{.GethGenesis}}"><code>{{.GethGenesis}}</code></a> and start Geth with:
|
||||||
<pre>geth --datadir=$HOME/.{{.Network}} init {{.GethGenesis}}</pre>
|
<pre>geth --datadir=$HOME/.{{.Network}} init {{.GethGenesis}}</pre>
|
||||||
<pre>geth --networkid={{.NetworkID}} --datadir=$HOME/.{{.Network}} --cache=512{{if .Ethstats}} --ethstats='{{.Ethstats}}'{{end}} --bootnodes={{.BootnodesFullFlat}}</pre>
|
<pre>geth --networkid={{.NetworkID}} --datadir=$HOME/.{{.Network}} --cache=512{{if .Ethstats}} --ethstats='{{.Ethstats}}'{{end}} --bootnodes={{.BootnodesFlat}}</pre>
|
||||||
</p>
|
</p>
|
||||||
<br/>
|
<br/>
|
||||||
<p>You can download Geth from <a href="https://geth.ethereum.org/downloads/" target="about:blank">https://geth.ethereum.org/downloads/</a>.</p>
|
<p>You can download Geth from <a href="https://geth.ethereum.org/downloads/" target="about:blank">https://geth.ethereum.org/downloads/</a>.</p>
|
||||||
@ -158,7 +158,7 @@ var dashboardContent = `
|
|||||||
<br/>
|
<br/>
|
||||||
<p>To run a light node, download <a href="/{{.GethGenesis}}"><code>{{.GethGenesis}}</code></a> and start Geth with:
|
<p>To run a light node, download <a href="/{{.GethGenesis}}"><code>{{.GethGenesis}}</code></a> and start Geth with:
|
||||||
<pre>geth --datadir=$HOME/.{{.Network}} init {{.GethGenesis}}</pre>
|
<pre>geth --datadir=$HOME/.{{.Network}} init {{.GethGenesis}}</pre>
|
||||||
<pre>geth --networkid={{.NetworkID}} --datadir=$HOME/.{{.Network}} --syncmode=light{{if .Ethstats}} --ethstats='{{.Ethstats}}'{{end}} --bootnodes={{.BootnodesLightFlat}}</pre>
|
<pre>geth --networkid={{.NetworkID}} --datadir=$HOME/.{{.Network}} --syncmode=light{{if .Ethstats}} --ethstats='{{.Ethstats}}'{{end}} --bootnodes={{.BootnodesFlat}}</pre>
|
||||||
</p>
|
</p>
|
||||||
<br/>
|
<br/>
|
||||||
<p>You can download Geth from <a href="https://geth.ethereum.org/downloads/" target="about:blank">https://geth.ethereum.org/downloads/</a>.</p>
|
<p>You can download Geth from <a href="https://geth.ethereum.org/downloads/" target="about:blank">https://geth.ethereum.org/downloads/</a>.</p>
|
||||||
@ -177,7 +177,7 @@ var dashboardContent = `
|
|||||||
<br/>
|
<br/>
|
||||||
<p>To run an embedded node, download <a href="/{{.GethGenesis}}"><code>{{.GethGenesis}}</code></a> and start Geth with:
|
<p>To run an embedded node, download <a href="/{{.GethGenesis}}"><code>{{.GethGenesis}}</code></a> and start Geth with:
|
||||||
<pre>geth --datadir=$HOME/.{{.Network}} init {{.GethGenesis}}</pre>
|
<pre>geth --datadir=$HOME/.{{.Network}} init {{.GethGenesis}}</pre>
|
||||||
<pre>geth --networkid={{.NetworkID}} --datadir=$HOME/.{{.Network}} --cache=16 --ethash.cachesinmem=1 --syncmode=light{{if .Ethstats}} --ethstats='{{.Ethstats}}'{{end}} --bootnodes={{.BootnodesLightFlat}}</pre>
|
<pre>geth --networkid={{.NetworkID}} --datadir=$HOME/.{{.Network}} --cache=16 --ethash.cachesinmem=1 --syncmode=light{{if .Ethstats}} --ethstats='{{.Ethstats}}'{{end}} --bootnodes={{.BootnodesFlat}}</pre>
|
||||||
</p>
|
</p>
|
||||||
<br/>
|
<br/>
|
||||||
<p>You can download Geth from <a href="https://geth.ethereum.org/downloads/" target="about:blank">https://geth.ethereum.org/downloads/</a>.</p>
|
<p>You can download Geth from <a href="https://geth.ethereum.org/downloads/" target="about:blank">https://geth.ethereum.org/downloads/</a>.</p>
|
||||||
@ -208,7 +208,7 @@ var dashboardContent = `
|
|||||||
<pre>geth --datadir=$HOME/.{{.Network}} init {{.GethGenesis}}</pre>
|
<pre>geth --datadir=$HOME/.{{.Network}} init {{.GethGenesis}}</pre>
|
||||||
</p>
|
</p>
|
||||||
<p>With your local chain initialized, you can start the Ethereum Wallet:
|
<p>With your local chain initialized, you can start the Ethereum Wallet:
|
||||||
<pre>ethereumwallet --rpc $HOME/.{{.Network}}/geth.ipc --node-networkid={{.NetworkID}} --node-datadir=$HOME/.{{.Network}}{{if .Ethstats}} --node-ethstats='{{.Ethstats}}'{{end}} --node-bootnodes={{.BootnodesFullFlat}}</pre>
|
<pre>ethereumwallet --rpc $HOME/.{{.Network}}/geth.ipc --node-networkid={{.NetworkID}} --node-datadir=$HOME/.{{.Network}}{{if .Ethstats}} --node-ethstats='{{.Ethstats}}'{{end}} --node-bootnodes={{.BootnodesFlat}}</pre>
|
||||||
<p>
|
<p>
|
||||||
<br/>
|
<br/>
|
||||||
<p>You can download the Ethereum Wallet from <a href="https://github.com/ethereum/mist/releases" target="about:blank">https://github.com/ethereum/mist/releases</a>.</p>
|
<p>You can download the Ethereum Wallet from <a href="https://github.com/ethereum/mist/releases" target="about:blank">https://github.com/ethereum/mist/releases</a>.</p>
|
||||||
@ -229,7 +229,7 @@ var dashboardContent = `
|
|||||||
<pre>geth --datadir=$HOME/.{{.Network}} init {{.GethGenesis}}</pre>
|
<pre>geth --datadir=$HOME/.{{.Network}} init {{.GethGenesis}}</pre>
|
||||||
</p>
|
</p>
|
||||||
<p>With your local chain initialized, you can start Mist:
|
<p>With your local chain initialized, you can start Mist:
|
||||||
<pre>mist --rpc $HOME/.{{.Network}}/geth.ipc --node-networkid={{.NetworkID}} --node-datadir=$HOME/.{{.Network}}{{if .Ethstats}} --node-ethstats='{{.Ethstats}}'{{end}} --node-bootnodes={{.BootnodesFullFlat}}</pre>
|
<pre>mist --rpc $HOME/.{{.Network}}/geth.ipc --node-networkid={{.NetworkID}} --node-datadir=$HOME/.{{.Network}}{{if .Ethstats}} --node-ethstats='{{.Ethstats}}'{{end}} --node-bootnodes={{.BootnodesFlat}}</pre>
|
||||||
<p>
|
<p>
|
||||||
<br/>
|
<br/>
|
||||||
<p>You can download the Mist browser from <a href="https://github.com/ethereum/mist/releases" target="about:blank">https://github.com/ethereum/mist/releases</a>.</p>
|
<p>You can download the Mist browser from <a href="https://github.com/ethereum/mist/releases" target="about:blank">https://github.com/ethereum/mist/releases</a>.</p>
|
||||||
@ -261,7 +261,7 @@ var dashboardContent = `
|
|||||||
<p>Inside your Java code you can now import the geth archive and connect to Ethereum:
|
<p>Inside your Java code you can now import the geth archive and connect to Ethereum:
|
||||||
<pre>import org.ethereum.geth.*;</pre>
|
<pre>import org.ethereum.geth.*;</pre>
|
||||||
<pre>
|
<pre>
|
||||||
Enodes bootnodes = new Enodes();{{range .BootnodesLight}}
|
Enodes bootnodes = new Enodes();{{range .Bootnodes}}
|
||||||
bootnodes.append(new Enode("{{.}}"));{{end}}
|
bootnodes.append(new Enode("{{.}}"));{{end}}
|
||||||
|
|
||||||
NodeConfig config = new NodeConfig();
|
NodeConfig config = new NodeConfig();
|
||||||
@ -294,7 +294,7 @@ node.start();
|
|||||||
<pre>
|
<pre>
|
||||||
var error: NSError?
|
var error: NSError?
|
||||||
|
|
||||||
let bootnodes = GethNewEnodesEmpty(){{range .BootnodesLight}}
|
let bootnodes = GethNewEnodesEmpty(){{range .Bootnodes}}
|
||||||
bootnodes?.append(GethNewEnode("{{.}}", &error)){{end}}
|
bootnodes?.append(GethNewEnode("{{.}}", &error)){{end}}
|
||||||
|
|
||||||
let config = GethNewNodeConfig()
|
let config = GethNewNodeConfig()
|
||||||
@ -595,44 +595,42 @@ func deployDashboard(client *sshClient, network string, conf *config, config *da
|
|||||||
statsLogin = ""
|
statsLogin = ""
|
||||||
}
|
}
|
||||||
indexfile := new(bytes.Buffer)
|
indexfile := new(bytes.Buffer)
|
||||||
bootCpp := make([]string, len(conf.bootFull))
|
bootCpp := make([]string, len(conf.bootnodes))
|
||||||
for i, boot := range conf.bootFull {
|
for i, boot := range conf.bootnodes {
|
||||||
bootCpp[i] = "required:" + strings.TrimPrefix(boot, "enode://")
|
bootCpp[i] = "required:" + strings.TrimPrefix(boot, "enode://")
|
||||||
}
|
}
|
||||||
bootHarmony := make([]string, len(conf.bootFull))
|
bootHarmony := make([]string, len(conf.bootnodes))
|
||||||
for i, boot := range conf.bootFull {
|
for i, boot := range conf.bootnodes {
|
||||||
bootHarmony[i] = fmt.Sprintf("-Dpeer.active.%d.url=%s", i, boot)
|
bootHarmony[i] = fmt.Sprintf("-Dpeer.active.%d.url=%s", i, boot)
|
||||||
}
|
}
|
||||||
bootPython := make([]string, len(conf.bootFull))
|
bootPython := make([]string, len(conf.bootnodes))
|
||||||
for i, boot := range conf.bootFull {
|
for i, boot := range conf.bootnodes {
|
||||||
bootPython[i] = "'" + boot + "'"
|
bootPython[i] = "'" + boot + "'"
|
||||||
}
|
}
|
||||||
template.Must(template.New("").Parse(dashboardContent)).Execute(indexfile, map[string]interface{}{
|
template.Must(template.New("").Parse(dashboardContent)).Execute(indexfile, map[string]interface{}{
|
||||||
"Network": network,
|
"Network": network,
|
||||||
"NetworkID": conf.Genesis.Config.ChainId,
|
"NetworkID": conf.Genesis.Config.ChainId,
|
||||||
"NetworkTitle": strings.Title(network),
|
"NetworkTitle": strings.Title(network),
|
||||||
"EthstatsPage": config.ethstats,
|
"EthstatsPage": config.ethstats,
|
||||||
"ExplorerPage": config.explorer,
|
"ExplorerPage": config.explorer,
|
||||||
"WalletPage": config.wallet,
|
"WalletPage": config.wallet,
|
||||||
"FaucetPage": config.faucet,
|
"FaucetPage": config.faucet,
|
||||||
"GethGenesis": network + ".json",
|
"GethGenesis": network + ".json",
|
||||||
"BootnodesFull": conf.bootFull,
|
"Bootnodes": conf.bootnodes,
|
||||||
"BootnodesLight": conf.bootLight,
|
"BootnodesFlat": strings.Join(conf.bootnodes, ","),
|
||||||
"BootnodesFullFlat": strings.Join(conf.bootFull, ","),
|
"Ethstats": statsLogin,
|
||||||
"BootnodesLightFlat": strings.Join(conf.bootLight, ","),
|
"Ethash": conf.Genesis.Config.Ethash != nil,
|
||||||
"Ethstats": statsLogin,
|
"CppGenesis": network + "-cpp.json",
|
||||||
"Ethash": conf.Genesis.Config.Ethash != nil,
|
"CppBootnodes": strings.Join(bootCpp, " "),
|
||||||
"CppGenesis": network + "-cpp.json",
|
"HarmonyGenesis": network + "-harmony.json",
|
||||||
"CppBootnodes": strings.Join(bootCpp, " "),
|
"HarmonyBootnodes": strings.Join(bootHarmony, " "),
|
||||||
"HarmonyGenesis": network + "-harmony.json",
|
"ParityGenesis": network + "-parity.json",
|
||||||
"HarmonyBootnodes": strings.Join(bootHarmony, " "),
|
"PythonGenesis": network + "-python.json",
|
||||||
"ParityGenesis": network + "-parity.json",
|
"PythonBootnodes": strings.Join(bootPython, ","),
|
||||||
"PythonGenesis": network + "-python.json",
|
"Homestead": conf.Genesis.Config.HomesteadBlock,
|
||||||
"PythonBootnodes": strings.Join(bootPython, ","),
|
"Tangerine": conf.Genesis.Config.EIP150Block,
|
||||||
"Homestead": conf.Genesis.Config.HomesteadBlock,
|
"Spurious": conf.Genesis.Config.EIP155Block,
|
||||||
"Tangerine": conf.Genesis.Config.EIP150Block,
|
"Byzantium": conf.Genesis.Config.ByzantiumBlock,
|
||||||
"Spurious": conf.Genesis.Config.EIP155Block,
|
|
||||||
"Byzantium": conf.Genesis.Config.ByzantiumBlock,
|
|
||||||
})
|
})
|
||||||
files[filepath.Join(workdir, "index.html")] = indexfile.Bytes()
|
files[filepath.Join(workdir, "index.html")] = indexfile.Bytes()
|
||||||
|
|
||||||
@ -651,7 +649,7 @@ func deployDashboard(client *sshClient, network string, conf *config, config *da
|
|||||||
harmonySpecJSON, _ := conf.Genesis.MarshalJSON()
|
harmonySpecJSON, _ := conf.Genesis.MarshalJSON()
|
||||||
files[filepath.Join(workdir, network+"-harmony.json")] = harmonySpecJSON
|
files[filepath.Join(workdir, network+"-harmony.json")] = harmonySpecJSON
|
||||||
|
|
||||||
paritySpec, err := newParityChainSpec(network, conf.Genesis, conf.bootFull)
|
paritySpec, err := newParityChainSpec(network, conf.Genesis, conf.bootnodes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -93,7 +93,7 @@ func deployFaucet(client *sshClient, network string, bootnodes []string, config
|
|||||||
"NetworkID": config.node.network,
|
"NetworkID": config.node.network,
|
||||||
"Bootnodes": strings.Join(bootnodes, ","),
|
"Bootnodes": strings.Join(bootnodes, ","),
|
||||||
"Ethstats": config.node.ethstats,
|
"Ethstats": config.node.ethstats,
|
||||||
"EthPort": config.node.portFull,
|
"EthPort": config.node.port,
|
||||||
"CaptchaToken": config.captchaToken,
|
"CaptchaToken": config.captchaToken,
|
||||||
"CaptchaSecret": config.captchaSecret,
|
"CaptchaSecret": config.captchaSecret,
|
||||||
"FaucetName": strings.Title(network),
|
"FaucetName": strings.Title(network),
|
||||||
@ -110,7 +110,7 @@ func deployFaucet(client *sshClient, network string, bootnodes []string, config
|
|||||||
"Datadir": config.node.datadir,
|
"Datadir": config.node.datadir,
|
||||||
"VHost": config.host,
|
"VHost": config.host,
|
||||||
"ApiPort": config.port,
|
"ApiPort": config.port,
|
||||||
"EthPort": config.node.portFull,
|
"EthPort": config.node.port,
|
||||||
"EthName": config.node.ethstats[:strings.Index(config.node.ethstats, ":")],
|
"EthName": config.node.ethstats[:strings.Index(config.node.ethstats, ":")],
|
||||||
"CaptchaToken": config.captchaToken,
|
"CaptchaToken": config.captchaToken,
|
||||||
"CaptchaSecret": config.captchaSecret,
|
"CaptchaSecret": config.captchaSecret,
|
||||||
@ -158,7 +158,7 @@ func (info *faucetInfos) Report() map[string]string {
|
|||||||
report := map[string]string{
|
report := map[string]string{
|
||||||
"Website address": info.host,
|
"Website address": info.host,
|
||||||
"Website listener port": strconv.Itoa(info.port),
|
"Website listener port": strconv.Itoa(info.port),
|
||||||
"Ethereum listener port": strconv.Itoa(info.node.portFull),
|
"Ethereum listener port": strconv.Itoa(info.node.port),
|
||||||
"Funding amount (base tier)": fmt.Sprintf("%d Ethers", info.amount),
|
"Funding amount (base tier)": fmt.Sprintf("%d Ethers", info.amount),
|
||||||
"Funding cooldown (base tier)": fmt.Sprintf("%d mins", info.minutes),
|
"Funding cooldown (base tier)": fmt.Sprintf("%d mins", info.minutes),
|
||||||
"Funding tiers": strconv.Itoa(info.tiers),
|
"Funding tiers": strconv.Itoa(info.tiers),
|
||||||
@ -228,7 +228,7 @@ func checkFaucet(client *sshClient, network string) (*faucetInfos, error) {
|
|||||||
return &faucetInfos{
|
return &faucetInfos{
|
||||||
node: &nodeInfos{
|
node: &nodeInfos{
|
||||||
datadir: infos.volumes["/root/.faucet"],
|
datadir: infos.volumes["/root/.faucet"],
|
||||||
portFull: infos.portmap[infos.envvars["ETH_PORT"]+"/tcp"],
|
port: infos.portmap[infos.envvars["ETH_PORT"]+"/tcp"],
|
||||||
ethstats: infos.envvars["ETH_NAME"],
|
ethstats: infos.envvars["ETH_NAME"],
|
||||||
keyJSON: keyJSON,
|
keyJSON: keyJSON,
|
||||||
keyPass: keyPass,
|
keyPass: keyPass,
|
||||||
|
@ -42,7 +42,7 @@ ADD genesis.json /genesis.json
|
|||||||
RUN \
|
RUN \
|
||||||
echo 'geth --cache 512 init /genesis.json' > geth.sh && \{{if .Unlock}}
|
echo 'geth --cache 512 init /genesis.json' > geth.sh && \{{if .Unlock}}
|
||||||
echo 'mkdir -p /root/.ethereum/keystore/ && cp /signer.json /root/.ethereum/keystore/' >> geth.sh && \{{end}}
|
echo 'mkdir -p /root/.ethereum/keystore/ && cp /signer.json /root/.ethereum/keystore/' >> geth.sh && \{{end}}
|
||||||
echo $'geth --networkid {{.NetworkID}} --cache 512 --port {{.Port}} --maxpeers {{.Peers}} {{.LightFlag}} --ethstats \'{{.Ethstats}}\' {{if .BootV4}}--bootnodesv4 {{.BootV4}}{{end}} {{if .BootV5}}--bootnodesv5 {{.BootV5}}{{end}} {{if .Etherbase}}--etherbase {{.Etherbase}} --mine --minerthreads 1{{end}} {{if .Unlock}}--unlock 0 --password /signer.pass --mine{{end}} --targetgaslimit {{.GasTarget}} --gasprice {{.GasPrice}}' >> geth.sh
|
echo $'geth --networkid {{.NetworkID}} --cache 512 --port {{.Port}} --maxpeers {{.Peers}} {{.LightFlag}} --ethstats \'{{.Ethstats}}\' {{if .Bootnodes}}--bootnodes {{.Bootnodes}}{{end}} {{if .Etherbase}}--etherbase {{.Etherbase}} --mine --minerthreads 1{{end}} {{if .Unlock}}--unlock 0 --password /signer.pass --mine{{end}} --targetgaslimit {{.GasTarget}} --gasprice {{.GasPrice}}' >> geth.sh
|
||||||
|
|
||||||
ENTRYPOINT ["/bin/sh", "geth.sh"]
|
ENTRYPOINT ["/bin/sh", "geth.sh"]
|
||||||
`
|
`
|
||||||
@ -56,15 +56,13 @@ services:
|
|||||||
build: .
|
build: .
|
||||||
image: {{.Network}}/{{.Type}}
|
image: {{.Network}}/{{.Type}}
|
||||||
ports:
|
ports:
|
||||||
- "{{.FullPort}}:{{.FullPort}}"
|
- "{{.Port}}:{{.Port}}"
|
||||||
- "{{.FullPort}}:{{.FullPort}}/udp"{{if .Light}}
|
- "{{.Port}}:{{.Port}}/udp"
|
||||||
- "{{.LightPort}}:{{.LightPort}}/udp"{{end}}
|
|
||||||
volumes:
|
volumes:
|
||||||
- {{.Datadir}}:/root/.ethereum{{if .Ethashdir}}
|
- {{.Datadir}}:/root/.ethereum{{if .Ethashdir}}
|
||||||
- {{.Ethashdir}}:/root/.ethash{{end}}
|
- {{.Ethashdir}}:/root/.ethash{{end}}
|
||||||
environment:
|
environment:
|
||||||
- FULL_PORT={{.FullPort}}/tcp
|
- PORT={{.Port}}/tcp
|
||||||
- LIGHT_PORT={{.LightPort}}/udp
|
|
||||||
- TOTAL_PEERS={{.TotalPeers}}
|
- TOTAL_PEERS={{.TotalPeers}}
|
||||||
- LIGHT_PEERS={{.LightPeers}}
|
- LIGHT_PEERS={{.LightPeers}}
|
||||||
- STATS_NAME={{.Ethstats}}
|
- STATS_NAME={{.Ethstats}}
|
||||||
@ -82,12 +80,11 @@ services:
|
|||||||
// deployNode deploys a new Ethereum node container to a remote machine via SSH,
|
// deployNode deploys a new Ethereum node container to a remote machine via SSH,
|
||||||
// docker and docker-compose. If an instance with the specified network name
|
// docker and docker-compose. If an instance with the specified network name
|
||||||
// already exists there, it will be overwritten!
|
// already exists there, it will be overwritten!
|
||||||
func deployNode(client *sshClient, network string, bootv4, bootv5 []string, config *nodeInfos, nocache bool) ([]byte, error) {
|
func deployNode(client *sshClient, network string, bootnodes []string, config *nodeInfos, nocache bool) ([]byte, error) {
|
||||||
kind := "sealnode"
|
kind := "sealnode"
|
||||||
if config.keyJSON == "" && config.etherbase == "" {
|
if config.keyJSON == "" && config.etherbase == "" {
|
||||||
kind = "bootnode"
|
kind = "bootnode"
|
||||||
bootv4 = make([]string, 0)
|
bootnodes = make([]string, 0)
|
||||||
bootv5 = make([]string, 0)
|
|
||||||
}
|
}
|
||||||
// Generate the content to upload to the server
|
// Generate the content to upload to the server
|
||||||
workdir := fmt.Sprintf("%d", rand.Int63())
|
workdir := fmt.Sprintf("%d", rand.Int63())
|
||||||
@ -100,11 +97,10 @@ func deployNode(client *sshClient, network string, bootv4, bootv5 []string, conf
|
|||||||
dockerfile := new(bytes.Buffer)
|
dockerfile := new(bytes.Buffer)
|
||||||
template.Must(template.New("").Parse(nodeDockerfile)).Execute(dockerfile, map[string]interface{}{
|
template.Must(template.New("").Parse(nodeDockerfile)).Execute(dockerfile, map[string]interface{}{
|
||||||
"NetworkID": config.network,
|
"NetworkID": config.network,
|
||||||
"Port": config.portFull,
|
"Port": config.port,
|
||||||
"Peers": config.peersTotal,
|
"Peers": config.peersTotal,
|
||||||
"LightFlag": lightFlag,
|
"LightFlag": lightFlag,
|
||||||
"BootV4": strings.Join(bootv4, ","),
|
"Bootnodes": strings.Join(bootnodes, ","),
|
||||||
"BootV5": strings.Join(bootv5, ","),
|
|
||||||
"Ethstats": config.ethstats,
|
"Ethstats": config.ethstats,
|
||||||
"Etherbase": config.etherbase,
|
"Etherbase": config.etherbase,
|
||||||
"GasTarget": uint64(1000000 * config.gasTarget),
|
"GasTarget": uint64(1000000 * config.gasTarget),
|
||||||
@ -119,10 +115,9 @@ func deployNode(client *sshClient, network string, bootv4, bootv5 []string, conf
|
|||||||
"Datadir": config.datadir,
|
"Datadir": config.datadir,
|
||||||
"Ethashdir": config.ethashdir,
|
"Ethashdir": config.ethashdir,
|
||||||
"Network": network,
|
"Network": network,
|
||||||
"FullPort": config.portFull,
|
"Port": config.port,
|
||||||
"TotalPeers": config.peersTotal,
|
"TotalPeers": config.peersTotal,
|
||||||
"Light": config.peersLight > 0,
|
"Light": config.peersLight > 0,
|
||||||
"LightPort": config.portFull + 1,
|
|
||||||
"LightPeers": config.peersLight,
|
"LightPeers": config.peersLight,
|
||||||
"Ethstats": config.ethstats[:strings.Index(config.ethstats, ":")],
|
"Ethstats": config.ethstats[:strings.Index(config.ethstats, ":")],
|
||||||
"Etherbase": config.etherbase,
|
"Etherbase": config.etherbase,
|
||||||
@ -157,10 +152,8 @@ type nodeInfos struct {
|
|||||||
datadir string
|
datadir string
|
||||||
ethashdir string
|
ethashdir string
|
||||||
ethstats string
|
ethstats string
|
||||||
portFull int
|
port int
|
||||||
portLight int
|
enode string
|
||||||
enodeFull string
|
|
||||||
enodeLight string
|
|
||||||
peersTotal int
|
peersTotal int
|
||||||
peersLight int
|
peersLight int
|
||||||
etherbase string
|
etherbase string
|
||||||
@ -174,15 +167,11 @@ type nodeInfos struct {
|
|||||||
// most - but not all - fields for reporting to the user.
|
// most - but not all - fields for reporting to the user.
|
||||||
func (info *nodeInfos) Report() map[string]string {
|
func (info *nodeInfos) Report() map[string]string {
|
||||||
report := map[string]string{
|
report := map[string]string{
|
||||||
"Data directory": info.datadir,
|
"Data directory": info.datadir,
|
||||||
"Listener port (full nodes)": strconv.Itoa(info.portFull),
|
"Listener port": strconv.Itoa(info.port),
|
||||||
"Peer count (all total)": strconv.Itoa(info.peersTotal),
|
"Peer count (all total)": strconv.Itoa(info.peersTotal),
|
||||||
"Peer count (light nodes)": strconv.Itoa(info.peersLight),
|
"Peer count (light nodes)": strconv.Itoa(info.peersLight),
|
||||||
"Ethstats username": info.ethstats,
|
"Ethstats username": info.ethstats,
|
||||||
}
|
|
||||||
if info.peersLight > 0 {
|
|
||||||
// Light server enabled
|
|
||||||
report["Listener port (light nodes)"] = strconv.Itoa(info.portLight)
|
|
||||||
}
|
}
|
||||||
if info.gasTarget > 0 {
|
if info.gasTarget > 0 {
|
||||||
// Miner or signer node
|
// Miner or signer node
|
||||||
@ -250,7 +239,7 @@ func checkNode(client *sshClient, network string, boot bool) (*nodeInfos, error)
|
|||||||
keyPass = string(bytes.TrimSpace(out))
|
keyPass = string(bytes.TrimSpace(out))
|
||||||
}
|
}
|
||||||
// Run a sanity check to see if the devp2p is reachable
|
// Run a sanity check to see if the devp2p is reachable
|
||||||
port := infos.portmap[infos.envvars["FULL_PORT"]]
|
port := infos.portmap[infos.envvars["PORT"]]
|
||||||
if err = checkPort(client.server, port); err != nil {
|
if err = checkPort(client.server, port); err != nil {
|
||||||
log.Warn(fmt.Sprintf("%s devp2p port seems unreachable", strings.Title(kind)), "server", client.server, "port", port, "err", err)
|
log.Warn(fmt.Sprintf("%s devp2p port seems unreachable", strings.Title(kind)), "server", client.server, "port", port, "err", err)
|
||||||
}
|
}
|
||||||
@ -259,8 +248,7 @@ func checkNode(client *sshClient, network string, boot bool) (*nodeInfos, error)
|
|||||||
genesis: genesis,
|
genesis: genesis,
|
||||||
datadir: infos.volumes["/root/.ethereum"],
|
datadir: infos.volumes["/root/.ethereum"],
|
||||||
ethashdir: infos.volumes["/root/.ethash"],
|
ethashdir: infos.volumes["/root/.ethash"],
|
||||||
portFull: infos.portmap[infos.envvars["FULL_PORT"]],
|
port: port,
|
||||||
portLight: infos.portmap[infos.envvars["LIGHT_PORT"]],
|
|
||||||
peersTotal: totalPeers,
|
peersTotal: totalPeers,
|
||||||
peersLight: lightPeers,
|
peersLight: lightPeers,
|
||||||
ethstats: infos.envvars["STATS_NAME"],
|
ethstats: infos.envvars["STATS_NAME"],
|
||||||
@ -270,9 +258,7 @@ func checkNode(client *sshClient, network string, boot bool) (*nodeInfos, error)
|
|||||||
gasTarget: gasTarget,
|
gasTarget: gasTarget,
|
||||||
gasPrice: gasPrice,
|
gasPrice: gasPrice,
|
||||||
}
|
}
|
||||||
stats.enodeFull = fmt.Sprintf("enode://%s@%s:%d", id, client.address, stats.portFull)
|
stats.enode = fmt.Sprintf("enode://%s@%s:%d", id, client.address, stats.port)
|
||||||
if stats.portLight != 0 {
|
|
||||||
stats.enodeLight = fmt.Sprintf("enode://%s@%s:%d?discport=%d", id, client.address, stats.portFull, stats.portLight)
|
|
||||||
}
|
|
||||||
return stats, nil
|
return stats, nil
|
||||||
}
|
}
|
||||||
|
@ -40,8 +40,7 @@ import (
|
|||||||
// between sessions.
|
// between sessions.
|
||||||
type config struct {
|
type config struct {
|
||||||
path string // File containing the configuration values
|
path string // File containing the configuration values
|
||||||
bootFull []string // Bootnodes to always connect to by full nodes
|
bootnodes []string // Bootnodes to always connect to by all nodes
|
||||||
bootLight []string // Bootnodes to always connect to by light nodes
|
|
||||||
ethstats string // Ethstats settings to cache for node deploys
|
ethstats string // Ethstats settings to cache for node deploys
|
||||||
|
|
||||||
Genesis *core.Genesis `json:"genesis,omitempty"` // Genesis block to cache for node deploys
|
Genesis *core.Genesis `json:"genesis,omitempty"` // Genesis block to cache for node deploys
|
||||||
|
@ -55,7 +55,7 @@ func (w *wizard) deployExplorer() {
|
|||||||
}
|
}
|
||||||
existed := err == nil
|
existed := err == nil
|
||||||
|
|
||||||
chainspec, err := newParityChainSpec(w.network, w.conf.Genesis, w.conf.bootFull)
|
chainspec, err := newParityChainSpec(w.network, w.conf.Genesis, w.conf.bootnodes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Failed to create chain spec for explorer", "err", err)
|
log.Error("Failed to create chain spec for explorer", "err", err)
|
||||||
return
|
return
|
||||||
|
@ -38,7 +38,7 @@ func (w *wizard) deployFaucet() {
|
|||||||
infos, err := checkFaucet(client, w.network)
|
infos, err := checkFaucet(client, w.network)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
infos = &faucetInfos{
|
infos = &faucetInfos{
|
||||||
node: &nodeInfos{portFull: 30303, peersTotal: 25},
|
node: &nodeInfos{port: 30303, peersTotal: 25},
|
||||||
port: 80,
|
port: 80,
|
||||||
host: client.server,
|
host: client.server,
|
||||||
amount: 1,
|
amount: 1,
|
||||||
@ -113,8 +113,8 @@ func (w *wizard) deployFaucet() {
|
|||||||
}
|
}
|
||||||
// Figure out which port to listen on
|
// Figure out which port to listen on
|
||||||
fmt.Println()
|
fmt.Println()
|
||||||
fmt.Printf("Which TCP/UDP port should the light client listen on? (default = %d)\n", infos.node.portFull)
|
fmt.Printf("Which TCP/UDP port should the light client listen on? (default = %d)\n", infos.node.port)
|
||||||
infos.node.portFull = w.readDefaultInt(infos.node.portFull)
|
infos.node.port = w.readDefaultInt(infos.node.port)
|
||||||
|
|
||||||
// Set a proper name to report on the stats page
|
// Set a proper name to report on the stats page
|
||||||
fmt.Println()
|
fmt.Println()
|
||||||
@ -168,7 +168,7 @@ func (w *wizard) deployFaucet() {
|
|||||||
fmt.Printf("Should the faucet be built from scratch (y/n)? (default = no)\n")
|
fmt.Printf("Should the faucet be built from scratch (y/n)? (default = no)\n")
|
||||||
nocache = w.readDefaultString("n") != "n"
|
nocache = w.readDefaultString("n") != "n"
|
||||||
}
|
}
|
||||||
if out, err := deployFaucet(client, w.network, w.conf.bootLight, infos, nocache); err != nil {
|
if out, err := deployFaucet(client, w.network, w.conf.bootnodes, infos, nocache); err != nil {
|
||||||
log.Error("Failed to deploy faucet container", "err", err)
|
log.Error("Failed to deploy faucet container", "err", err)
|
||||||
if len(out) > 0 {
|
if len(out) > 0 {
|
||||||
fmt.Printf("%s\n", out)
|
fmt.Printf("%s\n", out)
|
||||||
|
@ -37,8 +37,7 @@ func (w *wizard) networkStats() {
|
|||||||
}
|
}
|
||||||
// Clear out some previous configs to refill from current scan
|
// Clear out some previous configs to refill from current scan
|
||||||
w.conf.ethstats = ""
|
w.conf.ethstats = ""
|
||||||
w.conf.bootFull = w.conf.bootFull[:0]
|
w.conf.bootnodes = w.conf.bootnodes[:0]
|
||||||
w.conf.bootLight = w.conf.bootLight[:0]
|
|
||||||
|
|
||||||
// Iterate over all the specified hosts and check their status
|
// Iterate over all the specified hosts and check their status
|
||||||
var pend sync.WaitGroup
|
var pend sync.WaitGroup
|
||||||
@ -76,8 +75,7 @@ func (w *wizard) gatherStats(server string, pubkey []byte, client *sshClient) *s
|
|||||||
var (
|
var (
|
||||||
genesis string
|
genesis string
|
||||||
ethstats string
|
ethstats string
|
||||||
bootFull []string
|
bootnodes []string
|
||||||
bootLight []string
|
|
||||||
)
|
)
|
||||||
// Ensure a valid SSH connection to the remote server
|
// Ensure a valid SSH connection to the remote server
|
||||||
logger := log.New("server", server)
|
logger := log.New("server", server)
|
||||||
@ -123,10 +121,7 @@ func (w *wizard) gatherStats(server string, pubkey []byte, client *sshClient) *s
|
|||||||
stat.services["bootnode"] = infos.Report()
|
stat.services["bootnode"] = infos.Report()
|
||||||
|
|
||||||
genesis = string(infos.genesis)
|
genesis = string(infos.genesis)
|
||||||
bootFull = append(bootFull, infos.enodeFull)
|
bootnodes = append(bootnodes, infos.enode)
|
||||||
if infos.enodeLight != "" {
|
|
||||||
bootLight = append(bootLight, infos.enodeLight)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
logger.Debug("Checking for sealnode availability")
|
logger.Debug("Checking for sealnode availability")
|
||||||
if infos, err := checkNode(client, w.network, false); err != nil {
|
if infos, err := checkNode(client, w.network, false); err != nil {
|
||||||
@ -184,8 +179,7 @@ func (w *wizard) gatherStats(server string, pubkey []byte, client *sshClient) *s
|
|||||||
if ethstats != "" {
|
if ethstats != "" {
|
||||||
w.conf.ethstats = ethstats
|
w.conf.ethstats = ethstats
|
||||||
}
|
}
|
||||||
w.conf.bootFull = append(w.conf.bootFull, bootFull...)
|
w.conf.bootnodes = append(w.conf.bootnodes, bootnodes...)
|
||||||
w.conf.bootLight = append(w.conf.bootLight, bootLight...)
|
|
||||||
|
|
||||||
return stat
|
return stat
|
||||||
}
|
}
|
||||||
|
@ -48,9 +48,9 @@ func (w *wizard) deployNode(boot bool) {
|
|||||||
infos, err := checkNode(client, w.network, boot)
|
infos, err := checkNode(client, w.network, boot)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if boot {
|
if boot {
|
||||||
infos = &nodeInfos{portFull: 30303, peersTotal: 512, peersLight: 256}
|
infos = &nodeInfos{port: 30303, peersTotal: 512, peersLight: 256}
|
||||||
} else {
|
} else {
|
||||||
infos = &nodeInfos{portFull: 30303, peersTotal: 50, peersLight: 0, gasTarget: 4.7, gasPrice: 18}
|
infos = &nodeInfos{port: 30303, peersTotal: 50, peersLight: 0, gasTarget: 4.7, gasPrice: 18}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
existed := err == nil
|
existed := err == nil
|
||||||
@ -79,8 +79,8 @@ func (w *wizard) deployNode(boot bool) {
|
|||||||
}
|
}
|
||||||
// Figure out which port to listen on
|
// Figure out which port to listen on
|
||||||
fmt.Println()
|
fmt.Println()
|
||||||
fmt.Printf("Which TCP/UDP port to listen on? (default = %d)\n", infos.portFull)
|
fmt.Printf("Which TCP/UDP port to listen on? (default = %d)\n", infos.port)
|
||||||
infos.portFull = w.readDefaultInt(infos.portFull)
|
infos.port = w.readDefaultInt(infos.port)
|
||||||
|
|
||||||
// Figure out how many peers to allow (different based on node type)
|
// Figure out how many peers to allow (different based on node type)
|
||||||
fmt.Println()
|
fmt.Println()
|
||||||
@ -163,7 +163,7 @@ func (w *wizard) deployNode(boot bool) {
|
|||||||
fmt.Printf("Should the node be built from scratch (y/n)? (default = no)\n")
|
fmt.Printf("Should the node be built from scratch (y/n)? (default = no)\n")
|
||||||
nocache = w.readDefaultString("n") != "n"
|
nocache = w.readDefaultString("n") != "n"
|
||||||
}
|
}
|
||||||
if out, err := deployNode(client, w.network, w.conf.bootFull, w.conf.bootLight, infos, nocache); err != nil {
|
if out, err := deployNode(client, w.network, w.conf.bootnodes, infos, nocache); err != nil {
|
||||||
log.Error("Failed to deploy Ethereum node container", "err", err)
|
log.Error("Failed to deploy Ethereum node container", "err", err)
|
||||||
if len(out) > 0 {
|
if len(out) > 0 {
|
||||||
fmt.Printf("%s\n", out)
|
fmt.Printf("%s\n", out)
|
||||||
|
@ -98,7 +98,7 @@ func (w *wizard) deployWallet() {
|
|||||||
fmt.Printf("Should the wallet be built from scratch (y/n)? (default = no)\n")
|
fmt.Printf("Should the wallet be built from scratch (y/n)? (default = no)\n")
|
||||||
nocache = w.readDefaultString("n") != "n"
|
nocache = w.readDefaultString("n") != "n"
|
||||||
}
|
}
|
||||||
if out, err := deployWallet(client, w.network, w.conf.bootFull, infos, nocache); err != nil {
|
if out, err := deployWallet(client, w.network, w.conf.bootnodes, infos, nocache); err != nil {
|
||||||
log.Error("Failed to deploy wallet container", "err", err)
|
log.Error("Failed to deploy wallet container", "err", err)
|
||||||
if len(out) > 0 {
|
if len(out) > 0 {
|
||||||
fmt.Printf("%s\n", out)
|
fmt.Printf("%s\n", out)
|
||||||
|
Loading…
Reference in New Issue
Block a user