#! /usr/bin/env bash set -e client_dirs=() init_sandboxed_client() { id="$1" shift 1 rpc=$((18730 + id)) client_dir="$(mktemp -d -t tezos-tmp-client.XXXXXXXX)" client_dirs+=("$client_dir") signer="$local_signer -d $client_dir" if [ -n "$USE_TLS" ]; then client="$local_client -S -base-dir $client_dir -addr 127.0.0.1 -port $rpc" admin_client="$local_admin_client -S -base-dir $client_dir -addr 127.0.0.1 -port $rpc" alpha_baker="$local_alpha_baker -S -base-dir $client_dir -addr 127.0.0.1 -port $rpc" alpha_endorser="$local_alpha_endorser -S -base-dir $client_dir -addr 127.0.0.1 -port $rpc" alpha_accuser="$local_alpha_accuser -S -base-dir $client_dir -addr 127.0.0.1 -port $rpc" signer="$local_signer -S -base-dir $client_dir -addr 127.0.0.1 -port $rpc" else client="$local_client -base-dir $client_dir -addr 127.0.0.1 -port $rpc" admin_client="$local_admin_client -base-dir $client_dir -addr 127.0.0.1 -port $rpc" alpha_baker="$local_alpha_baker -base-dir $client_dir -addr 127.0.0.1 -port $rpc" alpha_endorser="$local_alpha_endorser -base-dir $client_dir -addr 127.0.0.1 -port $rpc" alpha_accuser="$local_alpha_accuser -base-dir $client_dir -addr 127.0.0.1 -port $rpc" signer="$local_signer -base-dir $client_dir -addr 127.0.0.1 -port $rpc" fi parameters_file="${parameters_file:-$client_dir/protocol_parameters.json}" if ! [ -f "$parameters_file" ]; then cat > "$parameters_file" </dev/null 2>&1; then return; fi printf "Waiting for the node to initialize..." sleep 1 while ! $client rpc get /chains/main/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 echo " done." } wait_for_the_node_to_be_bootstraped() { wait_for_the_node_to_be_ready echo "Waiting for the node to synchronize with the network..." $client bootstrapped } ## Baker ################################################################### check_baker() { pids=$(pgrep -x tezos-alpha-baker 2>/dev/null) for pid in $pids; do if grep -- "-max-priority" "/proc/$pid/cmdline" >/dev/null 2>&1 ; then return 0 fi done return 1 } run_baker() { if check_baker; then echo "Cannot run two bakers in the same container." exit 1 fi echo "Start baker..." exec $alpha_baker launch daemon -max-priority 64 "$@" > "$client_dir/baker.log" } stop_baker() { pids=$(pgrep -x tezos-alpha-baker 2>/dev/null) for pid in $pids; do if grep -- "-max-priority" "/proc/$pid/cmdline" >/dev/null 2>&1 ; then echo "Killing the baker..." kill "$pid" fi done } log_baker() { if ! check_baker ; then echo echo "##############################################" echo "## ##" echo "## Warning: The tezos baker is not running! ##" echo "## ##" echo "##############################################" echo tail "$client_dir/baker.log" else tail -f "$client_dir/baker.log" fi } ## Endorser ################################################################ check_endorser() { pids=$(pgrep -x tezos-alpha-endorser 2>/dev/null) for pid in $pids; do if grep -- "tezos-alpha-endorser" "/proc/$pid/cmdline" > /dev/null 2>&1 ; then return 0 fi done return 1 } run_endorser() { if check_endorser; then echo "Cannot run two endorsers in the same container." exit 1 fi echo "Start endorser..." exec $alpha_endorser launch daemon"$@" > "$client_dir/endorser.log" } stop_endorser() { pids=$(pgrep -x tezos-alpha-endorser 2>/dev/null) for pid in $pids; do if grep -- "tezos-alpha-endorser" "/proc/$pid/cmdline" > /dev/null 2>&1 ; then kill "$pid" fi done } log_endorser() { if ! check_endorser ; then echo echo "#################################################" echo "## ##" echo "## Warning: The tezos endorser is not running! ##" echo "## ##" echo "#################################################" echo tail "$client_dir/endorser.log" else tail -f "$client_dir/endorser.log" fi } ## Sandboxed client ######################################################## # key pairs from $src_dir/test/sandbox.json BOOTSTRAP1_IDENTITY="tz1KqTpEZ7Yob7QbPE4Hy4Wo8fHG8LhKxZSx" BOOTSTRAP1_PUBLIC="edpkuBknW28nW72KG6RoHtYW7p12T6GKc7nAbwYX5m8Wd9sDVC9yav" BOOTSTRAP1_SECRET="unencrypted:edsk3gUfUPyBSfrS9CCgmCiQsTCHGkviBDusMxDJstFtojtc1zcpsh" BOOTSTRAP2_IDENTITY="tz1gjaF81ZRRvdzjobyfVNsAeSC6PScjfQwN" BOOTSTRAP2_PUBLIC="edpktzNbDAUjUk697W7gYg2CRuBQjyPxbEg8dLccYYwKSKvkPvjtV9" BOOTSTRAP2_SECRET="unencrypted:edsk39qAm1fiMjgmPkw1EgQYkMzkJezLNewd7PLNHTkr6w9XA2zdfo" BOOTSTRAP3_IDENTITY="tz1faswCTDciRzE4oJ9jn2Vm2dvjeyA9fUzU" BOOTSTRAP3_PUBLIC="edpkuTXkJDGcFd5nh6VvMz8phXxU3Bi7h6hqgywNFi1vZTfQNnS1RV" BOOTSTRAP3_SECRET="unencrypted:edsk4ArLQgBTLWG5FJmnGnT689VKoqhXwmDPBuGx3z4cvwU9MmrPZZ" BOOTSTRAP4_IDENTITY="tz1b7tUupMgCNw2cCLpKTkSD1NZzB5TkP2sv" BOOTSTRAP4_PUBLIC="edpkuFrRoDSEbJYgxRtLx2ps82UdaYc1WwfS9sE11yhauZt5DgCHbU" BOOTSTRAP4_SECRET="unencrypted:edsk2uqQB9AY4FvioK2YMdfmyMrer5R8mGFyuaLLFfSRo8EoyNdht3" BOOTSTRAP5_IDENTITY="tz1ddb9NMYHZi5UzPdzTZMYQQZoMub195zgv" BOOTSTRAP5_PUBLIC="edpkv8EUUH68jmo3f7Um5PezmfGrRF24gnfLpH3sVNwJnV5bVCxL2n" BOOTSTRAP5_SECRET="unencrypted:edsk4QLrcijEffxV31gGdN2HU7UpyJjA8drFoNcmnB28n89YjPNRFm" ACTIVATOR_SECRET="unencrypted:edsk31vznjHSSpGExDMHYASz45VZqXN4DPxvsa4hAyY8dHM28cZzp6" add_sandboxed_bootstrap_identities() { ${client} import secret key bootstrap1 ${BOOTSTRAP1_SECRET} ${client} import secret key bootstrap2 ${BOOTSTRAP2_SECRET} ${client} import secret key bootstrap3 ${BOOTSTRAP3_SECRET} ${client} import secret key bootstrap4 ${BOOTSTRAP4_SECRET} ${client} import secret key bootstrap5 ${BOOTSTRAP5_SECRET} ${client} import secret key activator ${ACTIVATOR_SECRET} } activate_alpha() { ${client} \ -block genesis \ activate protocol ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK \ with fitness 1 \ and key activator \ and parameters "${parameters_file}" \ --timestamp $(TZ='AAA+1' date +%FT%TZ) } 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." } main () { local bin_dir="$(cd "$(dirname "$0")" && echo "$(pwd -P)/")" if [ $(basename "$bin_dir") = "bin_client" ]; then local_client="${local_client:-$bin_dir/../../_build/default/src/bin_client/main_client.exe}" local_admin_client="${local_admin_client:-$bin_dir/../../_build/default/src/bin_client/main_admin.exe}" local_alpha_baker="${local_alpha_baker:-$bin_dir/../../_build/default/src/proto_alpha/bin_baker/main_baker_alpha.exe}" local_signer="${local_signer:-$bin_dir/../../_build/default/src/bin_signer/main_signer.exe}" local_alpha_endorser="${local_alpha_endorser:-$bin_dir/../../_build/default/src/proto_alpha/bin_endorser/main_endorser_alpha.exe}" local_alpha_accuser="${local_alpha_accuser:-$bin_dir/../../_build/default/src/proto_alpha/bin_accuser/main_accuser_alpha.exe}" parameters_file="${parameters_file:-$bin_dir/../../scripts/protocol_parameters.json}" else # we assume a clean install with tezos-(admin-)client in the path local_client="${local_client:-$(which tezos-client)}" local_admin_client="${local_admin_client:-$(which tezos-admin-client)}" local_alpha_baker="${local_alpha_baker:-$(which tezos-alpha-baker)}" local_alpha_endorser="${local_alpha_endorser:-$(which tezos-alpha-endorser)}" local_alpha_accuser="${local_alpha_accuser:-$(which tezos-alpha-accuser)}" local_signer="${local_signer:-$(which tezos-signer)}" fi if [ $# -lt 1 ] || [ "$1" -le 0 ] || [ 10 -le "$1" ]; then usage exit 1 fi init_sandboxed_client "$1" add_sandboxed_bootstrap_identities | sed -e 's/^/## /' 1>&2 mkdir -p $client_dir/bin echo '#!/bin/sh' > $client_dir/bin/tezos-client echo "exec $client \"\$@\"" >> $client_dir/bin/tezos-client chmod +x $client_dir/bin/tezos-client echo '#!/bin/sh' > $client_dir/bin/tezos-admin-client echo "exec $admin_client \"\$@\"" >> $client_dir/bin/tezos-admin-client chmod +x $client_dir/bin/tezos-admin-client echo '#!/bin/sh' > $client_dir/bin/tezos-alpha-baker echo "exec $alpha_baker \"\$@\"" >> $client_dir/bin/tezos-alpha-baker chmod +x $client_dir/bin/tezos-alpha-baker echo '#!/bin/sh' > $client_dir/bin/tezos-alpha-endorser echo "exec $alpha_endorser \"\$@\"" >> $client_dir/bin/tezos-alpha-endorser chmod +x $client_dir/bin/tezos-alpha-endorser echo '#!/bin/sh' > $client_dir/bin/tezos-alpha-accuser echo "exec $alpha_accuser \"\$@\"" >> $client_dir/bin/tezos-alpha-accuser chmod +x $client_dir/bin/tezos-alpha-accuser echo '#!/bin/sh' > $client_dir/bin/tezos-signer echo "exec $signer \"\$@\"" >> $client_dir/bin/tezos-signer chmod +x $client_dir/bin/tezos-signer cat </dev/null 2>&1 ; then tezos-client-reset; fi ; PATH="$client_dir/bin:\$PATH" ; export PATH ; alias tezos-activate-alpha="$client -block genesis activate protocol ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK with fitness 1 and key activator and parameters $parameters_file --timestamp $(TZ='AAA+1' date +%FT%TZ)" ; alias tezos-client-reset="rm -rf \"$client_dir\"; unalias tezos-activate-alpha tezos-client-reset" ; alias tezos-autocomplete="if [ \$ZSH_NAME ] ; then autoload bashcompinit ; bashcompinit ; fi ; source \"$bin_dir/bash-completion.sh\"" ; trap tezos-client-reset EXIT ; EOF (cat | sed -e 's/^/## /') 1>&2 <