nimbus-eth1/run-nimbus-sync

116 lines
4.5 KiB
Bash
Executable File

#!/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" \
"$@"