#!/bin/bash if [[ -n "$CERC_SCRIPT_DEBUG" ]]; then set -x fi LACONIC_BIN=${LACONIC_BIN:-laconicd} LACONIC_HOME="${LACONIC_HOME:-$HOME/.laconicd}" KEY="node_key" CHAINID=${CHAINID:-"laconic_9000-1"} MONIKER=${MONIKER:-"localtestnet"} KEYRING=${KEYRING:-"test"} DENOM=${DENOM:-"alnt"} STAKING_AMOUNT=${STAKING_AMOUNT:-"1000000000000000"} LOGLEVEL=${LOGLEVEL:-"info"} input_genesis_file=${GENESIS_FILE} laconicd="$LACONIC_BIN --home=$LACONIC_HOME --log_level=debug" set -e hang() { tail -f /dev/null } trap hang EXIT if [[ "$OSTYPE" == "darwin"* ]]; then sed_i="sed -i ''" else sed_i="sed -i" fi if [[ "$1" == "clean" ]] || [[ ! -d "$LACONIC_HOME/data/blockstore.db" ]]; then # validate dependencies are installed command -v jq > /dev/null 2>&1 || { echo >&2 "jq not installed. More info: https://stedolan.github.io/jq/download/" exit 1 } # remove existing daemon and client rm -rf $LACONIC_HOME/* $laconicd config set client chain-id $CHAINID $laconicd config set client keyring-backend $KEYRING # if $KEY exists it should be deleted printf "y\n" | $laconicd keys add $KEY --keyring-backend $KEYRING --no-backup # Set the Nitro node PK # TODO generate? echo "$NITRO_PK" | $laconicd keys import-hex "${KEY}_nitro" # Set moniker and chain-id for Ethermint (Moniker can be anything, chain-id must be an integer) $laconicd init $MONIKER --chain-id $CHAINID --default-denom $DENOM if [[ -f ${input_genesis_file} ]]; then # Use provided genesis config cp $input_genesis_file $LACONIC_HOME/config/genesis.json fi update_genesis() { jq "$1" $LACONIC_HOME/config/genesis.json > $LACONIC_HOME/config/tmp_genesis.json && mv $LACONIC_HOME/config/tmp_genesis.json $LACONIC_HOME/config/genesis.json } if [[ "$TEST_REGISTRY_EXPIRY" == "true" ]]; then echo "Setting timers for expiry tests." update_genesis '.app_state["registry"]["params"]["record_rent_duration"]="60s"' update_genesis '.app_state["registry"]["params"]["authority_grace_period"]="60s"' update_genesis '.app_state["registry"]["params"]["authority_rent_duration"]="60s"' fi if [[ "$TEST_AUCTION_ENABLED" == "true" ]]; then echo "Enabling auction and setting timers." update_genesis '.app_state["registry"]["params"]["authority_auction_enabled"]=true' update_genesis '.app_state["registry"]["params"]["authority_rent_duration"]="60s"' update_genesis '.app_state["registry"]["params"]["authority_grace_period"]="300s"' update_genesis '.app_state["registry"]["params"]["authority_auction_commits_duration"]="60s"' update_genesis '.app_state["registry"]["params"]["authority_auction_reveals_duration"]="60s"' fi if [[ "$ONBOARDING_ENABLED" == "true" ]]; then echo "Enabling onboarding." update_genesis '.app_state["onboarding"]["params"]["onboarding_enabled"]=true' fi if [[ "$AUTHORITY_AUCTION_ENABLED" == "true" ]]; then echo "Enabling authority auctions." update_genesis '.app_state["registry"]["params"]["authority_auction_enabled"]=true' fi if [[ -n $AUTHORITY_AUCTION_COMMITS_DURATION ]]; then echo "Setting authority_auction_commits_duration to $AUTHORITY_AUCTION_COMMITS_DURATION seconds." update_genesis ".app_state[\"registry\"][\"params\"][\"authority_auction_commits_duration\"]=\"${AUTHORITY_AUCTION_COMMITS_DURATION}s\"" fi if [[ -n $AUTHORITY_AUCTION_REVEALS_DURATION ]]; then echo "Setting authority_auction_reveals_duration to $AUTHORITY_AUCTION_REVEALS_DURATION seconds." update_genesis ".app_state[\"registry\"][\"params\"][\"authority_auction_reveals_duration\"]=\"${AUTHORITY_AUCTION_REVEALS_DURATION}s\"" fi if [[ -n $AUTHORITY_GRACE_PERIOD ]]; then echo "Setting authority_grace_period to $AUTHORITY_GRACE_PERIOD seconds." update_genesis ".app_state[\"registry\"][\"params\"][\"authority_grace_period\"]=\"${AUTHORITY_GRACE_PERIOD}s\"" fi # increase block time (?) update_genesis '.consensus["params"]["block"]["time_iota_ms"]="1000"' # Set gas limit in genesis update_genesis '.consensus["params"]["block"]["max_gas"]="10000000"' update_config() { mv -f "$2" "${2}.bak" && tomlq --toml-output "$1" "${2}.bak" > "$2" } # disable empty blocks update_config '.consensus.create_empty_blocks = false' $LACONIC_HOME/config/config.toml # Allow requests from any origin update_config '.rpc.cors_allowed_origins = ["*"]' $LACONIC_HOME/config/config.toml # Enable telemetry (prometheus metrics: http://localhost:1317/metrics?format=prometheus) update_config '.telemetry.enabled = true' $LACONIC_HOME/config/app.toml update_config '.telemetry."prometheus-retention-time" = 60' $LACONIC_HOME/config/app.toml update_config '.instrumentation.prometheus = true' $LACONIC_HOME/config/config.toml # Nitro config update_config " .nitro.\"eth-pk\" = \"${KEY}\" | .nitro.\"eth-url\" = \"${NITRO_ETH_URL}\" | .nitro.\"eth-ca-address\" = \"${NITRO_ETH_CA_ADDRESS}\" | .nitro.\"eth-na-address\" = \"${NITRO_ETH_NA_ADDRESS}\" | .nitro.\"eth-vpa-address\" = \"${NITRO_ETH_VPA_ADDRESS}\" | .nitro.\"eth-start-block\" = \"${NITRO_ETH_START_BLOCK}\" | .nitro.pk = \"${KEY}_nitro\" | .nitro.\"boot-peers\" = \"${NITRO_BOOT_PEERS}\" " $LACONIC_HOME/config/app.toml # Allocate genesis accounts (cosmos formatted addresses) # 10^30 alnt | 10^12 lnt $laconicd genesis add-genesis-account $KEY 1000000000000000000000000000000$DENOM --keyring-backend $KEYRING # Sign genesis transaction # 10^15 alnt $laconicd genesis gentx $KEY $STAKING_AMOUNT$DENOM --keyring-backend $KEYRING --chain-id $CHAINID # Collect genesis tx $laconicd genesis collect-gentxs # Run this to ensure everything worked and that the genesis file is setup correctly $laconicd genesis validate else echo "Using existing database at $LACONIC_HOME. To replace, run '`basename $0` clean'" fi # Start the node (remove the --pruning=nothing flag if historical queries are not needed) # TODO new pruning config $laconicd start \ --log_level "$LOGLEVEL" \ --server.minimum-gas-prices="1$DENOM" \ --rpc.laddr="tcp://0.0.0.0:26657" \ --grpc.address="127.0.0.1:9091" \ --gql.enable --gql.playground