---
# System prepended metadata

title: Provider chain prep
tags: [game-of-chains]

---

---
tags: game-of-chains
---

# Provider chain prep

## Step 1: Test a private testnet with the provider chain binary

Provider chain binary: gaia branch

Scenario 1:
gaia (Theta+) as provider
interchain-security-cd as consumer


Provider inventory file to start the chain:
```yaml=
---
# yamllint disable rule:line-length
all:
  vars:
    ansible_user: root
    node_user: provider
    chain_home: "{{node_user_home}}/.isp"
    chain_binary_name: gaiad
    chain_version: glnro/ics-sdk45 # "Theta+"
    chain_repository: https://github.com/cosmos/gaia.git
    chain_denom: usit
    chain_id: provider
    chain_home_clear: true
    chain_restore_validator: true
    chain_validator_coins: "1001000000000"
    chain_gentx_validator:    "1000000000"
    cosmovisor_service_name: "cv-provider"
    chain_gov_testing: true
    chain_voting_period: 60s
    reboot: false
    priv_validator_key_file: priv_validator_key.json
    node_key_file: node_key.json
  children:
    node:
      hosts:
        "{{ target }}":
          fast_sync: false
```

Chain starts

Consumer chain inventory to initialize the chain:
```yaml=
---
# yamllint disable rule:line-length
all:
  vars:
    ansible_user: root
    node_user: sputnik
    chain_home: "{{node_user_home}}/.isc"
    chain_binary_name: interchain-security-cd
    chain_version: tags/v0.1.4
    chain_repository: https://github.com/cosmos/interchain-security.git
    chain_denom: stake
    chain_id: sputnik
    chain_home_clear: true
    cosmovisor_service_name: "cv-sputnik"
    priv_validator_key_file: priv_validator_key.json
    node_key_file: node_key.json
    chain_moniker: "sputnik"
    reboot: false
    chain_start: false
  children:
    node:
      hosts:
        "{{ target }}":
          fast_sync: false
          api_port: 1317
          p2p_port: 26656
          rpc_port: 26657
          grpc_port: 9090
          grpc_web_enabled: false
          rpc_pprof_port: 6060
          chain_airdrop: true
          chain_airdrop_accounts:
            - cosmos1e0ls94v2c7vq5kfk86849c0q9wqarnjwkn6zg9
```

Copy the genesis file
Submit the proposal in provider:
```json
{
    "title": "Create the Sputnik chain",
    "description": "This is the proposal to create consumer chain \"sputnik\". The genesis file can be found here: https://github.com/hyphacoop/ics-testnets/private/salt-genesis-fresh.json",
    "chain_id": "sputnik",
    "initial_height": {
        "revision_height": 1
    },
    "genesis_hash": "4b5d741cabc832d5a1527658ebe580340354e62ea849e3e7d21d43023ce20d8d",
    "binary_hash": "170da8c01aefc1772447fbb3c9d76661ad568b3ab16e93e6a0996f999c5d8ae5",
    "spawn_time": "2022-10-05T13:20:00.000000Z",
    "deposit": "1usit"
}
```

Wait for the proposal to go on chain before voting:
```bash=
gaiad tx gov submit-proposal consumer-addition prop.json --from validator --home ~/.isp

gaiad tx gov vote 1 yes --from validator --home ~/.isp
```

Collect ccv states
```bash=
gaiad q provider consumer-genesis sputnik --home ~/.isp --output json > sputnik-ccv-states.json
```

Copy the ccv states to our local machine

Patch the sputnik genesis file
```
jq -s '.[0].app_state.ccvconsumer = .[1] | .[0]' sputnik-fresh-genesis.json sputnik-ccv-states.json > sputnik-genesis.json
```

Copy the patched genesis file to the sputnik machine

Attempt to start sputnik:

- Error: `panic: unknown field "historical_entries" in types.Params`

Try removing the `historical_entries` field from the ccv_params section in the sputnik genesis file.

Attempt to start sputnik again:

- Error: `panic: unknown field "ccv_timeout_period" in types.Params`

Try removing the `ccv_timeout_period` field from the ccv_params section in the sputnik genesis file.

Attempt to start sputnik again:

- Error: `panic: unknown field "consumer_redistribution_fraction" in types.Params`

Try removing the `consumer_redistribution_fraction` field from the ccv_params section in the sputnik genesis file.

Attempt to start sputnik again:


- Error: `panic: unknown field "historical_entries" in types.Params`

Try resetting the database:
```
interchain-security-cd unsafe-reset-all --home ~/.isc
```

Attempt to start sputnik again

```
panic: unknown field "unbonding_period" in types.Params
```

Remove `unbonding period`, reset the database, and start the cv service again.

