116 lines
4.5 KiB
Bash
116 lines
4.5 KiB
Bash
#!/bin/bash
|
|
#
|
|
# Script to run Nimbus-eth1 on the same networks Geth supports by name,
|
|
# with a trusted connection to a dedicated peer for that network.
|
|
#
|
|
# All protocols are disabled other than the minimum we need for block sync.
|
|
#
|
|
# This is very helpful for debugging and improving pipelined sync, and for
|
|
# improving the database and other processing, even though p2p sync is the
|
|
# endgame.
|
|
#
|
|
# - Discovery protocols are turned off
|
|
# - NAT hole punching protocols are turned off
|
|
# - Whisper protocol is turned off (`--protocols:eth`)
|
|
# - The only connection is to a single, active Geth for that network.
|
|
# - Each network's data is stored in a different location to avoid conflicts.
|
|
# - Each network is accessed by binding to a different port locally,
|
|
# so we can run several at the same time.
|
|
# - Log level is set to `TRACE` because we can read them when we're not
|
|
# swamped with discovery messages. Sync isn't fast enough yet.
|
|
#
|
|
# The enode URLs below are public facing Geth instances that are syncing to
|
|
# each of the networks. Nimbus-eth1 devs are free to use them for testing
|
|
# while they remain up. However, better results will be obtained if those nodes
|
|
# also have the Nimbus instances as "trusted peers".
|
|
#
|
|
set -e -u -o pipefail
|
|
|
|
# First argument says which testnet, or use mainnet for that.
|
|
# Defaults to goerli if omitted.
|
|
testnet=${1:-goerli}
|
|
|
|
# Additional arguments after the first are passed to Nimbus.
|
|
shift || :
|
|
|
|
staticnode_geth_mainnet='enode://7af995207d620d363ffbdac3216c45140c8fc31a1a30cac94dfad94713ba6b03efeb4f8dd4c0d676ec3e32a9eac2804560c3d3001c7551a2bb955c1e5ce22d17@mainnet.geth.ethereum.arxlogic.com:30303'
|
|
staticnode_geth_goerli='enode://9a8651c02d14ffbf7e328cd6c31307d90c9411673deeec819a1b7a205eed121c7eea192146937958608eaebff25dcd232fce958f031bf82ba3d55deaac3d0715@goerli.geth.ethereum.arxlogic.com:30303';
|
|
staticnode_geth_ropsten='enode://861f2b16e3da33f2af677de97087dd489b17f9a0685fdaf751fb524fdf171cd4b8f02a5dc9e25a2730d1aa1b22176f5c88397b7f01180d032375d1526a8e1421@ropsten.geth.ethereum.arxlogic.com:30303'
|
|
staticnode_geth_rinkeby='enode://bb34c7a91c9895769f782cd1f0da88025f302960beebac305010b7395912b3835eb954426b3cf4be1b47bae4c32973d87688ace8cce412a3efb88baabc77bd98@rinkeby.geth.ethereum.arxlogic.com:30303'
|
|
staticnode_geth_yolov3='enode://a11e7ed2a1a21b9464619f77734b9dec76befbc5ebb95ac7820f45728bc42c30f9bd406a83ddc28b28141bc0a8469638467ad6a48065977e1ac8e8f1c7a1e6b4@yolov3.geth.ethereum.arxlogic.com:30303'
|
|
|
|
case $testnet in
|
|
mainnet)
|
|
net_option= port=30193 staticnodes=$staticnode_geth_mainnet ;;
|
|
goerli)
|
|
net_option=--goerli port=30194 staticnodes=$staticnode_geth_goerli ;;
|
|
ropsten)
|
|
net_option=--ropsten port=30195 staticnodes=$staticnode_geth_ropsten ;;
|
|
rinkeby)
|
|
net_option=--rinkeby port=30196 staticnodes=$staticnode_geth_rinkeby ;;
|
|
yolov3)
|
|
net_option=--yolov3 port=30197 staticnodes=$staticnode_geth_yolov3 ;;
|
|
*)
|
|
echo "Unrecognised network: $testnet" 1>&2; exit 1 ;;
|
|
esac
|
|
|
|
# Perform DNS name lookup for enodes with names.
|
|
# Geth supports this nowadays, but Nimbus does not.
|
|
resolve_enodes() {
|
|
local node prefix suffix host port ip
|
|
set --
|
|
for node in $staticnodes; do
|
|
case $node in
|
|
enode://*@*:*)
|
|
prefix=${node%@*} suffix=${node##*@}
|
|
host=${suffix%:*} port=${suffix##*:}
|
|
case $host in
|
|
*[^0-9.]*)
|
|
ip=$(host -t a "$host" 2>/dev/null)
|
|
case $ip in
|
|
"$host has address "[0-9]*)
|
|
ip=${ip##* has address }
|
|
;;
|
|
*)
|
|
echo "Name lookup for $host failed" 1>&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
node=$prefix@$ip:$port
|
|
esac
|
|
esac
|
|
set -- "$@" "$node"
|
|
done
|
|
staticnodes="$*"
|
|
}
|
|
resolve_enodes
|
|
|
|
datadir="$HOME"/.nimbus/"$testnet"
|
|
|
|
# Use a stable nodekey if we have one, to ensure the remote Geth almost always
|
|
# accepts our connections. The nodekey's corresponding `enode` URL must be
|
|
# added with `admin.addTrustedPeer` to the remote Geth. This isn't perfect.
|
|
# Sometimes Geth is too busy even for a trusted peer. But usually it works.
|
|
#
|
|
# Note, this nodekey file isn't created automatically by nimbus-eth1 at the
|
|
# moment. We have to have done it manually before now.
|
|
#
|
|
if [ -e "$datadir"/nimbus/nodekey ]; then
|
|
nodekey=$(cat "$datadir"/nimbus/nodekey)
|
|
if [ -n "$nodekey" ]; then
|
|
set -- --nodekey:"$nodekey"
|
|
fi
|
|
fi
|
|
|
|
# So the process name shows up without a path in `netstat`.
|
|
export PATH=$HOME/Status/nimbus-eth1/build:$PATH
|
|
|
|
exec nimbus \
|
|
--datadir:"$datadir" $net_option \
|
|
--prune:full \
|
|
--logMetrics --logMetricsInterval:5 \
|
|
--log-level:TRACE \
|
|
--nodiscover --nat:none --port:$port --protocols:eth \
|
|
--staticnodes:"$staticnodes" \
|
|
"$@"
|