Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .github/workflows/ci-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ on:
- story-docker
- kava-docker
- evmos-docker
- canto-docker
- mezo-docker
- kii-docker
- tac-docker
Expand Down Expand Up @@ -99,6 +100,15 @@ jobs:
elif [ "${CHAIN_ENV}" = "evmos-docker" ]; then
echo "Pulling Evmos Docker image..."
DOCKER_DEFAULT_PLATFORM=linux/amd64 docker pull tharsishq/evmos:v20.0.0
elif [ "${CHAIN_ENV}" = "canto-docker" ]; then
echo "Building Canto Docker image from source..."
git clone --depth 1 https://github.com/Canto-Network/Canto.git /tmp/canto-src
cd /tmp/canto-src
# Upstream Dockerfile uses deprecated golang:stretch; patch to a maintained base image
sed -i 's/^FROM golang:stretch AS build-env/FROM golang:1.21-bookworm AS build-env/' Dockerfile
sed -i 's/^FROM golang:stretch$/FROM golang:1.21-bookworm/' Dockerfile
DOCKER_DEFAULT_PLATFORM=linux/amd64 docker build -t canto-network/canto:local .
echo "canto-network/canto:local built successfully"
elif [ "${CHAIN_ENV}" = "kii-docker" ]; then
echo "Building kiichain/kiichaind Docker image from source..."
git clone --depth 1 --branch v7.0.1 https://github.com/KiiChain/kiichain.git /tmp/kiichain-src
Expand Down Expand Up @@ -147,6 +157,9 @@ jobs:
elif [ "${CHAIN_ENV}" = "evmos-docker" ]; then
chmod +x init-multinode.sh
./init-multinode.sh
elif [ "${CHAIN_ENV}" = "canto-docker" ]; then
chmod +x init-multinode.sh
./init-multinode.sh
elif [ "${CHAIN_ENV}" = "kii-docker" ]; then
chmod +x init-multinode.sh
./init-multinode.sh
Expand All @@ -157,6 +170,8 @@ jobs:
chmod +x init-multinode.sh
./init-multinode.sh
elif [ "${CHAIN_ENV}" = "sei-docker" ]; then
chmod +x init-multinode.sh
./init-multinode.sh
elif [ "${CHAIN_ENV}" = "injective-docker" ]; then
chmod +x init-multinode.sh
./init-multinode.sh
Expand Down Expand Up @@ -333,6 +348,9 @@ jobs:
elif [ "${CHAIN_ENV}" = "evmos-docker" ]; then
echo "=== Evmos validator1 logs (last 100 lines) ==="
docker compose --env-file .env.multinode -f docker-compose.yml logs evmos-validator1 --tail=100 2>/dev/null || true
elif [ "${CHAIN_ENV}" = "canto-docker" ]; then
echo "=== Canto validator1 logs (last 100 lines) ==="
docker compose --env-file .env.multinode -f docker-compose.yml logs canto-validator1 --tail=100 2>/dev/null || true
elif [ "${CHAIN_ENV}" = "kii-docker" ]; then
echo "=== Kii validator1 logs (last 100 lines) ==="
docker compose --env-file .env.multinode -f docker-compose.yml logs kii-validator1 --tail=100 2>/dev/null || true
Expand Down
11 changes: 11 additions & 0 deletions chains/canto-docker/.env.multinode
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Canto Multi-Validator Localnet Environment Variables
# Copy to .env.multinode and adjust as needed

# Canto Docker image tag
CANTO_TAG=local

# CometBFT persistent peers (auto-populated by init-multinode.sh)
PERSISTENT_PEERS=4db90966006cfeabeb3942da3b05622ed4927d87@canto-validator1:26656,7322977d89d5ca6e25f6d134bda08e8f35825363@canto-validator2:26656,9724e8b1b3c6a3b256996e23a8d9333a285727bb@canto-validator3:26656,974355153a8ec9e4a7e73267ef7d90e7faf9f156@canto-validator4:26656

# Logging
LOG_LEVEL=info
11 changes: 11 additions & 0 deletions chains/canto-docker/.env.multinode.sample
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Canto Multi-Validator Localnet Environment Variables
# Copy to .env.multinode and adjust as needed

# Canto Docker image tag
CANTO_TAG=local

# CometBFT persistent peers (auto-populated by init-multinode.sh)
PERSISTENT_PEERS=""

# Logging
LOG_LEVEL=info
174 changes: 174 additions & 0 deletions chains/canto-docker/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
# docker-compose.yml
# Canto 4-Validator Localnet for ChainSmith Testing
#
# Architecture: Each validator = 1 cantod container (CometBFT + EVM in same process)
#
# Usage:
# 1. Init: ./init-multinode.sh
# 2. Start: ./start-multinode.sh
# 3. Check: docker compose --env-file .env.multinode -f docker-compose.yml ps
# 4. Logs: docker compose --env-file .env.multinode -f docker-compose.yml logs -f canto-validator1
# 5. Stop: ./stop-multinode.sh