```
panic: unknown field "transfer_timeout_period" in types.Params
```

Remove `transfer_timeout_period`, reset the database, and start the cv service again.

```
 panic: unknown field "height_to_valset_update_id" in types.GenesisState
```

Remove `height_to_valset_update_id`

```
panic: unknown field "outstanding_downtime_slashing" in types.GenesisState
```

Remove `outstanding_downtime_slashing` and `pending_slash_requests`

**The sputnik chain can now start**

Set up the relayer.

Run the `hermes.yml` playbook:
```yaml=
---
# yamllint disable rule:line-length
all:
  vars:
    chain_home_clear: true
    hermes_version: v1.0.0
    ansible_user: root
    reboot: false
  children:
    hermes:
      hosts:
        goc-2.stg.earthball.xyz:
          hermes_relayer_mnemonics: true
          hermes_order: ordered
          hermes_set_channel_version: true
          hermes_channel_version: '1'
          mode_channels: 'true'
          hermes_set_clients: true
          hermes_chains:
            sputnik:
              hermes_relayer_mnemonic: 'hypha-mnemonic.txt'
              hermes_port_name: consumer
              hermes_client_id: 07-tendermint-0
              hermes_chain_rpc_url_schema: http
              hermes_chain_rpc_hostname: goc-2.stg.earthball.xyz
              hermes_chain_rpc_port: 26657
              hermes_chain_grpc_url_schema: http
              hermes_chain_grpc_hostname: goc-2.stg.earthball.xyz
              hermes_chain_grpc_port: 9090
              hermes_chain_websocket_url_schema: ws
              hermes_chain_rpc_timeout: '10s'
              hermes_chain_account_prefix: 'cosmos'
              hermes_chain_key_name: 'testkey'
              hermes_chain_store_prefix: 'ibc'
              hermes_chain_max_gas: 2000000
              hermes_chain_fee_granter: ''
              gas_price: "{ price = 0.001, denom = 'stake' }"
              hermes_chain_gas_multiplier: 1.1
              hermes_chain_clock_drift: '5s'
              hermes_chain_trusting_period: '14days'
              hermes_chain_trust_threshold: "{ numerator = '1', denominator = '3' }"
            provider:
              hermes_relayer_mnemonic: 'hypha-mnemonic.txt'
              hermes_port_name: provider
              hermes_client_id: 07-tendermint-0
              hermes_chain_rpc_url_schema: http
              hermes_chain_rpc_hostname: goc-1.stg.earthball.xyz
              hermes_chain_rpc_port: 26657
              hermes_chain_grpc_url_schema: http
              hermes_chain_grpc_hostname: goc-1.stg.earthball.xyz
              hermes_chain_grpc_port: 9090
              hermes_chain_websocket_url_schema: ws
              hermes_chain_rpc_timeout: '10s'
              hermes_chain_account_prefix: 'cosmos'
              hermes_chain_key_name: 'testkey'
              hermes_chain_store_prefix: 'ibc'
              hermes_chain_max_gas: 2000000
              hermes_chain_fee_granter: ''
              gas_price: "{ price = 0.001, denom = 'usit' }"
              hermes_chain_gas_multiplier: 1.1
              hermes_chain_clock_drift: '5s'
              hermes_chain_trusting_period: '14days'
              hermes_chain_trust_threshold: "{ numerator = '1', denominator = '3' }"

```

Test the voting power gets updated in the consumer chain when more stake is delegated to a validator in the provider chain.

Scenario 2: (wait until Lauren confirms)
gaia (Theta+) as provider
gaia (Theta+) as consumer


Create keys:
- Validator 1
    - Priv validator key
    - Node key
    - Self-delegation mnemonic & address
    - Node ID
- Validator 2
    - Priv validator key
    - Node key
    - Self-delegation mnemonic and address
    - Node ID

- Faucet mnemonic
- Playmaker 1 mnemonic
- Playmaker 2 mnemonic

Run this test inventory:
```
---
# yamllint disable rule:line-length
all:
  vars:
    ansible_user: root
    node_user: provider
    chain_home: "{{node_user_home}}/.isp"
    chain_binary_name: gaiad
    chain_version: glnro/ics-sdk45 # "Theta+"
    chain_repository: https://github.com/cosmos/gaia.git
    chain_denom: usit
    chain_id: provider
    chain_home_clear: true
    chain_recover_validator: true
    chain_validator_coins: "1002050000000"
    chain_gentx_validator:    "2050000000"
    cosmovisor_service_name: "cv-provider"
    chain_gov_testing: true
    chain_voting_period: 172800s
    reboot: false
    priv_validator_key_file: player_priv_validator_key.json
    node_key_file: player_node_key.json
    chain_airdrop: true
    chain_airdrop_accounts:
      - cosmos1k3lw0g72hc2pdat46z84t8j4uqe4t0heygdc6l
      - cosmos16h4y2kjnax4s9vwfn87tpl37emy7h4hhg3wn69
      - cosmos1ypj5z0djfs6zntx4xlgsylff7y8l6s7uxvcvn9
      - cosmos1mfm3agshcdavujy495d4sprzjqfmdezlhhzu2w
    chain_use_ssl_proxy: true
    chain_api_host: "rest"
    chain_rpc_host: "rpc"
    chain_p2p_host: "p2p"
    chain_grpc_host: "grpc"
    letsencrypt_email: "dante@hypha.coop"
    chain_start: false
  children:
    node:
      hosts:
        "test-player.goc.earthball.xyz":
          fast_sync: false

```

