-
-
Save woss/516609f19d9126e936fa172a3b9544cd to your computer and use it in GitHub Desktop.
| #!/usr/bin/env bash | |
| ######################################################################################################################### | |
| ## Make it excutable | |
| ## chmod +x create.sh | |
| ## | |
| ## Parachain example | |
| ## ./create.sh --chain local --image registry.gitlab.com/anagolay/anagolay/idiyanale:3861d9b3 --parachain 4222 | |
| ## | |
| ## Relaychain example | |
| ## ./create.sh --chain rococo-local --image parity/polkadot:v0.9.38 --relay | |
| ######################################################################################################################### | |
| ##### this part taken from https://stackoverflow.com/a/20816534/2764898 | |
| SCRIPTNAME="${0##*/}" | |
| OUTPUT_DIR="./parachain_out" | |
| warn() { | |
| printf '%s \n' "$1" | |
| } | |
| iscmd() { | |
| command -v "$@" >&- | |
| } | |
| checkdeps() { | |
| local -i not_found | |
| for cmd; do | |
| iscmd "$cmd" || { | |
| warn $"$cmd is not found" | |
| ((not_found++)) | |
| } | |
| done | |
| ((not_found == 0)) || { | |
| warn $"Install dependencies listed above to use $SCRIPTNAME" | |
| exit 1 | |
| } | |
| } | |
| ### deps check | |
| checkdeps docker docker-compose jq wget | |
| ####### | |
| # Convenience functions. | |
| usage_error() { | |
| echo >&2 "$(basename "$0"): $1" | |
| exit 2 | |
| } | |
| function show_help() { | |
| USAGE="Usage: ${CMD:=${0##*/}} [(-h|--help)] [--chain=TEXT] [--parachain=NUMBER] [--image=TEXT]" | |
| echo "Anagolay Collator and RelayChain Helper Script" | |
| echo "" | |
| printf "%s\n" "$USAGE" | |
| echo "" | |
| echo "Relaychain params, all mandatory" | |
| echo " --relay - this will not require --parachain since it is expected to build relaychain spec" | |
| echo "" | |
| echo "Parachain params, all mandatory" | |
| echo " --chain - chain spec name. Possible values: local, testnet, ..." | |
| echo " --image - OCI name. If provided in short form it will use docker hub" | |
| echo "" | |
| echo "Optional params" | |
| echo " --parachain - prachain ID. You obtain this through reserving it, or sudo-ing the local relay chain" | |
| echo "" | |
| echo "Common flags" | |
| echo " -h | --help - Shows this help" | |
| echo "" | |
| exit 0 | |
| } | |
| assert_argument() { test "$1" != "$EOL" || usage_error "$2 requires an argument"; } | |
| # shamelessly taken and modified from https://stackoverflow.com/a/62616466/2764898 | |
| # One loop, nothing more. | |
| if [ "$#" != 0 ]; then | |
| EOL=$(printf '\1\3\3\7') | |
| set -- "$@" "$EOL" | |
| while [ "$1" != "$EOL" ]; do | |
| opt="$1" | |
| shift | |
| case "$opt" in | |
| # Your options go here. | |
| -h | --help) | |
| show_help | |
| ;; | |
| --chain) | |
| assert_argument "$1" "$opt" | |
| chain="$1" | |
| shift | |
| ;; | |
| --image) | |
| assert_argument "$1" "$opt" | |
| image="$1" | |
| shift | |
| ;; | |
| --parachain) | |
| assert_argument "$1" "$opt" | |
| parachain="$1" | |
| shift | |
| ;; | |
| # THIS PART IS TO GENERATE RELAYCHAIN SPEC | |
| --relay) isRelay='true' ;; | |
| # Arguments processing. You may remove any unneeded line after the 1st. | |
| --*=*) set -- "${opt%%=*}" "${opt#*=}" "$@" ;; # convert '--name=arg' to '--name' 'arg' | |
| --) while [ "$1" != "$EOL" ]; do | |
| set -- "$@" "$1" | |
| shift | |
| done ;; # process remaining arguments as positional | |
| -*) usage_error "unknown option: '$opt'" ;; # catch misspelled options | |
| *) usage_error "this should NEVER happen ($opt)" ;; # sanity test for previous patterns | |
| esac | |
| done | |
| shift # $EOL | |
| fi | |
| if [ -n "${parachain}" ] && [ -n "${isRelay}" ]; then | |
| echo "❗ You cannnot have --parachain and --relay together. pick one!" | |
| exit 1 | |
| fi | |
| function create_spec() { | |
| mkdir -p $OUTPUT_DIR | |
| # if has --relay flag | |
| if [ "${isRelay}" == "true" ]; then | |
| specfileName="relay-chain-spec-$chain.json" | |
| else | |
| specfileName="chain-spec-$parachain.json" | |
| fi | |
| if test -f "$OUTPUT_DIR/$specfileName"; then | |
| echo " " | |
| echo "================================================" | |
| echo " Spec exist." | |
| echo " Open it and modify it according to your needs." | |
| echo " Then come back here and continue." | |
| echo "================================================" | |
| echo " " | |
| else | |
| echo "Generating the spec file in $OUTPUT_DIR/$specfileName" | |
| cmd="docker run --rm $image build-spec --chain=$chain --disable-default-bootnode > $OUTPUT_DIR/$specfileName" | |
| echo "$cmd" | |
| docker run --rm "$image" build-spec --chain="$chain" --disable-default-bootnode >"$OUTPUT_DIR/$specfileName" | |
| echo " " | |
| echo "================================================" | |
| echo " Spec generated." | |
| echo " Open it and modify it according to your needs." | |
| echo " Then come back here and continue." | |
| echo " DO NOT RUN THIS COMAND AGAIN YOU WILL LOSE ALL YOUR WORK" | |
| echo "================================================" | |
| echo " " | |
| fi | |
| } | |
| function create_raw() { | |
| echo "Generating RAW spec, verification code and genesis state." | |
| # if has --relay flag | |
| if [ "${isRelay}" == "true" ]; then | |
| specfileName="relay-chain-spec-$chain.json" | |
| rawName="relay-chain-raw-$chain.json" | |
| else | |
| specfileName="chain-spec-$parachain.json" | |
| rawName="chain-raw-$parachain.json" | |
| wasmFilename="para-$parachain-wasm.txt" | |
| stateFilename="para-$parachain-state.txt" | |
| fi | |
| echo " build-spec --raw" | |
| docker run -v "$(pwd)/$OUTPUT_DIR":/app --rm "$image" build-spec --raw --chain=/app/"$specfileName" --disable-default-bootnode >"$OUTPUT_DIR/$rawName" | |
| if [ ! "${isRelay}" == "true" ]; then | |
| echo " export-genesis-wasm" | |
| docker run -v "$(pwd)/$OUTPUT_DIR":/app --rm "$image" export-genesis-wasm --chain=/app/"$rawName" >"$OUTPUT_DIR/$wasmFilename" | |
| echo " verificationCode: $OUTPUT_DIR/$wasmFilename" | |
| echo " export-genesis-state" | |
| docker run -v "$(pwd)/$OUTPUT_DIR":/app --rm "$image" export-genesis-state --chain=/app/"$rawName" >"$OUTPUT_DIR/$stateFilename" | |
| echo " genesisState: $OUTPUT_DIR/$stateFilename" | |
| fi | |
| ## exit here because of the bash select will not exit | |
| exit 0 | |
| } | |
| if [[ -n "${chain}" ]]; then | |
| if [[ -z "${image}" ]]; then | |
| echo "image is not provided. Please add --image flag with value [--image anagolay/idiyanale:221121]" | |
| exit 1 | |
| fi | |
| if [ ! "${isRelay}" == "true" ]; then | |
| if [[ -z "${parachain}" ]]; then | |
| echo "parachain ID is not provided. Please add --parachain flag with value [--parachain 4222]" | |
| exit 1 | |
| fi | |
| fi | |
| create_spec | |
| echo "I have updated spec file, please generate raw genesis." | |
| select yn in "Yes" "No"; do | |
| case $yn in | |
| Yes) create_raw ;; | |
| No) exit ;; | |
| esac | |
| done | |
| fi |
https://gist.github.com/woss/516609f19d9126e936fa172a3b9544cd#file-create-parachain-spec-sh-L68-L69 - explain what is it used for
https://gist.github.com/woss/516609f19d9126e936fa172a3b9544cd#file-create-parachain-spec-sh-L50-L64
function show_help() {
USAGE="Usage: ${CMD:=${0##*/}} [(-h|--help)] [--chain=TEXT] [--parachain=NUMBER] [--image=TEXT]"
echo "Anagolay Collator Helper Script"
echo ""
printf "%s\n" "$USAGE"
echo ""
echo " --chain - relay chain spec name. Possible values: local, testnet, polkadot, kusama, etc."
echo " --image - OCI name. If provided without registry domain it will use docker hub."
echo " --parachain - parachain ID. You obtain this through reserving it or sudo-ing the local relay chain."
echo ""
echo " -h | --help - Shows this help."
echo ""
exit 0
}
also, it would be useful to add a link how to get a parachain ID
https://gist.github.com/woss/516609f19d9126e936fa172a3b9544cd#file-create-parachain-spec-sh-L68-L69 - explain what is it used for
https://gist.github.com/woss/516609f19d9126e936fa172a3b9544cd#file-create-parachain-spec-sh-L50-L64
function show_help() { USAGE="Usage: ${CMD:=${0##*/}} [(-h|--help)] [--chain=TEXT] [--parachain=NUMBER] [--image=TEXT]" echo "Anagolay Collator Helper Script" echo "" printf "%s\n" "$USAGE" echo "" echo " --chain - relay chain spec name. Possible values: local, testnet, polkadot, kusama, etc." echo " --image - OCI name. If provided without registry domain it will use docker hub." echo " --parachain - parachain ID. You obtain this through reserving it or sudo-ing the local relay chain." echo "" echo " -h | --help - Shows this help." echo "" exit 0 }also, it would be useful to add a link how to get a parachain ID
the first link you shared --- this code i didn't write, i took it from the link provided above, my shell-scripting knowledge is not that level yet :)
The last link and comment -- this is a script that assumes a person already knows how to get the paraId.
Why I still can't suggest my code here lol...
No proper description what and where is it used for. It should run only in a context with a Dockerfile with a polkadot bin.
https://gist.github.com/woss/516609f19d9126e936fa172a3b9544cd#file-create-parachain-spec-sh-L35 - not cool
https://gist.github.com/woss/516609f19d9126e936fa172a3b9544cd#file-create-parachain-spec-sh-L177 and https://gist.github.com/woss/516609f19d9126e936fa172a3b9544cd#file-create-parachain-spec-sh-L181 - excessive double quotes
https://gist.github.com/woss/516609f19d9126e936fa172a3b9544cd#file-create-parachain-spec-sh-L96 - seems to be unreachable.
I fixed only the deletion of history, the double quotes are passing shell lint so o prob there.
latest revision brings relaychain specs generation
Why I still can't suggest my code here lol...
No proper description what and where is it used for. It should run only in a context with a Dockerfile with a polkadot bin.
https://gist.github.com/woss/516609f19d9126e936fa172a3b9544cd#file-create-parachain-spec-sh-L35 - not cool
https://gist.github.com/woss/516609f19d9126e936fa172a3b9544cd#file-create-parachain-spec-sh-L177 and
https://gist.github.com/woss/516609f19d9126e936fa172a3b9544cd#file-create-parachain-spec-sh-L181 - excessive double quotes
https://gist.github.com/woss/516609f19d9126e936fa172a3b9544cd#file-create-parachain-spec-sh-L96 - seems to be unreachable.