pystarport is like a cosmos starport without the scaffolding feature. it's mainly used for development and testing. It's developed for the Crypto.org Chain, but it can also be used for any cosmos-sdk based projects.
a typical configuration for a devnet is like this:
chainmaind:
  cmd: chain-maind  # chain binary to use, optional
  validators:  # genesis validators
    - coins: 10cro
      staked: 10cro
    - coins: 10cro
      staked: 10cro
  accounts:  # genesis accounts
    - name: community
      coins: 100cro
    - name: ecosystem
      coins: 200cro
    - name: reserve
      coins: 200cro
      vesting_coins: 100cro # if not provided, the all of coins will be vested
      vesting: "1d"
    - name: launch
      coins: 100cro
  genesis:  # patch genesis states
   app_state:
     staking:
       params:
         unbonding_time: "10s"
The validators section defines how many nodes to run, for each node, a home directory is initialized in
data/node{i}, and a validator account with specified coins is created.
The accounts defines other non-validator accounts, they are created in node0's keyring.
In the genesis section you can override any genesis configuration with the same json path.
NAME
    pystarport serve - prepare and start a devnet from scatch
SYNOPSIS
    pystarport serve <flags>
DESCRIPTION
    prepare and start a devnet from scatch
FLAGS
    --data=DATA
        Type: str
        Default: './data'
        path to the root data directory
    --config=CONFIG
        Type: str
        Default: './config.yaml'
        path to the configuration file
    --base_port=BASE_PORT
        Type: int
        Default: 26650
        the base port to use, the service ports of different nodes are calculated based on this
    --cmd=CMD
        Type: str
        Default: 'chain-maind'
        the chain binary to use
The rules to calculate service ports based on base port is defined in the
ports.py module.
For example, with default base port 26650, the url of api servers of the nodes would be:
- Node0: http://127.0.0.1:26654
- Node1: http://127.0.0.1:26664
The swagger doc of node0 is http://127.0.0.1:26654/swagger/
The default rpc port used by
chain-maindis26657, that's the default node0's rpc port, so you can usechain-maindwithout change to access node0's rpc.
pystarport embeded a supervisor to manage processes of multiple nodes, you can use
pystarport supervisorctl to manage the processes:
$ pystarport supervisorctl status
node0                            RUNNING   pid 35210, uptime 0:00:29
node1                            RUNNING   pid 35211, uptime 0:00:29
$ pystarport supervisorctl help
default commands (type help <topic>):
=====================================
add    exit      open  reload  restart   start   tail
avail  fg        pid   remove  shutdown  status  update
clear  maintail  quit  reread  signal    stop    version
Or enter an interactive shell:
$ pystarport supervisorctl
node0                            RUNNING   pid 35210, uptime 0:01:53
node1                            RUNNING   pid 35211, uptime 0:01:53
supervisor>
After started the chain, you can use chain-maind cli directly, there are also some wrapper commands provided by
pystarport cli. It understands the directory structure and port rules, also assuming keyring-backend=test, and there
are shortcuts for commonly used commands, so arguments are shorter.
$ pystarport cli - --help
...
A simple transaction bot that works for cluster created by pystarport as well as a local node
Copy and modify bot.yaml.sample to bot.yaml with your desired bot configurations.
- Make sure you have provide the nodefor each job in thebot.yaml
- Run the command
$ pystarport bot --chain-id=[cluster_chain_id] - start
$ pstarport bot --node_rpc=tcp://127.0.0.1:26657 --data=/path/to/your/local/node/home/ - start
When used with docker-compose or multiple machines, you need to config hostnames, and you probabely want to use a same
base_port since you don't have port conflicts, you can config the validators like this:
validators:
  - coins: 10cro
    staked: 10cro
    base_port: 26650
    hostname: node0
  - coins: 10cro
    staked: 10cro
    base_port: 26650
    hostname: node1pystarport init --gen_compose_file will also generate a docker-compose.yml file for you.
It can setup multiple devnets at once, and connect them with ibc relayer.
ibc-0:
  validators:
    - coins: 10cro
      staked: 10cro
      base_port: 26650
    - coins: 10cro
      staked: 10cro
  accounts:
    - name: relayer
      coins: 100cro
  genesis:
    app_state:
      transfer:
        params:
          receive_enabled: true
          send_enabled: true
ibc-1:
  validators:
    - coins: 10cro
      staked: 10cro
      base_port: 26750
    - coins: 10cro
      staked: 10cro
      base_port: 26760
  accounts:
    - name: relayer
      coins: 100cro
  genesis:
    app_state:
      transfer:
        params:
          receive_enabled: true
          send_enabled: true
relayer: # refer here (https://hermes.informal.systems/config.html) for more configs
  global:
    strategy: 'packets'
    log_level: 'info'
  chains:
    - id: "ibc-0" # id is needed to match chain id
      trusting_period: "20s"
    - id: "ibc-1" # id is needed to match chain id
      trusting_period: "20s"
With following commands to setup ibc, you are ready to play with ibc functionalities:
# spawn the devnets
pystarport serve --config ibc.yaml
# setup ibc channel
hermes -c data/relayer.toml create channel ibc-0 ibc-1 --port-a transfer --port-b transfer
# start relayer process
supervisorctl -c data/tasks.ini start relayer-demo
More about poetry.
poetry install
Remember to run poetry env info after poetry install and update this python.defaultInterpreterPath
{
    "python.formatting.provider": "black",
    // after running `poetry env info`, change python.defaultInterpreterPath to Path under Virtualenv
    "python.defaultInterpreterPath": "~/Library/Caches/pypoetry/virtualenvs/to_be_updated",
    "editor.formatOnSave": true,
    "python.linting.flake8Enabled": true,
    "python.formatting.blackArgs": [
        "--line-length=88"
    ],
    "python.sortImports.args": [
        "--profile",
        "black"
    ],
    "[python]": {
        "editor.codeActionsOnSave": {
            "source.organizeImports": true
        }
    }
}More about jsonnet.
make test
Set environment variable TMPPATH=/tmp to shorten the unix domain socket path.