services:
# ============ Validator 1 ============
canto-validator1:
image: canto-network/canto:${CANTO_TAG:-local}
entrypoint: ['cantod']
restart: unless-stopped
user: root
networks:
canto-multi:
env_file:
- .env.multinode
logging:
options:
max-size: '12m'
max-file: '5'
command: >
start
--home /root/.cantod
--chain-id canto_7700-1
--p2p.laddr "tcp://0.0.0.0:26656"
--p2p.persistent_peers "${PERSISTENT_PEERS}"
--rpc.laddr "tcp://0.0.0.0:26657"
--minimum-gas-prices "0.0001acanto"
--json-rpc.api "eth,txpool,personal,net,debug,web3"
--pruning nothing
--log_level ${LOG_LEVEL:-info}
volumes:
- type: volume
source: canto_validator1_home
target: /root/.cantod
ports:
- '26657:26657' # CometBFT RPC
- '1317:1317' # Cosmos REST API
- '8545:8545' # EVM JSON-RPC
- '8546:8546' # EVM WebSocket
- '9090:9090' # gRPC
- '26656:26656' # P2P

# ============ Validator 2 ============
canto-validator2:
image: canto-network/canto:${CANTO_TAG:-local}
entrypoint: ['cantod']
restart: unless-stopped
user: root
networks:
canto-multi:
env_file:
- .env.multinode
logging:
options:
max-size: '12m'
max-file: '5'
command: >
start
--home /root/.cantod
--chain-id canto_7700-1
--p2p.laddr "tcp://0.0.0.0:26656"
--p2p.persistent_peers "${PERSISTENT_PEERS}"
--rpc.laddr "tcp://0.0.0.0:26657"
--minimum-gas-prices "0.0001acanto"
--json-rpc.api "eth,txpool,personal,net,debug,web3"
--pruning nothing
--log_level ${LOG_LEVEL:-info}
volumes:
- type: volume
source: canto_validator2_home
target: /root/.cantod
ports:
- '36657:26657' # CometBFT RPC
- '21317:1317' # Cosmos REST API
- '28545:8545' # EVM JSON-RPC
- '28546:8546' # EVM WebSocket
- '36656:26656' # P2P

# ============ Validator 3 ============
canto-validator3:
image: canto-network/canto:${CANTO_TAG:-local}
entrypoint: ['cantod']
restart: unless-stopped
user: root
networks:
canto-multi:
env_file:
- .env.multinode
logging:
options:
max-size: '12m'
max-file: '5'
command: >
start
--home /root/.cantod
--chain-id canto_7700-1
--p2p.laddr "tcp://0.0.0.0:26656"
--p2p.persistent_peers "${PERSISTENT_PEERS}"
--rpc.laddr "tcp://0.0.0.0:26657"
--minimum-gas-prices "0.0001acanto"
--json-rpc.api "eth,txpool,personal,net,debug,web3"
--pruning nothing
--log_level ${LOG_LEVEL:-info}
volumes:
- type: volume
source: canto_validator3_home
target: /root/.cantod
ports:
- '46657:26657' # CometBFT RPC
- '31317:1317' # Cosmos REST API
- '38545:8545' # EVM JSON-RPC
- '38546:8546' # EVM WebSocket
- '46656:26656' # P2P

# ============ Validator 4 ============
canto-validator4:
image: canto-network/canto:${CANTO_TAG:-local}
entrypoint: ['cantod']
restart: unless-stopped
user: root
networks:
canto-multi:
env_file:
- .env.multinode
logging:
options:
max-size: '12m'
max-file: '5'
command: >
start
--home /root/.cantod
--chain-id canto_7700-1
--p2p.laddr "tcp://0.0.0.0:26656"
--p2p.persistent_peers "${PERSISTENT_PEERS}"
--rpc.laddr "tcp://0.0.0.0:26657"
--minimum-gas-prices "0.0001acanto"
--json-rpc.api "eth,txpool,personal,net,debug,web3"
--pruning nothing
--log_level ${LOG_LEVEL:-info}
volumes:
- type: volume
source: canto_validator4_home
target: /root/.cantod
ports:
- '56657:26657' # CometBFT RPC
- '41317:1317' # Cosmos REST API
- '48545:8545' # EVM JSON-RPC
- '48546:8546' # EVM WebSocket
- '56656:26656' # P2P

volumes:
canto_validator1_home:
external: true
name: canto_validator1_home
canto_validator2_home:
external: true
name: canto_validator2_home
canto_validator3_home:
external: true
name: canto_validator3_home
canto_validator4_home:
external: true
name: canto_validator4_home

networks:
canto-multi:
Loading
Loading