After the genesis file is created:

- update the balances for all airdrop accounts.
- update the supply so it equals the sum of all balances.
- update the unbonding time
- update the max validators
- Check the voting period and gov params
- ccv_timeout_period: 4 wks
- init_timeout_period	2 days
- vsc_timeout_period	8 days
- trusting_period_fraction	"2"
- signed_blocks_window	8640


Copy the modified genesis to the validator node.

Set up as much as we can in the app.toml / config.toml files

Enable the cv-provider service

Start the cv-provider service


Confirm the genesis modifications have been accepted.

- Set up a single validator node: OK


- Add a sentry node
```yaml=
---
# yamllint disable rule:line-length
all:
  vars:
    ansible_user: root
    node_user: provider
    chain_home: "{{node_user_home}}/.isp"
    chain_binary_name: gaiad
    chain_version: glnro/ics-sdk45 # "Theta+"
    chain_repository: https://github.com/cosmos/gaia.git
    genesis_file: test-provider-modified-genesis.json
    chain_id: provider
    chain_home_clear: true
    cosmovisor_service_name: "cv-provider"
    reboot: false
    chain_use_ssl_proxy: true
    chain_api_host: "rest"
    chain_rpc_host: "rpc"
    chain_p2p_host: "p2p"
    chain_grpc_host: "grpc"
    letsencrypt_email: "dante@hypha.coop"
  children:
    node:
      hosts:
        "test-sentry.goc.earthball.xyz":
          fast_sync: false
          pruning: nothing
          api_enabled: true
          p2p_persistent_peers: "4b5cee15e6a9c4b96b8c1c4f396a18b0461edc17@138.197.172.12:26656"

```

- Add a seed node

```yaml=
---
# yamllint disable rule:line-length
all:
  vars:
    ansible_user: root
    node_user: provider
    chain_home: "{{node_user_home}}/.isp"
    chain_binary_name: gaiad
    chain_version: glnro/ics-sdk45 # "Theta+"
    chain_repository: https://github.com/cosmos/gaia.git
    genesis_file: test-provider-modified-genesis.json
    chain_id: provider
    chain_home_clear: true
    cosmovisor_service_name: "cv-provider"
    reboot: false
    chain_use_ssl_proxy: true
    chain_api_host: "rest"
    chain_rpc_host: "rpc"
    chain_p2p_host: "p2p"
    chain_grpc_host: "grpc"
    letsencrypt_email: "dante@hypha.coop"
  children:
    node:
      hosts:
        "test-seed.goc.earthball.xyz":
          fast_sync: false
          pruning: everything
          api_enabled: true
          p2p_persistent_peers: "6fba9b23c2def5b72bcabbdb93e92e1a49cedf69@147.182.155.36:26656"
          p2p_seed_mode: true
```

Update all the app.toml and config.toml settings for the nodes set up so far using the testnet coordinator tasks spreadsheet (see `Assets`).

- Set up a second validator node
```
---
# yamllint disable rule:line-length
all:
  vars:
    ansible_user: root
    node_user: provider
    chain_home: "{{node_user_home}}/.isp"
    chain_binary_name: gaiad
    chain_version: glnro/ics-sdk45 # "Theta+"
    chain_repository: https://github.com/cosmos/gaia.git
    genesis_file: test-provider-modified-genesis.json
    chain_id: provider
    chain_home_clear: true
    cosmovisor_service_name: "cv-provider"
    reboot: false
    priv_validator_key_file: ace_priv_validator_key.json
    node_key_file: ace_node_key.json
    chain_use_ssl_proxy: true
    chain_api_host: "rest"
    chain_rpc_host: "rpc"
    chain_p2p_host: "p2p"
    chain_grpc_host: "grpc"
    letsencrypt_email: "dante@hypha.coop"
  children:
    node:
      hosts:
        "test-ace.goc.earthball.xyz":
          fast_sync: false
          pruning: nothing
          p2p_seeds: "7a86ddc92f56e77a26c4fb4d543412f7175a7c9b@147.182.155.35:26656"
```

