From e0331768207ea540e9d875337fd3acc1e6b5c843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Henry?= Date: Mon, 28 Aug 2017 09:56:57 +0200 Subject: [PATCH] README: add instructions for running a sandboxed node --- README.md | 82 ++++++++++++++++++++++++++------ scripts/client_lib.inc.sh | 47 ++++++++++++++++++ scripts/init-sandboxed-client.sh | 58 ++++++++++++++++++++++ scripts/launch-client.sh | 79 ------------------------------ scripts/launch-node.sh | 41 ---------------- scripts/launch-sandboxed-node.sh | 51 +++++++++++++------- 6 files changed, 207 insertions(+), 151 deletions(-) create mode 100755 scripts/init-sandboxed-client.sh delete mode 100755 scripts/launch-client.sh delete mode 100755 scripts/launch-node.sh diff --git a/README.md b/README.md index db6438a6b..6bd6a5428 100644 --- a/README.md +++ b/README.md @@ -76,20 +76,6 @@ download and install them from, eg, https://pkgs.org/download/libsodium18 and https://pkgs.org/download/libsodium-dev -Running the node in a sandbox ------------------------------ - -To run a single instance of a Tezos node in sandbox mode: - -``` -./tezos-node run --sandbox --rpc-addr localhost:8732 --data-dir /tmp/tezos-sandbox -``` - -This "sandboxed" node will not participate in the P2P network, but will accept -RPC from localhost on port 8732. See below from more details on the RPC -interface. - - Running the node ---------------- @@ -149,6 +135,74 @@ with the following commands line: ./tezos-node config update --data-dir "$dir" --net-addr localhost:9734 ``` +Running the node in a sandbox +----------------------------- + +To run a 'localhost-only' instance of a Tezos network, we provide two +helper scripts: + +- `./scripts/launch-sandboxed-node.sh` +- `./scripts/init-sandboxed-client.sh` + +For instance, if you want to run local network with two nodes, in a +first terminal, the following command will initialize a node listening +for peers on port `19731` and listening for RPC on port `18731`. + +``` +./scripts/launch-sandboxed-node.sh 1 +``` + +This node will store its data in a temporary directory which will be +removed when the node is killed. + +To launch the second node, just run the following command, it will +listen on port `19739` and `18739`: + +``` +./scripts/launch-sandboxed-node.sh 9 +``` + +You might replace `1` or `9` by any number in between if you want to +run more than two nodes. But, if you intend to run a single node +network, you might remove the spurious "Too few connections" warnings +by lowering the number of expected connection, by running the +following command instead: + +``` +./scripts/launch-sandboxed-node.sh 1 --connections 0 +``` + +Once your node(s) is/are running, open a new terminal and initialize +the "sandboxed" client data: + +``` +eval `./scripts/init-sandboxed-client.sh 1` +``` + +It will initialize the client data in a temporary directory. It will +also defines in the current shell session an alias `tezos-client` +preconfigured for communicating the same-numbered node. For instance: + +``` +$ tezos-client rpc call blocks/head/hash +{ "hash": "BLockGenesisGenesisGenesisGenesisGenesisGeneskvg68z" } +``` + +When you bootstrap a new network, the network is initialized with a +dummy economic protocol, called "genesis". If you want to run the same +protocol than the alphanet, `init-sandboxed-client` also defines an +alias `tezos-activate-alpha`, that you need to execute once for +activating the whole network. For instance: + +``` +$ tezos-client rpc call blocks/head/protocol +{ "protocol": "ProtoGenesisGenesisGenesisGenesisGenesisGenesk612im" } +$ tezos-activate-alpha +Injected BMBcK869jaHQDc +$ tezos-client rpc call blocks/head/protocol +{ "protocol": "ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK" } +``` + Configuration options --------------------- diff --git a/scripts/client_lib.inc.sh b/scripts/client_lib.inc.sh index 9a3a606de..798e65100 100644 --- a/scripts/client_lib.inc.sh +++ b/scripts/client_lib.inc.sh @@ -6,11 +6,17 @@ client="${client:=tezos-client -base-dir $client_dir}" ## Waiter ################################################################## wait_for_the_node_to_be_ready() { + local count=0 if $client rpc call blocks/head/hash >/dev/null 2>&1; then return; fi printf "Waiting for the node to initialize..." sleep 1 while ! $client rpc call blocks/head/hash >/dev/null 2>&1 do + count=$((count+1)) + if [ "$count" -ge 30 ]; then + echo " timeout." + exit 2 + fi printf "." sleep 1 done @@ -128,3 +134,44 @@ log_endorser() { fi } +## Sandboxed client ######################################################## + +# key pairs from $src_dir/test/sandbox.json + +BOOTSTRAP1_PUBLIC="edpkuBknW28nW72KG6RoHtYW7p12T6GKc7nAbwYX5m8Wd9sDVC9yav" +BOOTSTRAP1_SECRET="edskRuR1azSfboG86YPTyxrQgosh5zChf5bVDmptqLTb5EuXAm9rsnDYfTKhq7rDQujdn5WWzwUMeV3agaZ6J2vPQT58jJAJPi" + +BOOTSTRAP2_PUBLIC="edpktzNbDAUjUk697W7gYg2CRuBQjyPxbEg8dLccYYwKSKvkPvjtV9" +BOOTSTRAP2_SECRET="edskRkJz4Rw2rM5NtabEWMbbg2bF4b1nfFajaqEuEk4SgU7eeDbym9gVQtBTbYo32WUg2zb5sNBkD1whRN7zX43V9bftBbtaKc" + +BOOTSTRAP3_PUBLIC="edpkuTXkJDGcFd5nh6VvMz8phXxU3Bi7h6hqgywNFi1vZTfQNnS1RV" +BOOTSTRAP3_SECRET="edskS3qsqsNgdjUqeMsVcEwBn8dkZ5iDRz6aF21KhcCtRiAkWBypUSbicccR4Vgqm9UdW2Vabuos6seezqgbXTrmcbLUG4rdAC" + +BOOTSTRAP4_PUBLIC="edpkuFrRoDSEbJYgxRtLx2ps82UdaYc1WwfS9sE11yhauZt5DgCHbU" +BOOTSTRAP4_SECRET="edskRg9qcPqaVQa6jXWNMU5p71tseSuR7NzozgqZ9URsVDi81wTyPJdFSBdeakobyHUi4Xgu61jgKRQvkhXrPmEdEUfiqfiJFL" + +BOOTSTRAP5_PUBLIC="edpkv8EUUH68jmo3f7Um5PezmfGrRF24gnfLpH3sVNwJnV5bVCxL2n" +BOOTSTRAP5_SECRET="edskS7rLN2Df3nbS1EYvwJbWo4umD7yPM1SUeX7gp1WhCVpMFXjcCyM58xs6xsnTsVqHQmJQ2RxoAjJGedWfvFmjQy6etA3dgZ" + +DICTATOR_SECRET="edskRhxswacLW6jF6ULavDdzwqnKJVS4UcDTNiCyiH6H8ZNnn2pmNviL7pRNz9kRxxaWQFzEQEcZExGHKbwmuaAcoMegj5T99z" + +add_sandboxed_bootstrap_identities() { + + ${client} add public key bootstrap1 ${BOOTSTRAP1_PUBLIC} + ${client} add secret key bootstrap1 ${BOOTSTRAP1_SECRET} + + ${client} add public key bootstrap2 ${BOOTSTRAP2_PUBLIC} + ${client} add secret key bootstrap2 ${BOOTSTRAP2_SECRET} + + ${client} add public key bootstrap3 ${BOOTSTRAP3_PUBLIC} + ${client} add secret key bootstrap3 ${BOOTSTRAP3_SECRET} + + ${client} add public key bootstrap4 ${BOOTSTRAP4_PUBLIC} + ${client} add secret key bootstrap4 ${BOOTSTRAP4_SECRET} + + ${client} add public key bootstrap5 ${BOOTSTRAP5_PUBLIC} + ${client} add secret key bootstrap5 ${BOOTSTRAP5_SECRET} + + ${client} add secret key dictator ${DICTATOR_SECRET} + +} diff --git a/scripts/init-sandboxed-client.sh b/scripts/init-sandboxed-client.sh new file mode 100755 index 000000000..860df10a5 --- /dev/null +++ b/scripts/init-sandboxed-client.sh @@ -0,0 +1,58 @@ +#! /bin/sh + +set -e + +script_dir="$(cd "$(dirname "$0")" && echo "$(pwd -P)/")" +src_dir="$(dirname "$script_dir")" +cd "$src_dir" + +usage() { + echo "Small script to initialize a client to a local and closed test network with a maximum of 9 nodes." + echo + echo "Usage: eval \`$0 \`" + echo " where should be an integer between 1 and 9." +} + +if [ $# -lt 1 ] || [ "$1" -le 0 ] || [ 10 -le "$1" ]; then + usage + exit 1 +fi + +id="$1" +shift 1 + +rpc=$((18730 + id)) +client_dir="$(mktemp -td tezos-client-XXXXX)" +client="./tezos-client -base-dir $client_dir -addr 127.0.0.1 -port $rpc" + +. "$script_dir/client_lib.inc.sh" + +add_sandboxed_bootstrap_identities | sed -e 's/^/## /' 1>&2 + +cat </dev/null 2>&1 ; then tezos-client-reset; fi ; +alias tezos-client="$client" ; +alias tezos-activate-alpha="$client -block genesis activate protocol ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK with fitness 1 and key dictator" ; +alias tezos-client-reset="rm -rf \"$client_dir\"; unalias tezos-client tezos-activate-alpha tezos-client-reset" ; +trap tezos-client-reset EXIT ; +EOF + +(cat | sed -e 's/^/## /') 1>&2 < [ bake [id] | endorse [id] | exec ... ]" - echo " where should be an integer between 1 and 9." -} - -if [ $# -lt 2 ] || [ "$1" -le 0 ] || [ 10 -le "$1" ]; then - usage - exit 1 -fi - -id="$1" -cmd="$2" -shift 2 - -rpc=$((18730 + id)) -base_dir="/tmp/tezos-client-$rpc" - -client="./tezos-client -base-dir $base_dir -addr 127.0.0.1 -port $rpc" - -. "$script_dir/client_lib.inc.sh" - -function cmd_bake() { - wait_for_the_node_to_be_ready - if [ $# -eq 0 ]; then - create_identity - create_account - fi - start_baker "$@" -} - -function cmd_endorse() { - wait_for_the_node_to_be_ready - if [ $# -eq 0 ]; then - create_account - endorsement - fi - start_endorser "$@" -} - -function cmd_exec() { - $client "$@" -} - -function cmd_clear() { - rm -fr "$base_dir" -} - -if [ ! -d "$base_dir" ] && [ "$cmd" != "clear" ]; then - $client bootstrap -fi - -case $cmd in - bake) - cmd_bake "$@" - ;; - endorse) - cmd_endorse "$@" - ;; - exec) - cmd_exec "$@" - ;; - clear) - cmd_clear - ;; - *) - usage - exit 1 - ;; -esac diff --git a/scripts/launch-node.sh b/scripts/launch-node.sh deleted file mode 100755 index 21043dd11..000000000 --- a/scripts/launch-node.sh +++ /dev/null @@ -1,41 +0,0 @@ -#! /bin/sh - -set -e - -script_dir="$(cd "$(dirname "$0")" && echo "$(pwd -P)/")" -src_dir="$(dirname "$script_dir")" -cd "$src_dir" - -if [ $# -lt 1 ] || [ "$1" -le 0 ] || [ 10 -le "$1" ]; then - echo "Small script to launch local and closed test network with a maximum of 9 nodes." - echo - echo "Usage: $0 " - echo " where should be an integer between 1 and 9." - exit 1 -fi - -id="$1" -shift 1 - -port=$((19730 + id)) -rpc=$((18730 + id)) -expected_pow=10 -data_dir="$(mktemp -td tezos-node-XXXXX)" -peers="--no-bootstrap-peers $(seq -f '--peer localhost:1973%.f' 1 9) --closed" -node="$src_dir/tezos-node" - -cleanup () { - set +e - echo Cleaning up... - rm -rf "$data_dir" -} -trap cleanup EXIT INT - -$node config init \ - --data-dir "$data_dir" \ - --net-addr ":$port" \ - --rpc-addr "[::]:$rpc" \ - --expected-pow "$expected_pow" \ - --connections 2 $peers -$node identity generate "$expected_pow" --data-dir "$data_dir" -$node run --data-dir "$data_dir" "$@" diff --git a/scripts/launch-sandboxed-node.sh b/scripts/launch-sandboxed-node.sh index ff13fe963..075270e06 100755 --- a/scripts/launch-sandboxed-node.sh +++ b/scripts/launch-sandboxed-node.sh @@ -1,25 +1,42 @@ -#!/usr/bin/env bash +#! /bin/sh +set -e script_dir="$(cd "$(dirname "$0")" && echo "$(pwd -P)/")" -export TZPATH="$(dirname $script_dir)" +src_dir="$(dirname "$script_dir")" +cd "$src_dir" -. $TZPATH/test/test_utils.sh +if [ $# -lt 1 ] || [ "$1" -le 0 ] || [ 10 -le "$1" ]; then + echo "Small script to launch local and closed test network with a maximum of 9 nodes." + echo + echo "Usage: $0 " + echo " where should be an integer between 1 and 9." + exit 1 +fi -start_sandboxed_node -sleep 3 +id="$1" +shift 1 -activate_alpha |& sed 's/^/## /' > /dev/stderr +port=$((19730 + id)) +rpc=$((18730 + id)) +expected_pow="${expected_pow:-0.0}" +node_dir="$(mktemp -td tezos-node-XXXXX)" +peers="--no-bootstrap-peers $(seq -f '--peer localhost:1973%.f' 1 9) --closed" +node="$src_dir/tezos-node" +sandbox_param="--sandbox=$script_dir/sandbox.json" -trap - EXIT +cleanup () { + set +e + echo Cleaning up... + rm -rf "$node_dir" +} +trap cleanup EXIT INT -display_aliases - -echo | sed 's/^/## /' 1>&2 <