The ace node is able to sync with the network.

Next, create a second validator:

Recover the ace key.
```
gaiad keys add ace --home ~/.isp --recover
```

Create the ace validator
```
gaiad tendermint show-validator --home ~/.isp
{"@type":"/cosmos.crypto.ed25519.PubKey","key":"x3/2/KQNr7cSEPaQk48zeApi5TqyLeN9tmPjh97pzQs="}

gaiad tx staking create-validator --amount 50000000usit --pubkey '{"@type":"/cosmos.crypto.ed25519.PubKey","key":"x3/2/KQNr7cSEPaQk48zeApi5TqyLeN9tmPjh97pzQs="}' --moniker ace --chain-id provider --commission-rate 0.10 --commission-max-rate 1.00 --commission-max-change-rate 0.1 --min-self-delegation 1000000 --gas auto --from cosmos1k3lw0g72hc2pdat46z84t8j4uqe4t0heygdc6l --home ~/.isp
```

Set up a block explorer:

Set up DNS for hasura. as well as the hostname, and run this inventory:
```yaml=
---
# yamllint disable rule:line-length

all:
  vars:
    ansible_user: root
    hasura_admin_secret: provider  # Any random password will work
    # Change if not running a cosmos hub testnet, see branches of bdjuno:
    bdjuno_version: "chains/cosmos/testnet"
    bdui_chain: testnet  # Either testnet or mainnet
    bigdipper_use_tls_proxy: true  # Enables TLS, requires a domain name
    letsencrypt_email: "dant@hypha.coop"  # Required for TLS setup
    genesis_file: "test-provider-modified-genesis.json"
    chain_id: provider
    bigdipper_genesis_time: "2022-11-04T16:18:19.631501983Z"
    bigdipper_genesis_height: 1
  children:
    bigdipper:
      hosts:
        "test-explorer.goc.earthball.xyz":
          bdjuno_rpc_address: "https://rpc.test-sentry.goc.earthball.xyz"
          bdjuno_grpc_address: "https://grpc.test-sentry.goc.earthball.xyz"
          bdui_rpc_websocket: "wss://rpc.test-sentry.goc.earthball.xyz/websocket"
```

Data was not showing in the UI, bdjuno's log shows this:
```
ERROR: failed to start client: dial tcp: address rpc.test-sentry.goc.earthball.xyz: missing port in address
```

Update the address and run the inventory again.
Remove nodejs from the droplet
Run the inventory again
Add the hypha logos next.

Set up the faucet:
We'll try to install it on the same droplet as the seed node.
In order for the faucet to give out tokens, we need to recover the faucet account on the node first.

Recover the faucet key in the seed node:
```
gaiad keys add faucet --home ~/.isp --recover
```

Run this inventory:
```
---
# yamllint disable rule:line-length
all:
  vars:
    ansible_user: root
    faucet_address: cosmos16h4y2kjnax4s9vwfn87tpl37emy7h4hhg3wn69
    faucet_use_tls_proxy: true
    letsencrypt_email: "dante@hypha.coop"  # Required for TLS setup
    node_user: provider
    chain_home: "{{node_user_home}}/.isp"
    chain_binary_name: gaiad
    chain_id: provider
    chain_denom: usit
    amount_to_send: 1000
    request_timeout: 604800
    reboot: false
  children:
    faucet:
      hosts:
        "test-faucet.goc.earthball.xyz":

```

Set up the consensus monitor

```yaml=
---
# yamllint disable rule:line-length
all:
  vars:
    ansible_user: root
    consensus_use_tls_proxy: true  # Enables TLS, requires a domain name
    letsencrypt_email: "dante@hypha.coop"  # Required for TLS setup
  children:
    consensus:
      hosts:
        "test-consensus.goc.earthball.xyz":
          consensus_api_node_url: "http://localhost:1317"
          consensus_rpc_node_url: "http://localhost:26657"

```

## Step 2: Try adding a consumer chain

- Propose and vote for an interchain-security-cd consumer
- Start the consumer chain
- Set up the relayer
- 

## Step 3: Start the provider chain


## fixing certificate issue
Enable default site

``ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/``

Disable test-consensus.goc.earthball.xyz in sites-enabled

``mv test-consensus.goc.earthball.xyz /root/``

Restart nginx
``systemctl restart nginx``

Request cert
``certbot certonly --webroot -w /var/www/html/ -d test-consensus.goc.earthball.xyz --rsa-key-size 4096``

Re-enable test-consensus.goc.earthball.xyz
``mv /root/test-consensus.goc.earthball.xyz /etc/nginx/sites-enabled/``

Restart nginx
``systemctl restart nginx``
