From 107fdafe576b5772a3966a338ff3dc1817d42baa Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 3 Aug 2022 20:35:18 -0600 Subject: [PATCH 0001/1010] Initial commit --- README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..d63717cc --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# orchestrator-play \ No newline at end of file From ac81d642aac43b459431ba0e81159d590325cf1f Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 3 Aug 2022 20:37:16 -0600 Subject: [PATCH 0002/1010] Initial commit --- docker-compose-test.yaml | 36 ++++++++++++++++++++++ repository-list.txt | 8 +++++ setup-repositories.py | 55 ++++++++++++++++++++++++++++++++++ testcontainers-compose-test.py | 8 +++++ 4 files changed, 107 insertions(+) create mode 100644 docker-compose-test.yaml create mode 100644 repository-list.txt create mode 100644 setup-repositories.py create mode 100644 testcontainers-compose-test.py diff --git a/docker-compose-test.yaml b/docker-compose-test.yaml new file mode 100644 index 00000000..10153ef9 --- /dev/null +++ b/docker-compose-test.yaml @@ -0,0 +1,36 @@ +version: '3' + +services: + + # Postgresql DB + db: + image: timescale/timescaledb:latest-pg14 + command: -c work_mem=256MB + restart: unless-stopped + environment: + POSTGRES_PASSWORD: db + POSTGRES_USER: db + POSTGRES_DB: db + POSTGRES_HOST_AUTH_METHOD: trust + ports: + # Postgresql + - "5432" + + # Elastic + es: + restart: unless-stopped + image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0 + environment: + - xpack.security.enabled=false + - discovery.type=single-node + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + cap_add: + - IPC_LOCK + ports: + - 9200 diff --git a/repository-list.txt b/repository-list.txt new file mode 100644 index 00000000..f37ba485 --- /dev/null +++ b/repository-list.txt @@ -0,0 +1,8 @@ +vulcanize/ops +vulcanize/ipld-eth-db +vulcanize/go-ethereum +vulcanize/ipld-eth-server +vulcanize/eth-statediff-fill-service +vulcanize/ipld-eth-db-validator +vulcanize/ipld-eth-beacon-indexer +vulcanize/ipld-eth-beacon-db diff --git a/setup-repositories.py b/setup-repositories.py new file mode 100644 index 00000000..527d2b44 --- /dev/null +++ b/setup-repositories.py @@ -0,0 +1,55 @@ +# env vars: +# DEV_ROOT defaults to ~/vulcanize + +import os +import argparse +from pydoc import ispackage +from decouple import config +import git + +parser = argparse.ArgumentParser( + description="git clone the set of repositories required to build the complete system from source", + epilog="Config provided either in .env or settings.ini or env vars: DEV_ROOT (defaults to ~/vulcanize)" + ) +parser.add_argument("--verbose", action="store_true", help="increase output verbosity") +parser.add_argument("--quiet", action="store_true", help="don\'t print informational output") +parser.add_argument("--check-only", action="store_true", help="looks at what\'s already there and checks if it looks good") +parser.add_argument("--dry-run", action="store_true", help="don\'t do anything, just print the commands that would be executed") + +args = parser.parse_args() +print(args) + +verbose = args.verbose +quiet = args.quiet + +dev_root_path = config("DEV_ROOT", default="~/vulcanize") + +if not args.quiet: + print(f'Dev Root is: {dev_root_path}') + +with open("repository-list.txt") as repositoryListFile: + repos = repositoryListFile.read().splitlines() + +if verbose: + print (f'Repos: {repos}') + +# Ok, now we can go ahead and look to see which if any of the repos are already cloned + +def processRepo(repo): + full_github_repo_path = f'git@github.com:{repo}' + repoName = repo.split("/")[-1] + fullFilesystemRepoPath = os.path.join(dev_root_path, repoName) + isPresent = os.path.isdir(fullFilesystemRepoPath) + print(f'Checking: {fullFilesystemRepoPath}, exists: {isPresent}') + if not isPresent: + # Clone + if not quiet: + print(f'Running git clone for {full_github_repo_path} into {fullFilesystemRepoPath}') + if not args.check_only: + git.Repo.clone_from(full_github_repo_path, fullFilesystemRepoPath) + else: + print("(git clone skipped)") + + +for repo in repos: + processRepo(repo) diff --git a/testcontainers-compose-test.py b/testcontainers-compose-test.py new file mode 100644 index 00000000..e098cbe5 --- /dev/null +++ b/testcontainers-compose-test.py @@ -0,0 +1,8 @@ +from testcontainers.compose import DockerCompose +from testcontainers.core.docker_client import DockerClient +from testcontainers.core.exceptions import NoSuchPortExposed +from testcontainers.core.waiting_utils import wait_for_logs + +with DockerCompose(filepath=".", compose_file_name="docker-compose-test.yaml") as compose: + port = compose.get_service_port("db", 5432) + print(port) From bdc2448c668b302a8ab905c14b4cd7cba40b24b2 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 3 Aug 2022 20:39:30 -0600 Subject: [PATCH 0003/1010] Add pip stuff --- pip-stuff.sh | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 pip-stuff.sh diff --git a/pip-stuff.sh b/pip-stuff.sh new file mode 100644 index 00000000..e9b301cc --- /dev/null +++ b/pip-stuff.sh @@ -0,0 +1,4 @@ +pip install testcontainers +python -m pip install --upgrade pip +pip install python-decouple +pip install gitpython From 2addef2b28d9026accb5802e7490099c826db923 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 10 Aug 2022 12:11:48 -0600 Subject: [PATCH 0004/1010] Tidy up --- setup-repositories.py | 48 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/setup-repositories.py b/setup-repositories.py index 527d2b44..b94f88b4 100644 --- a/setup-repositories.py +++ b/setup-repositories.py @@ -2,10 +2,29 @@ # DEV_ROOT defaults to ~/vulcanize import os +import sys import argparse from pydoc import ispackage from decouple import config import git +from tqdm import tqdm + +class CloneProgress(git.RemoteProgress): + def __init__(self): + super().__init__() + self.pbar = tqdm(unit = 'B', ascii = True, unit_scale = True) + + def update(self, op_code, cur_count, max_count=None, message=''): + self.pbar.total = max_count + self.pbar.n = cur_count + self.pbar.refresh() + +def is_git_repo(path): + try: + _ = git.Repo(path).git_dir + return True + except git.exc.InvalidGitRepositoryError: + return False parser = argparse.ArgumentParser( description="git clone the set of repositories required to build the complete system from source", @@ -22,11 +41,16 @@ print(args) verbose = args.verbose quiet = args.quiet -dev_root_path = config("DEV_ROOT", default="~/vulcanize") +dev_root_path = os.path.expanduser(config("DEV_ROOT", default="~/vulcanize")) if not args.quiet: print(f'Dev Root is: {dev_root_path}') +if not os.path.isdir(dev_root_path): + if not quiet: + print(f'Dev root directory doesn\'t exist, creating') + os.makedirs(dev_root_path) + with open("repository-list.txt") as repositoryListFile: repos = repositoryListFile.read().splitlines() @@ -38,15 +62,23 @@ if verbose: def processRepo(repo): full_github_repo_path = f'git@github.com:{repo}' repoName = repo.split("/")[-1] - fullFilesystemRepoPath = os.path.join(dev_root_path, repoName) - isPresent = os.path.isdir(fullFilesystemRepoPath) - print(f'Checking: {fullFilesystemRepoPath}, exists: {isPresent}') - if not isPresent: + full_filesystem_repo_path = os.path.join(dev_root_path, repoName) + is_present = os.path.isdir(full_filesystem_repo_path) + if not quiet: + present_text = f'already exists active branch: {git.Repo(full_filesystem_repo_path).active_branch}' if is_present else 'Needs to be fetched' + print(f'Checking: {full_filesystem_repo_path}: {present_text}') + # Quick check that it's actually a repo + if is_present: + if not is_git_repo(full_filesystem_repo_path): + print(f'Error: {full_filesystem_repo_path} does not contain a valid git repository') + sys.exit(1) + if not is_present: # Clone - if not quiet: - print(f'Running git clone for {full_github_repo_path} into {fullFilesystemRepoPath}') + if verbose: + print(f'Running git clone for {full_github_repo_path} into {full_filesystem_repo_path}') if not args.check_only: - git.Repo.clone_from(full_github_repo_path, fullFilesystemRepoPath) + git.Repo.clone_from(full_github_repo_path, full_filesystem_repo_path, + progress = None if quiet else CloneProgress()) else: print("(git clone skipped)") From c15e376dea2744276f0ebd54562b8572800bba22 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 10 Aug 2022 16:56:42 -0600 Subject: [PATCH 0005/1010] Add container and cluster lists --- cluster-list.txt | 10 ++++++++++ container-image-list.txt | 9 +++++++++ 2 files changed, 19 insertions(+) create mode 100644 cluster-list.txt create mode 100644 container-image-list.txt diff --git a/cluster-list.txt b/cluster-list.txt new file mode 100644 index 00000000..d99e9f24 --- /dev/null +++ b/cluster-list.txt @@ -0,0 +1,10 @@ +contract +db-sharding +db +eth-statediff-fill-service +go-ethereum +ipld-eth-beacon-db +ipld-eth-beacon-indexer +ipld-eth-server +lighthouse +prometheus-grafana diff --git a/container-image-list.txt b/container-image-list.txt new file mode 100644 index 00000000..4822748f --- /dev/null +++ b/container-image-list.txt @@ -0,0 +1,9 @@ +vulcanize/test-contract +vulcanize/eth-statediff-fill-service +vulcanize/go-ethereum +vulcanize/lighthouse +vulcanize/ipld-eth-db +vulcanize/eth-statediff-fill-service +vulcanize/ipld-eth-beacon_db +vulcanize/ipld-eth-beacon-indexer +vulcanize/ipld-eth-server From 3c6e8075b31cb496fc38ee9354f43722870a1862 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 11 Aug 2022 16:17:55 -0600 Subject: [PATCH 0006/1010] Add container build files --- .../build.sh | 25 + .../vulcanize-go-ethereum-foundry/Dockerfile | 19 + .../vulcanize-go-ethereum-foundry/build.sh | 7 + .../deploy-local-network.sh | 220 ++++++ .../genesis-automine.json | 19 + .../genesis.json | 19 + .../start-private-network.sh | 64 ++ .../stateful/foundry.toml | 7 + .../stateful/lib/ds-test/LICENSE | 674 ++++++++++++++++++ .../stateful/lib/ds-test/Makefile | 14 + .../stateful/lib/ds-test/default.nix | 4 + .../stateful/lib/ds-test/demo/demo.sol | 223 ++++++ .../stateful/lib/ds-test/src/test.sol | 434 +++++++++++ .../stateful/src/Stateful.sol | 23 + .../stateful/src/test/Stateful.t.sol | 19 + .../vulcanize-go-ethereum/build.sh | 2 + .../vulcanize-ipld-eth-beacon-db/build.sh | 21 + .../build.sh | 2 + .../vulcanize-ipld-eth-db/build.sh | 2 + .../vulcanize-ipld-eth-server/build.sh | 2 + .../vulcanize-lighthouse/Dockerfile | 8 + container-build/vulcanize-lighthouse/build.sh | 27 + .../vulcanize-lighthouse/start-lighthouse.sh | 9 + .../vulcanize-test-contract/build.sh | 17 + 24 files changed, 1861 insertions(+) create mode 100755 container-build/vulcanize-eth-statediff-fill-service/build.sh create mode 100644 container-build/vulcanize-go-ethereum-foundry/Dockerfile create mode 100755 container-build/vulcanize-go-ethereum-foundry/build.sh create mode 100755 container-build/vulcanize-go-ethereum-foundry/deploy-local-network.sh create mode 100644 container-build/vulcanize-go-ethereum-foundry/genesis-automine.json create mode 100644 container-build/vulcanize-go-ethereum-foundry/genesis.json create mode 100755 container-build/vulcanize-go-ethereum-foundry/start-private-network.sh create mode 100644 container-build/vulcanize-go-ethereum-foundry/stateful/foundry.toml create mode 100644 container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/LICENSE create mode 100644 container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/Makefile create mode 100644 container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/default.nix create mode 100644 container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/demo/demo.sol create mode 100644 container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/src/test.sol create mode 100644 container-build/vulcanize-go-ethereum-foundry/stateful/src/Stateful.sol create mode 100644 container-build/vulcanize-go-ethereum-foundry/stateful/src/test/Stateful.t.sol create mode 100755 container-build/vulcanize-go-ethereum/build.sh create mode 100755 container-build/vulcanize-ipld-eth-beacon-db/build.sh create mode 100755 container-build/vulcanize-ipld-eth-beacon-indexer/build.sh create mode 100755 container-build/vulcanize-ipld-eth-db/build.sh create mode 100755 container-build/vulcanize-ipld-eth-server/build.sh create mode 100644 container-build/vulcanize-lighthouse/Dockerfile create mode 100755 container-build/vulcanize-lighthouse/build.sh create mode 100755 container-build/vulcanize-lighthouse/start-lighthouse.sh create mode 100755 container-build/vulcanize-test-contract/build.sh diff --git a/container-build/vulcanize-eth-statediff-fill-service/build.sh b/container-build/vulcanize-eth-statediff-fill-service/build.sh new file mode 100755 index 00000000..fb146b43 --- /dev/null +++ b/container-build/vulcanize-eth-statediff-fill-service/build.sh @@ -0,0 +1,25 @@ +# Build vulcanize/eth-statediff-fill-service +docker build -t vulcanize/eth-statediff-fill-service:local ${vulcanize_repo_base_dir}/eth-statediff-fill-service + +#version: "3.2" +#services: +# eth-statediff-fill-service: +# restart: unless-stopped +# depends_on: +# ipld-eth-db: +# condition: service_healthy +# build: +# context: ${vulcanize_eth_statediff_fill_service} +# dockerfile: ./Dockerfile +# environment: +# ETH_SERVER_HTTPPATH: 0.0.0.0:8085 +# VDB_COMMAND: "serve" +# DATABASE_NAME: "vulcanize_testing" +# DATABASE_HOSTNAME: "ipld-eth-db" +# DATABASE_PORT: 5432 +# DATABASE_USER: "vdbm" +# DATABASE_PASSWORD: "password" +# ETH_HTTP_PATH: $eth_http_path +# WATCHED_ADDRESS_GAP_FILLER_INTERVAL: $watched_address_gap_filler_interval +# ports: +# - "127.0.0.1:8085:8085" diff --git a/container-build/vulcanize-go-ethereum-foundry/Dockerfile b/container-build/vulcanize-go-ethereum-foundry/Dockerfile new file mode 100644 index 00000000..24cc838b --- /dev/null +++ b/container-build/vulcanize-go-ethereum-foundry/Dockerfile @@ -0,0 +1,19 @@ +FROM ghcr.io/foundry-rs/foundry + +RUN apk update ; apk add --no-cache --allow-untrusted ca-certificates curl bash git jq +RUN apk add --no-cache --upgrade grep +WORKDIR /root + +ARG GENESIS_FILE_PATH=genesis.json + +COPY stateful ./stateful +COPY start-private-network.sh . +COPY deploy-local-network.sh . +COPY $GENESIS_FILE_PATH ./genesis.json +# TODO: figure out if this works for aarm64 +COPY --from=vulcanize/go-ethereum:local /usr/local/bin/geth /bin/geth +RUN chmod +x /bin/geth + +EXPOSE 8545 +EXPOSE 8546 +ENTRYPOINT ["./start-private-network.sh"] diff --git a/container-build/vulcanize-go-ethereum-foundry/build.sh b/container-build/vulcanize-go-ethereum-foundry/build.sh new file mode 100755 index 00000000..43b4bc21 --- /dev/null +++ b/container-build/vulcanize-go-ethereum-foundry/build.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# Build vulcanize/go-ethereum-foundry + +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t vulcanize/go-ethereum-foundry:local ${SCRIPT_DIR} diff --git a/container-build/vulcanize-go-ethereum-foundry/deploy-local-network.sh b/container-build/vulcanize-go-ethereum-foundry/deploy-local-network.sh new file mode 100755 index 00000000..3ccb6994 --- /dev/null +++ b/container-build/vulcanize-go-ethereum-foundry/deploy-local-network.sh @@ -0,0 +1,220 @@ +#!/bin/bash +set -e + +OPTS="./deploy-local-network.sh [] ... +./deploy-local-network.sh --help +-- +db-user=name database user +db-password=password database password +db-name=name database name +db-host=address database host +db-port=port database port +db-write=bool turn on database write mode +db-type=name the type of database +db-driver=name the driver used for the database +db-waitforsync=bool Should the statediff service start once geth has synced to head (default: false) +rpc-port=port change RPC port (default: 8545) +rpc-addr=address change RPC address (default: 127.0.0.1) +chain-id=number change chain ID (default: 99) +extra-args=name extra args to pass to geth on startup +period=seconds use a block time instead of instamine +accounts=number create multiple accounts (default: 1) +address=address eth address to add to genesis +save=name after finishing, save snapshot +load=name start from a previously saved snapshot +dir=directory testnet directory +" + +eval "$( + git rev-parse --parseopt -- "$@" <<<"$OPTS" || echo exit $? +)" + +DB_USER=vdbm +DB_PASSWORD=password +DB_NAME=vulcanize_public +DB_HOST=127.0.0.1 +DB_PORT=5432 +DB_TYPE=postgres +DB_DRIVER=sqlx +DB_WAIT_FOR_SYNC=false +RPC_PORT=8545 +RPC_ADDRESS=127.0.0.1 +PERIOD=0 +CHAINID=99 +ACCOUNTS=0 +ADDRESS= +EXTRA_START_ARGS= +gethdir=$HOME/testnet + +while [[ $1 ]]; do + case $1 in + --) shift; break;; + --db-user) shift; DB_USER=$1;; + --db-password) shift; DB_PASSWORD=$1;; + --db-name) shift; DB_NAME=$1;; + --db-host) shift; DB_HOST=$1;; + --db-port) shift; DB_PORT=$1;; + --db-write) shift; DB_WRITE=$1;; + --db-type) shift; DB_TYPE=$1;; + --db-driver) shift; DB_DRIVER=$1;; + --db-waitforsync) shift; DB_WAIT_FOR_SYNC=$1;; + --rpc-port) shift; RPC_PORT=$1;; + --rpc-addr) shift; RPC_ADDRESS=$1;; + --chain-id) shift; CHAINID=$1;; + --extra-args) shift; EXTRA_START_ARGS=$1;; + --period) shift; PERIOD=$1;; + --accounts) shift; ACCOUNTS=$1;; + --save) shift; SAVE=$1;; + --address) shift; ADDRESS=$1;; + --load) shift; LOAD=$1;; + --dir) shift; gethdir=$1;; + *) printf "${0##*/}: internal error: %q\\n" "$1"; exit 1 + esac; shift +done + +mkdir -p "$gethdir/config/" + +# Set a password +if [[ ! -f "$gethdir/config/password" ]] +then + echo "password" > "$gethdir/config/password" +fi + +# Create a genesis file if there is no existing chain. +if [[ ! -f "$gethdir/config/genesis.json" ]] +then +for i in $(seq 0 "$ACCOUNTS"); do + address+=( "$( + geth 2>/dev/null account new --datadir "$gethdir" --password=$gethdir/config/password \ + | grep -o -E "0x[A-Fa-f0-9]*" )" ) + balance+=(' "'"${address[i]}"'": { "balance": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}') + EXTRA_DATA="0x3132333400000000000000000000000000000000000000000000000000000000${address[0]#0x}0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +done +if [[ "$USE_GENESIS" != "true" ]] + then + echo "NOT USING GENESIS FILE!!" + echo "USE_GENESIS = $USE_GENESIS" + JSON_VAL='{ + "config": { + "chainId": '"$CHAINID"', + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "clique": { + "period": '"$PERIOD"', + "epoch": 3000 + } + }, + "difficulty": "0x1", + "gaslimit": "0xffffffffffff", + "extraData": "'"$EXTRA_DATA"'", + "alloc": {'"$balance"'} + }' + echo $JSON_VAL | jq . > $gethdir/config/genesis.json + + geth 2>/dev/null --datadir "$gethdir" init "$gethdir/config/genesis.json" + printf "%s\n" "${address[@]}" > "$gethdir/config/account" + else + echo "Using local genesis file" + jq '. + {"extraData": "'"$EXTRA_DATA"'"} + {"alloc": {'"$balance"'}}' ./genesis.json> "$gethdir/config/genesis.json" + geth 2>/dev/null --datadir "$gethdir" init "$gethdir/config/genesis.json" + printf "%s\n" "${address[@]}" > "$gethdir/config/account" + fi +else + address=( $(cat $gethdir/config/account) ) +fi + +export ETH_RPC_URL=http://$RPC_ADDRESS:$RPC_PORT + +port=$((RPC_PORT + 30000)) + +geth version +echo >&2 "testnet: RPC URL: $ETH_RPC_URL" +echo >&2 "testnet: DB ADDRESS: $DB_HOST" +echo >&2 "testnet: TCP port: $port" +echo >&2 "testnet: Chain ID: $CHAINID" +echo >&2 "testnet: Database: $gethdir" +echo >&2 "testnet: Geth log: $gethdir/geth.log" + +echo "$ETH_RPC_URL" > "$gethdir/config/rpc-url" +echo "$port" > "$gethdir/config/node-port" + +set +m +# Uncomment below once waitforsync has been merged +# geth \ +# 2> >(tee "$gethdir/geth.log" | grep --line-buffered Success | sed 's/^/geth: /' >&2) \ +# --datadir "$gethdir" --networkid "$CHAINID" --port="$port" \ +# --mine --miner.threads=1 --allow-insecure-unlock \ +# --http --http.api "web3,eth,net,debug,personal,statediff" --http.corsdomain '*' --http.vhosts '*' --nodiscover \ +# --http.addr="$RPC_ADDRESS" --http.port="$RPC_PORT" --syncmode=full --gcmode=archive \ +# --statediff --statediff.db.host="$DB_HOST" --statediff.db.port="$DB_PORT" --statediff.db.user="$DB_USER" \ +# --statediff.db.password="$DB_PASSWORD" --statediff.db.name="$DB_NAME" \ +# --statediff.db.nodeid 1 --statediff.db.clientname test1 --statediff.writing="$DB_WRITE" \ +# --statediff.db.type="$DB_TYPE" --statediff.db.driver="$DB_DRIVER" --statediff.waitforsync="$DB_WAIT_FOR_SYNC" \ +# --ws --ws.addr="0.0.0.0" --unlock="$(IFS=,; echo "${address[*]}")" --password=<(exit) & + +echo "Starting Geth with following flags" +echo \ + 2> >(tee "$gethdir/geth.log" | grep --line-buffered Success | sed 's/^/geth: /' >&2) \ + --datadir "$gethdir" --networkid "$CHAINID" --port="$port" \ + --mine --miner.threads=1 --allow-insecure-unlock \ + --http --http.api "admin,debug,eth,miner,net,personal,txpool,web3,statediff" --http.corsdomain '*' --http.vhosts '*' --nodiscover \ + --http.addr="$RPC_ADDRESS" --http.port="$RPC_PORT" --syncmode=full --gcmode=archive \ + --statediff --statediff.db.host="$DB_HOST" --statediff.db.port="$DB_PORT" --statediff.db.user="$DB_USER" \ + --statediff.db.password="$DB_PASSWORD" --statediff.db.name="$DB_NAME" \ + --statediff.db.nodeid 1 --statediff.db.clientname test1 --statediff.writing="$DB_WRITE" \ + --statediff.db.type="$DB_TYPE" --statediff.db.driver="$DB_DRIVER" \ + --ws --ws.addr="0.0.0.0" --ws.origins '*' --ws.api=admin,debug,eth,miner,net,personal,txpool,web3 \ + --nat=none --miner.gasprice 16000000000 --nat=none \ + --unlock="$(IFS=,; echo "${address[*]}")" --password="$gethdir/config/password" \ + $EXTRA_START_ARGS & +geth \ + 2> >(tee "$gethdir/geth.log" | grep --line-buffered Success | sed 's/^/geth: /' >&2) \ + --datadir "$gethdir" --networkid "$CHAINID" --port="$port" \ + --mine --miner.threads=1 --allow-insecure-unlock \ + --http --http.api "admin,debug,eth,miner,net,personal,txpool,web3,statediff" --http.corsdomain '*' --http.vhosts '*' --nodiscover \ + --http.addr="$RPC_ADDRESS" --http.port="$RPC_PORT" --syncmode=full --gcmode=archive \ + --statediff --statediff.db.host="$DB_HOST" --statediff.db.port="$DB_PORT" --statediff.db.user="$DB_USER" \ + --statediff.db.password="$DB_PASSWORD" --statediff.db.name="$DB_NAME" \ + --statediff.db.nodeid 1 --statediff.db.clientname test1 --statediff.writing="$DB_WRITE" \ + --statediff.db.type="$DB_TYPE" --statediff.db.driver="$DB_DRIVER" \ + --ws --ws.addr="0.0.0.0" --ws.origins '*' --ws.api=admin,debug,eth,miner,net,personal,txpool,web3 \ + --nat=none --miner.gasprice 16000000000 --nat=none \ + --unlock="$(IFS=,; echo "${address[*]}")" --password="$gethdir/config/password" \ + $EXTRA_START_ARGS & + +gethpid=$! +echo "Geth started" +echo "Geth PID: $gethpid" + +clean() { + ( set -x; kill -INT $gethpid; wait ) + if [[ $SAVE ]]; then + echo >&2 "testnet: saving $gethdir/snapshots/$SAVE" + mkdir -p "$gethdir/snapshots/$SAVE" + cp -r "$gethdir/keystore" "$gethdir/snapshots/$SAVE" + cp -r "$gethdir/config" "$gethdir/snapshots/$SAVE" + geth >/dev/null 2>&1 --datadir "$gethdir" \ + export "$gethdir/snapshots/$SAVE/backup" + fi +} +trap clean EXIT + +echo "Curling: $ETH_RPC_URL" +until curl -s "$ETH_RPC_URL"; do sleep 1; done + +echo "Curling: $ETH_RPC_URL complete" +export ETH_KEYSTORE=$gethdir/keystore +export ETH_PASSWORD=$gethdir/config/password + +printf 'testnet: Account: %s (default)\n' "${address[0]}" >&2 + +[[ "${#address[@]}" -gt 1 ]] && printf 'testnet: Account: %s\n' "${address[@]:1}" >&2 + +echo "Geth Start up completed!" +while true; do sleep 3600; done diff --git a/container-build/vulcanize-go-ethereum-foundry/genesis-automine.json b/container-build/vulcanize-go-ethereum-foundry/genesis-automine.json new file mode 100644 index 00000000..a00a614e --- /dev/null +++ b/container-build/vulcanize-go-ethereum-foundry/genesis-automine.json @@ -0,0 +1,19 @@ +{ + "config": { + "chainId": 99, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "clique": { + "period": 2, + "epoch": 3000 + } + }, + "difficulty": "0x1", + "gaslimit": "0xffffffffffff" +} diff --git a/container-build/vulcanize-go-ethereum-foundry/genesis.json b/container-build/vulcanize-go-ethereum-foundry/genesis.json new file mode 100644 index 00000000..9319b56d --- /dev/null +++ b/container-build/vulcanize-go-ethereum-foundry/genesis.json @@ -0,0 +1,19 @@ +{ + "config": { + "chainId": 99, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "clique": { + "period": 0, + "epoch": 3000 + } + }, + "difficulty": "0x1", + "gaslimit": "0xffffffffffff" +} diff --git a/container-build/vulcanize-go-ethereum-foundry/start-private-network.sh b/container-build/vulcanize-go-ethereum-foundry/start-private-network.sh new file mode 100755 index 00000000..58bc090d --- /dev/null +++ b/container-build/vulcanize-go-ethereum-foundry/start-private-network.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +set -ex + +# clean up +trap 'killall geth' EXIT +trap "exit 1" SIGINT SIGTERM + +ETHDIR="/root/ethereum" +mkdir -p $ETHDIR +/bin/bash deploy-local-network.sh --rpc-addr 0.0.0.0 --db-user $DB_USER --db-password $DB_PASSWORD --db-name $DB_NAME \ + --db-host $DB_HOST --db-port $DB_PORT --db-write $DB_WRITE --dir "$ETHDIR" --address $ADDRESS \ + --db-type $DB_TYPE --db-driver $DB_DRIVER --db-waitforsync $DB_WAIT_FOR_SYNC --chain-id $CHAIN_ID --extra-args "$EXTRA_START_ARGS" & + +# give it a few secs to start up +COUNT=0 +ATTEMPTS=15 +until $(nc -v localhost 8545) || [[ $COUNT -eq $ATTEMPTS ]]; do echo -e "$(( COUNT++ ))... \c"; sleep 10; done +[[ $COUNT -eq $ATTEMPTS ]] && echo "Could not connect to localhost 8545" && (exit 1) + +# Run tests +cd stateful +forge build +forge test --fork-url http://localhost:8545 + +# Deploy contracts + +ETH_KEYSTORE_FILES=() +echo "ETH KEYSTORE: $ETHDIR/keystore" +for entry in `ls $ETHDIR/keystore`; do + ETH_KEYSTORE_FILES+=("${ETHDIR}/keystore/${entry}") +done + +echo "ETH_KEYSTORE_FILES: $ETH_KEYSTORE_FILES" +ETH_KEYSTORE_FILE=${ETH_KEYSTORE_FILES[0]} + +mkdir -p ~/transaction_info +echo $ETH_KEYSTORE_FILE > ~/transaction_info/CURRENT_ETH_KEYSTORE_FILE +echo $ETHDIR > ~/transaction_info/ETHDIR + +if [ "${#ETH_KEYSTORE_FILES[@]}" -eq 1 ]; then + echo "Only one KEYSTORE" +else + echo "WARNING: More than one file in keystore: ${ETH_KEYSTORE_FILES}" +fi + +DEPLOYED_ADDRESS=$(forge create --keystore $(cat ~/transaction_info/CURRENT_ETH_KEYSTORE_FILE) --rpc-url http://127.0.0.1:8545 --constructor-args 1 --password $(cat ${ETHDIR}/config/password) --legacy /root/stateful/src/Stateful.sol:Stateful | grep "Deployed to:" | cut -d " " -f 3) +echo "Contract has been deployed to: $DEPLOYED_ADDRESS" + +echo $DEPLOYED_ADDRESS > ~/transaction_info/STATEFUL_TEST_DEPLOYED_ADDRESS +# Call a transaction + +#TX_OUT=$(cast send --keystore $ETH_KEYSTORE_FILE --rpc-url http://127.0.0.1:8545 --password "" --legacy $DEPLOYED_ADDRESS "off()") +TX_OUT=$(cast send --keystore $(cat ~/transaction_info/CURRENT_ETH_KEYSTORE_FILE) --rpc-url http://127.0.0.1:8545 --password $(cat $(cat ~/transaction_info/ETHDIR)/config/password) --legacy $(cat ~/transaction_info/STATEFUL_TEST_DEPLOYED_ADDRESS) "inc()") +echo 'cast send --keystore $(cat ~/transaction_info/CURRENT_ETH_KEYSTORE_FILE) --rpc-url http://127.0.0.1:8545 --password $(cat $(cat ~/transaction_info/ETHDIR)/config/password) --legacy $(cat ~/transaction_info/STATEFUL_TEST_DEPLOYED_ADDRESS) "inc()" ' > ~/transaction_info/NEW_TRANSACTION +# Simply run the command below whenever you want to call the smart contract and create a new block +chmod +x ~/transaction_info/NEW_TRANSACTION + + +echo "TX OUTPUT: $TX_OUT" + + +# Run forever +tail -f /dev/null diff --git a/container-build/vulcanize-go-ethereum-foundry/stateful/foundry.toml b/container-build/vulcanize-go-ethereum-foundry/stateful/foundry.toml new file mode 100644 index 00000000..19903e0b --- /dev/null +++ b/container-build/vulcanize-go-ethereum-foundry/stateful/foundry.toml @@ -0,0 +1,7 @@ +[default] +src = 'src' +out = 'out' +libs = ['lib'] +remappings = ['ds-test/=lib/ds-test/src/'] + +# See more config options https://github.com/gakonst/foundry/tree/master/config \ No newline at end of file diff --git a/container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/LICENSE b/container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/LICENSE new file mode 100644 index 00000000..94a9ed02 --- /dev/null +++ b/container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/Makefile b/container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/Makefile new file mode 100644 index 00000000..661dac48 --- /dev/null +++ b/container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/Makefile @@ -0,0 +1,14 @@ +all:; dapp build + +test: + -dapp --use solc:0.4.23 build + -dapp --use solc:0.4.26 build + -dapp --use solc:0.5.17 build + -dapp --use solc:0.6.12 build + -dapp --use solc:0.7.5 build + +demo: + DAPP_SRC=demo dapp --use solc:0.7.5 build + -hevm dapp-test --verbose 3 + +.PHONY: test demo diff --git a/container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/default.nix b/container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/default.nix new file mode 100644 index 00000000..cf65419a --- /dev/null +++ b/container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/default.nix @@ -0,0 +1,4 @@ +{ solidityPackage, dappsys }: solidityPackage { + name = "ds-test"; + src = ./src; +} diff --git a/container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/demo/demo.sol b/container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/demo/demo.sol new file mode 100644 index 00000000..d3a7d81f --- /dev/null +++ b/container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/demo/demo.sol @@ -0,0 +1,223 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity >=0.4.23; + +import "../src/test.sol"; + +contract DemoTest is DSTest { + function test_this() public pure { + require(true); + } + function test_logs() public { + emit log("-- log(string)"); + emit log("a string"); + + emit log("-- log_named_uint(string, uint)"); + log_named_uint("uint", 512); + + emit log("-- log_named_int(string, int)"); + log_named_int("int", -512); + + emit log("-- log_named_address(string, address)"); + log_named_address("address", address(this)); + + emit log("-- log_named_bytes32(string, bytes32)"); + log_named_bytes32("bytes32", "a string"); + + emit log("-- log_named_bytes(string, bytes)"); + log_named_bytes("bytes", hex"cafefe"); + + emit log("-- log_named_string(string, string)"); + log_named_string("string", "a string"); + + emit log("-- log_named_decimal_uint(string, uint, uint)"); + log_named_decimal_uint("decimal uint", 1.0e18, 18); + + emit log("-- log_named_decimal_int(string, int, uint)"); + log_named_decimal_int("decimal int", -1.0e18, 18); + } + event log_old_named_uint(bytes32,uint); + function test_old_logs() public { + log_old_named_uint("key", 500); + log_named_bytes32("bkey", "val"); + } + function test_trace() public view { + this.echo("string 1", "string 2"); + } + function test_multiline() public { + emit log("a multiline\\n" "string"); + emit log("a multiline " "string"); + log_bytes("a string"); + log_bytes("a multiline\n" "string"); + log_bytes("a multiline\\n" "string"); + emit log(unicode"Ώ"); + logs(hex"0000"); + log_named_bytes("0x0000", hex"0000"); + logs(hex"ff"); + } + function echo(string memory s1, string memory s2) public pure + returns (string memory, string memory) + { + return (s1, s2); + } + + function prove_this(uint x) public { + log_named_uint("sym x", x); + assertGt(x + 1, 0); + } + + function test_logn() public { + assembly { + log0(0x01, 0x02) + log1(0x01, 0x02, 0x03) + log2(0x01, 0x02, 0x03, 0x04) + log3(0x01, 0x02, 0x03, 0x04, 0x05) + } + } + + event MyEvent(uint, uint indexed, uint, uint indexed); + function test_events() public { + emit MyEvent(1, 2, 3, 4); + } + + function test_asserts() public { + string memory err = "this test has failed!"; + emit log("## assertTrue(bool)\n"); + assertTrue(false); + emit log("\n"); + assertTrue(false, err); + + emit log("\n## assertEq(address,address)\n"); + assertEq(address(this), msg.sender); + emit log("\n"); + assertEq(address(this), msg.sender, err); + + emit log("\n## assertEq32(bytes32,bytes32)\n"); + assertEq32("bytes 1", "bytes 2"); + emit log("\n"); + assertEq32("bytes 1", "bytes 2", err); + + emit log("\n## assertEq(bytes32,bytes32)\n"); + assertEq32("bytes 1", "bytes 2"); + emit log("\n"); + assertEq32("bytes 1", "bytes 2", err); + + emit log("\n## assertEq(uint,uint)\n"); + assertEq(uint(0), 1); + emit log("\n"); + assertEq(uint(0), 1, err); + + emit log("\n## assertEq(int,int)\n"); + assertEq(-1, -2); + emit log("\n"); + assertEq(-1, -2, err); + + emit log("\n## assertEqDecimal(int,int,uint)\n"); + assertEqDecimal(-1.0e18, -1.1e18, 18); + emit log("\n"); + assertEqDecimal(-1.0e18, -1.1e18, 18, err); + + emit log("\n## assertEqDecimal(uint,uint,uint)\n"); + assertEqDecimal(uint(1.0e18), 1.1e18, 18); + emit log("\n"); + assertEqDecimal(uint(1.0e18), 1.1e18, 18, err); + + emit log("\n## assertGt(uint,uint)\n"); + assertGt(uint(0), 0); + emit log("\n"); + assertGt(uint(0), 0, err); + + emit log("\n## assertGt(int,int)\n"); + assertGt(-1, -1); + emit log("\n"); + assertGt(-1, -1, err); + + emit log("\n## assertGtDecimal(int,int,uint)\n"); + assertGtDecimal(-2.0e18, -1.1e18, 18); + emit log("\n"); + assertGtDecimal(-2.0e18, -1.1e18, 18, err); + + emit log("\n## assertGtDecimal(uint,uint,uint)\n"); + assertGtDecimal(uint(1.0e18), 1.1e18, 18); + emit log("\n"); + assertGtDecimal(uint(1.0e18), 1.1e18, 18, err); + + emit log("\n## assertGe(uint,uint)\n"); + assertGe(uint(0), 1); + emit log("\n"); + assertGe(uint(0), 1, err); + + emit log("\n## assertGe(int,int)\n"); + assertGe(-1, 0); + emit log("\n"); + assertGe(-1, 0, err); + + emit log("\n## assertGeDecimal(int,int,uint)\n"); + assertGeDecimal(-2.0e18, -1.1e18, 18); + emit log("\n"); + assertGeDecimal(-2.0e18, -1.1e18, 18, err); + + emit log("\n## assertGeDecimal(uint,uint,uint)\n"); + assertGeDecimal(uint(1.0e18), 1.1e18, 18); + emit log("\n"); + assertGeDecimal(uint(1.0e18), 1.1e18, 18, err); + + emit log("\n## assertLt(uint,uint)\n"); + assertLt(uint(0), 0); + emit log("\n"); + assertLt(uint(0), 0, err); + + emit log("\n## assertLt(int,int)\n"); + assertLt(-1, -1); + emit log("\n"); + assertLt(-1, -1, err); + + emit log("\n## assertLtDecimal(int,int,uint)\n"); + assertLtDecimal(-1.0e18, -1.1e18, 18); + emit log("\n"); + assertLtDecimal(-1.0e18, -1.1e18, 18, err); + + emit log("\n## assertLtDecimal(uint,uint,uint)\n"); + assertLtDecimal(uint(2.0e18), 1.1e18, 18); + emit log("\n"); + assertLtDecimal(uint(2.0e18), 1.1e18, 18, err); + + emit log("\n## assertLe(uint,uint)\n"); + assertLe(uint(1), 0); + emit log("\n"); + assertLe(uint(1), 0, err); + + emit log("\n## assertLe(int,int)\n"); + assertLe(0, -1); + emit log("\n"); + assertLe(0, -1, err); + + emit log("\n## assertLeDecimal(int,int,uint)\n"); + assertLeDecimal(-1.0e18, -1.1e18, 18); + emit log("\n"); + assertLeDecimal(-1.0e18, -1.1e18, 18, err); + + emit log("\n## assertLeDecimal(uint,uint,uint)\n"); + assertLeDecimal(uint(2.0e18), 1.1e18, 18); + emit log("\n"); + assertLeDecimal(uint(2.0e18), 1.1e18, 18, err); + + emit log("\n## assertEq(string,string)\n"); + string memory s1 = "string 1"; + string memory s2 = "string 2"; + assertEq(s1, s2); + emit log("\n"); + assertEq(s1, s2, err); + + emit log("\n## assertEq0(bytes,bytes)\n"); + assertEq0(hex"abcdef01", hex"abcdef02"); + log("\n"); + assertEq0(hex"abcdef01", hex"abcdef02", err); + } +} + +contract DemoTestWithSetUp { + function setUp() public { + } + function test_pass() public pure { + } +} diff --git a/container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/src/test.sol b/container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/src/test.sol new file mode 100644 index 00000000..96d3c154 --- /dev/null +++ b/container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/src/test.sol @@ -0,0 +1,434 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +pragma solidity >=0.4.23; + +contract DSTest { + event log (string); + event logs (bytes); + + event log_address (address); + event log_bytes32 (bytes32); + event log_int (int); + event log_uint (uint); + event log_bytes (bytes); + event log_string (string); + + event log_named_address (string key, address val); + event log_named_bytes32 (string key, bytes32 val); + event log_named_decimal_int (string key, int val, uint decimals); + event log_named_decimal_uint (string key, uint val, uint decimals); + event log_named_int (string key, int val); + event log_named_uint (string key, uint val); + event log_named_bytes (string key, bytes val); + event log_named_string (string key, string val); + + bool public IS_TEST = true; + bool public failed; + + address constant HEVM_ADDRESS = + address(bytes20(uint160(uint256(keccak256('hevm cheat code'))))); + + modifier mayRevert() { _; } + modifier testopts(string memory) { _; } + + function fail() internal { + failed = true; + } + + modifier logs_gas() { + uint startGas = gasleft(); + _; + uint endGas = gasleft(); + emit log_named_uint("gas", startGas - endGas); + } + + function assertTrue(bool condition) internal { + if (!condition) { + emit log("Error: Assertion Failed"); + fail(); + } + } + + function assertTrue(bool condition, string memory err) internal { + if (!condition) { + emit log_named_string("Error", err); + assertTrue(condition); + } + } + + function assertEq(address a, address b) internal { + if (a != b) { + emit log("Error: a == b not satisfied [address]"); + emit log_named_address(" Expected", b); + emit log_named_address(" Actual", a); + fail(); + } + } + function assertEq(address a, address b, string memory err) internal { + if (a != b) { + emit log_named_string ("Error", err); + assertEq(a, b); + } + } + + function assertEq(bytes32 a, bytes32 b) internal { + if (a != b) { + emit log("Error: a == b not satisfied [bytes32]"); + emit log_named_bytes32(" Expected", b); + emit log_named_bytes32(" Actual", a); + fail(); + } + } + function assertEq(bytes32 a, bytes32 b, string memory err) internal { + if (a != b) { + emit log_named_string ("Error", err); + assertEq(a, b); + } + } + function assertEq32(bytes32 a, bytes32 b) internal { + assertEq(a, b); + } + function assertEq32(bytes32 a, bytes32 b, string memory err) internal { + assertEq(a, b, err); + } + + function assertEq(int a, int b) internal { + if (a != b) { + emit log("Error: a == b not satisfied [int]"); + emit log_named_int(" Expected", b); + emit log_named_int(" Actual", a); + fail(); + } + } + function assertEq(int a, int b, string memory err) internal { + if (a != b) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + function assertEq(uint a, uint b) internal { + if (a != b) { + emit log("Error: a == b not satisfied [uint]"); + emit log_named_uint(" Expected", b); + emit log_named_uint(" Actual", a); + fail(); + } + } + function assertEq(uint a, uint b, string memory err) internal { + if (a != b) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + function assertEqDecimal(int a, int b, uint decimals) internal { + if (a != b) { + emit log("Error: a == b not satisfied [decimal int]"); + emit log_named_decimal_int(" Expected", b, decimals); + emit log_named_decimal_int(" Actual", a, decimals); + fail(); + } + } + function assertEqDecimal(int a, int b, uint decimals, string memory err) internal { + if (a != b) { + emit log_named_string("Error", err); + assertEqDecimal(a, b, decimals); + } + } + function assertEqDecimal(uint a, uint b, uint decimals) internal { + if (a != b) { + emit log("Error: a == b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Expected", b, decimals); + emit log_named_decimal_uint(" Actual", a, decimals); + fail(); + } + } + function assertEqDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a != b) { + emit log_named_string("Error", err); + assertEqDecimal(a, b, decimals); + } + } + + function assertGt(uint a, uint b) internal { + if (a <= b) { + emit log("Error: a > b not satisfied [uint]"); + emit log_named_uint(" Value a", a); + emit log_named_uint(" Value b", b); + fail(); + } + } + function assertGt(uint a, uint b, string memory err) internal { + if (a <= b) { + emit log_named_string("Error", err); + assertGt(a, b); + } + } + function assertGt(int a, int b) internal { + if (a <= b) { + emit log("Error: a > b not satisfied [int]"); + emit log_named_int(" Value a", a); + emit log_named_int(" Value b", b); + fail(); + } + } + function assertGt(int a, int b, string memory err) internal { + if (a <= b) { + emit log_named_string("Error", err); + assertGt(a, b); + } + } + function assertGtDecimal(int a, int b, uint decimals) internal { + if (a <= b) { + emit log("Error: a > b not satisfied [decimal int]"); + emit log_named_decimal_int(" Value a", a, decimals); + emit log_named_decimal_int(" Value b", b, decimals); + fail(); + } + } + function assertGtDecimal(int a, int b, uint decimals, string memory err) internal { + if (a <= b) { + emit log_named_string("Error", err); + assertGtDecimal(a, b, decimals); + } + } + function assertGtDecimal(uint a, uint b, uint decimals) internal { + if (a <= b) { + emit log("Error: a > b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Value a", a, decimals); + emit log_named_decimal_uint(" Value b", b, decimals); + fail(); + } + } + function assertGtDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a <= b) { + emit log_named_string("Error", err); + assertGtDecimal(a, b, decimals); + } + } + + function assertGe(uint a, uint b) internal { + if (a < b) { + emit log("Error: a >= b not satisfied [uint]"); + emit log_named_uint(" Value a", a); + emit log_named_uint(" Value b", b); + fail(); + } + } + function assertGe(uint a, uint b, string memory err) internal { + if (a < b) { + emit log_named_string("Error", err); + assertGe(a, b); + } + } + function assertGe(int a, int b) internal { + if (a < b) { + emit log("Error: a >= b not satisfied [int]"); + emit log_named_int(" Value a", a); + emit log_named_int(" Value b", b); + fail(); + } + } + function assertGe(int a, int b, string memory err) internal { + if (a < b) { + emit log_named_string("Error", err); + assertGe(a, b); + } + } + function assertGeDecimal(int a, int b, uint decimals) internal { + if (a < b) { + emit log("Error: a >= b not satisfied [decimal int]"); + emit log_named_decimal_int(" Value a", a, decimals); + emit log_named_decimal_int(" Value b", b, decimals); + fail(); + } + } + function assertGeDecimal(int a, int b, uint decimals, string memory err) internal { + if (a < b) { + emit log_named_string("Error", err); + assertGeDecimal(a, b, decimals); + } + } + function assertGeDecimal(uint a, uint b, uint decimals) internal { + if (a < b) { + emit log("Error: a >= b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Value a", a, decimals); + emit log_named_decimal_uint(" Value b", b, decimals); + fail(); + } + } + function assertGeDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a < b) { + emit log_named_string("Error", err); + assertGeDecimal(a, b, decimals); + } + } + + function assertLt(uint a, uint b) internal { + if (a >= b) { + emit log("Error: a < b not satisfied [uint]"); + emit log_named_uint(" Value a", a); + emit log_named_uint(" Value b", b); + fail(); + } + } + function assertLt(uint a, uint b, string memory err) internal { + if (a >= b) { + emit log_named_string("Error", err); + assertLt(a, b); + } + } + function assertLt(int a, int b) internal { + if (a >= b) { + emit log("Error: a < b not satisfied [int]"); + emit log_named_int(" Value a", a); + emit log_named_int(" Value b", b); + fail(); + } + } + function assertLt(int a, int b, string memory err) internal { + if (a >= b) { + emit log_named_string("Error", err); + assertLt(a, b); + } + } + function assertLtDecimal(int a, int b, uint decimals) internal { + if (a >= b) { + emit log("Error: a < b not satisfied [decimal int]"); + emit log_named_decimal_int(" Value a", a, decimals); + emit log_named_decimal_int(" Value b", b, decimals); + fail(); + } + } + function assertLtDecimal(int a, int b, uint decimals, string memory err) internal { + if (a >= b) { + emit log_named_string("Error", err); + assertLtDecimal(a, b, decimals); + } + } + function assertLtDecimal(uint a, uint b, uint decimals) internal { + if (a >= b) { + emit log("Error: a < b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Value a", a, decimals); + emit log_named_decimal_uint(" Value b", b, decimals); + fail(); + } + } + function assertLtDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a >= b) { + emit log_named_string("Error", err); + assertLtDecimal(a, b, decimals); + } + } + + function assertLe(uint a, uint b) internal { + if (a > b) { + emit log("Error: a <= b not satisfied [uint]"); + emit log_named_uint(" Value a", a); + emit log_named_uint(" Value b", b); + fail(); + } + } + function assertLe(uint a, uint b, string memory err) internal { + if (a > b) { + emit log_named_string("Error", err); + assertLe(a, b); + } + } + function assertLe(int a, int b) internal { + if (a > b) { + emit log("Error: a <= b not satisfied [int]"); + emit log_named_int(" Value a", a); + emit log_named_int(" Value b", b); + fail(); + } + } + function assertLe(int a, int b, string memory err) internal { + if (a > b) { + emit log_named_string("Error", err); + assertLe(a, b); + } + } + function assertLeDecimal(int a, int b, uint decimals) internal { + if (a > b) { + emit log("Error: a <= b not satisfied [decimal int]"); + emit log_named_decimal_int(" Value a", a, decimals); + emit log_named_decimal_int(" Value b", b, decimals); + fail(); + } + } + function assertLeDecimal(int a, int b, uint decimals, string memory err) internal { + if (a > b) { + emit log_named_string("Error", err); + assertLeDecimal(a, b, decimals); + } + } + function assertLeDecimal(uint a, uint b, uint decimals) internal { + if (a > b) { + emit log("Error: a <= b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Value a", a, decimals); + emit log_named_decimal_uint(" Value b", b, decimals); + fail(); + } + } + function assertLeDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a > b) { + emit log_named_string("Error", err); + assertGeDecimal(a, b, decimals); + } + } + + function assertEq(string memory a, string memory b) internal { + if (keccak256(abi.encodePacked(a)) != keccak256(abi.encodePacked(b))) { + emit log("Error: a == b not satisfied [string]"); + emit log_named_string(" Value a", a); + emit log_named_string(" Value b", b); + fail(); + } + } + function assertEq(string memory a, string memory b, string memory err) internal { + if (keccak256(abi.encodePacked(a)) != keccak256(abi.encodePacked(b))) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + + function checkEq0(bytes memory a, bytes memory b) internal pure returns (bool ok) { + ok = true; + if (a.length == b.length) { + for (uint i = 0; i < a.length; i++) { + if (a[i] != b[i]) { + ok = false; + } + } + } else { + ok = false; + } + } + function assertEq0(bytes memory a, bytes memory b) internal { + if (!checkEq0(a, b)) { + emit log("Error: a == b not satisfied [bytes]"); + emit log_named_bytes(" Expected", a); + emit log_named_bytes(" Actual", b); + fail(); + } + } + function assertEq0(bytes memory a, bytes memory b, string memory err) internal { + if (!checkEq0(a, b)) { + emit log_named_string("Error", err); + assertEq0(a, b); + } + } +} diff --git a/container-build/vulcanize-go-ethereum-foundry/stateful/src/Stateful.sol b/container-build/vulcanize-go-ethereum-foundry/stateful/src/Stateful.sol new file mode 100644 index 00000000..137f9a5a --- /dev/null +++ b/container-build/vulcanize-go-ethereum-foundry/stateful/src/Stateful.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.10; + +contract Stateful { + uint x; + + constructor(uint y) public { + x = y; + } + + function off() public { + require(x == 1); + x = 0; + } + + function on() public { + require(x == 0); + x = 1; + } + function inc() public { + x = x + 1; + } +} \ No newline at end of file diff --git a/container-build/vulcanize-go-ethereum-foundry/stateful/src/test/Stateful.t.sol b/container-build/vulcanize-go-ethereum-foundry/stateful/src/test/Stateful.t.sol new file mode 100644 index 00000000..fb2e97e6 --- /dev/null +++ b/container-build/vulcanize-go-ethereum-foundry/stateful/src/test/Stateful.t.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.10; + +import "ds-test/test.sol"; +import {Stateful} from "../Stateful.sol"; + +contract StatefulTest is DSTest { + Stateful contractA; + //contractA A; + uint x; + function setUp() public { + x = 1; + contractA = new Stateful(x); + } + + function testExample() public { + contractA.off(); + } +} diff --git a/container-build/vulcanize-go-ethereum/build.sh b/container-build/vulcanize-go-ethereum/build.sh new file mode 100755 index 00000000..692da966 --- /dev/null +++ b/container-build/vulcanize-go-ethereum/build.sh @@ -0,0 +1,2 @@ +# Build vulcanize/go-ethereum +docker build -t vulcanize/go-ethereum:local ${vulcanize_repo_base_dir}/go-ethereum diff --git a/container-build/vulcanize-ipld-eth-beacon-db/build.sh b/container-build/vulcanize-ipld-eth-beacon-db/build.sh new file mode 100755 index 00000000..06001279 --- /dev/null +++ b/container-build/vulcanize-ipld-eth-beacon-db/build.sh @@ -0,0 +1,21 @@ +# Build vulcanize/ipld-eth-beacon-db +docker build -t vulcanize/ipld-eth-beacon-db:local ${vulcanize_repo_base_dir}/ipld-eth-beacon-db + +#version: "3.2" +#services: +# ipld-eth-beacon-db: +# restart: always +# build: +# context: ${vulcanize_ipld_eth_beacon_db}/ +# environment: +# POSTGRES_USER: vdbm +# POSTGRES_DB: vulcanize_testing +# POSTGRES_PASSWORD: password +# volumes: +# - vdb_db_eth-beacon_db:/var/lib/postgresql/data +# ports: +# - "127.0.0.1:8076:5432" +# command: ["postgres", "-c", "log_statement=all"] +# +#volumes: +# vdb_db_eth-beacon_db: diff --git a/container-build/vulcanize-ipld-eth-beacon-indexer/build.sh b/container-build/vulcanize-ipld-eth-beacon-indexer/build.sh new file mode 100755 index 00000000..e82a55ea --- /dev/null +++ b/container-build/vulcanize-ipld-eth-beacon-indexer/build.sh @@ -0,0 +1,2 @@ +# Build vulcanize/ipld-eth-beacon-indexer +docker build -t vulcanize/ipld-eth-beacon-indexer:local ${vulcanize_repo_base_dir}/ipld-eth-beacon-indexer diff --git a/container-build/vulcanize-ipld-eth-db/build.sh b/container-build/vulcanize-ipld-eth-db/build.sh new file mode 100755 index 00000000..83ad34e2 --- /dev/null +++ b/container-build/vulcanize-ipld-eth-db/build.sh @@ -0,0 +1,2 @@ +# Build vulcanize/ipld-eth-db +docker build -t vulcanize/ipld-eth-db:local ${vulcanize_repo_base_dir}/ipld-eth-db diff --git a/container-build/vulcanize-ipld-eth-server/build.sh b/container-build/vulcanize-ipld-eth-server/build.sh new file mode 100755 index 00000000..ca12293f --- /dev/null +++ b/container-build/vulcanize-ipld-eth-server/build.sh @@ -0,0 +1,2 @@ +# Build vulcanize/ipld-eth-server +docker build -t vulcanize/ipld-eth-server:local ${vulcanize_repo_base_dir}/ipld-eth-server diff --git a/container-build/vulcanize-lighthouse/Dockerfile b/container-build/vulcanize-lighthouse/Dockerfile new file mode 100644 index 00000000..9acefb48 --- /dev/null +++ b/container-build/vulcanize-lighthouse/Dockerfile @@ -0,0 +1,8 @@ +FROM sigp/lighthouse:latest-modern + +RUN apt-get update; apt-get install bash netcat curl less jq -y; + +WORKDIR /root/ +ADD start-lighthouse.sh . + +ENTRYPOINT [ "./start-lighthouse.sh" ] diff --git a/container-build/vulcanize-lighthouse/build.sh b/container-build/vulcanize-lighthouse/build.sh new file mode 100755 index 00000000..6ce0de68 --- /dev/null +++ b/container-build/vulcanize-lighthouse/build.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +# Build vulcanize/lighthouse + +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t vulcanize/lighthouse:local ${SCRIPT_DIR} + +#version: "3.2" +#services: +# lighthouse: +# restart: always +# build: +# context: ../../ +# dockerfile: ./docker/latest/lighthouse.Dockerfile +# environment: +# - NETWORK=mainnet +# volumes: +# - lighthouse_db:/root/.lighthouse +# ports: +# - 127.0.0.1:5052:5052 +# - 9000:9000/udp +# - 9000:9000/tcp +# command: ["tail", "-f", "/dev/null"] +# +#volumes: +# lighthouse_db: diff --git a/container-build/vulcanize-lighthouse/start-lighthouse.sh b/container-build/vulcanize-lighthouse/start-lighthouse.sh new file mode 100755 index 00000000..f254ada9 --- /dev/null +++ b/container-build/vulcanize-lighthouse/start-lighthouse.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +# This bash script will be used to start the lighthouse client +# The 0.0.0.0 is not safe. + +lighthouse bn \ + --http --http-address 0.0.0.0 --metrics --private --network $NETWORK & + +tail -f /dev/null diff --git a/container-build/vulcanize-test-contract/build.sh b/container-build/vulcanize-test-contract/build.sh new file mode 100755 index 00000000..6a65e075 --- /dev/null +++ b/container-build/vulcanize-test-contract/build.sh @@ -0,0 +1,17 @@ +# Build vulcanize/test-contract +docker build -t vulcanize/test-contract:local ${vulcanize_repo_base_dir}/ipld-eth-db-validator/test/contract + +#version: "3.2" +#services: +# contract: +# depends_on: +# go-ethereum: +# condition: service_healthy +# build: +# context: ${vulcanize_test_contract} +# args: +# ETH_ADDR: "http://go-ethereum:8545" +# environment: +# ETH_ADDR: "http://go-ethereum:8545" +# ports: +# - "127.0.0.1:3000:3000" \ No newline at end of file From 369ff671d5a3a6b1a4e7905fc16bac9466362e39 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 12 Aug 2022 07:42:46 -0600 Subject: [PATCH 0007/1010] Cleanup --- .../build.sh | 23 ------------------- .../vulcanize-ipld-eth-beacon-db/build.sh | 19 --------------- container-build/vulcanize-lighthouse/build.sh | 20 ---------------- .../vulcanize-test-contract/build.sh | 15 ------------ container-image-list.txt | 1 + pip-stuff.sh | 1 + setup-repositories.py | 4 ++-- 7 files changed, 4 insertions(+), 79 deletions(-) diff --git a/container-build/vulcanize-eth-statediff-fill-service/build.sh b/container-build/vulcanize-eth-statediff-fill-service/build.sh index fb146b43..24e2983f 100755 --- a/container-build/vulcanize-eth-statediff-fill-service/build.sh +++ b/container-build/vulcanize-eth-statediff-fill-service/build.sh @@ -1,25 +1,2 @@ # Build vulcanize/eth-statediff-fill-service docker build -t vulcanize/eth-statediff-fill-service:local ${vulcanize_repo_base_dir}/eth-statediff-fill-service - -#version: "3.2" -#services: -# eth-statediff-fill-service: -# restart: unless-stopped -# depends_on: -# ipld-eth-db: -# condition: service_healthy -# build: -# context: ${vulcanize_eth_statediff_fill_service} -# dockerfile: ./Dockerfile -# environment: -# ETH_SERVER_HTTPPATH: 0.0.0.0:8085 -# VDB_COMMAND: "serve" -# DATABASE_NAME: "vulcanize_testing" -# DATABASE_HOSTNAME: "ipld-eth-db" -# DATABASE_PORT: 5432 -# DATABASE_USER: "vdbm" -# DATABASE_PASSWORD: "password" -# ETH_HTTP_PATH: $eth_http_path -# WATCHED_ADDRESS_GAP_FILLER_INTERVAL: $watched_address_gap_filler_interval -# ports: -# - "127.0.0.1:8085:8085" diff --git a/container-build/vulcanize-ipld-eth-beacon-db/build.sh b/container-build/vulcanize-ipld-eth-beacon-db/build.sh index 06001279..b9656fa6 100755 --- a/container-build/vulcanize-ipld-eth-beacon-db/build.sh +++ b/container-build/vulcanize-ipld-eth-beacon-db/build.sh @@ -1,21 +1,2 @@ # Build vulcanize/ipld-eth-beacon-db docker build -t vulcanize/ipld-eth-beacon-db:local ${vulcanize_repo_base_dir}/ipld-eth-beacon-db - -#version: "3.2" -#services: -# ipld-eth-beacon-db: -# restart: always -# build: -# context: ${vulcanize_ipld_eth_beacon_db}/ -# environment: -# POSTGRES_USER: vdbm -# POSTGRES_DB: vulcanize_testing -# POSTGRES_PASSWORD: password -# volumes: -# - vdb_db_eth-beacon_db:/var/lib/postgresql/data -# ports: -# - "127.0.0.1:8076:5432" -# command: ["postgres", "-c", "log_statement=all"] -# -#volumes: -# vdb_db_eth-beacon_db: diff --git a/container-build/vulcanize-lighthouse/build.sh b/container-build/vulcanize-lighthouse/build.sh index 6ce0de68..c6359367 100755 --- a/container-build/vulcanize-lighthouse/build.sh +++ b/container-build/vulcanize-lighthouse/build.sh @@ -5,23 +5,3 @@ SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) docker build -t vulcanize/lighthouse:local ${SCRIPT_DIR} - -#version: "3.2" -#services: -# lighthouse: -# restart: always -# build: -# context: ../../ -# dockerfile: ./docker/latest/lighthouse.Dockerfile -# environment: -# - NETWORK=mainnet -# volumes: -# - lighthouse_db:/root/.lighthouse -# ports: -# - 127.0.0.1:5052:5052 -# - 9000:9000/udp -# - 9000:9000/tcp -# command: ["tail", "-f", "/dev/null"] -# -#volumes: -# lighthouse_db: diff --git a/container-build/vulcanize-test-contract/build.sh b/container-build/vulcanize-test-contract/build.sh index 6a65e075..9b1be250 100755 --- a/container-build/vulcanize-test-contract/build.sh +++ b/container-build/vulcanize-test-contract/build.sh @@ -1,17 +1,2 @@ # Build vulcanize/test-contract docker build -t vulcanize/test-contract:local ${vulcanize_repo_base_dir}/ipld-eth-db-validator/test/contract - -#version: "3.2" -#services: -# contract: -# depends_on: -# go-ethereum: -# condition: service_healthy -# build: -# context: ${vulcanize_test_contract} -# args: -# ETH_ADDR: "http://go-ethereum:8545" -# environment: -# ETH_ADDR: "http://go-ethereum:8545" -# ports: -# - "127.0.0.1:3000:3000" \ No newline at end of file diff --git a/container-image-list.txt b/container-image-list.txt index 4822748f..205e6d98 100644 --- a/container-image-list.txt +++ b/container-image-list.txt @@ -1,6 +1,7 @@ vulcanize/test-contract vulcanize/eth-statediff-fill-service vulcanize/go-ethereum +vulcanize/go-ethereum-foundry vulcanize/lighthouse vulcanize/ipld-eth-db vulcanize/eth-statediff-fill-service diff --git a/pip-stuff.sh b/pip-stuff.sh index e9b301cc..b801f7c2 100644 --- a/pip-stuff.sh +++ b/pip-stuff.sh @@ -2,3 +2,4 @@ pip install testcontainers python -m pip install --upgrade pip pip install python-decouple pip install gitpython +pip install tqdm diff --git a/setup-repositories.py b/setup-repositories.py index b94f88b4..fdab73c4 100644 --- a/setup-repositories.py +++ b/setup-repositories.py @@ -1,5 +1,5 @@ # env vars: -# DEV_ROOT defaults to ~/vulcanize +# VULCANIZE_REPO_BASE_DIR defaults to ~/vulcanize import os import sys @@ -28,7 +28,7 @@ def is_git_repo(path): parser = argparse.ArgumentParser( description="git clone the set of repositories required to build the complete system from source", - epilog="Config provided either in .env or settings.ini or env vars: DEV_ROOT (defaults to ~/vulcanize)" + epilog="Config provided either in .env or settings.ini or env vars: VULCANIZE_REPO_BASE_DIR (defaults to ~/vulcanize)" ) parser.add_argument("--verbose", action="store_true", help="increase output verbosity") parser.add_argument("--quiet", action="store_true", help="don\'t print informational output") From a42970a9a2e1b5860f6d2172295cb9ffcc1a996d Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 12 Aug 2022 07:47:45 -0600 Subject: [PATCH 0008/1010] Fix case --- container-build/vulcanize-eth-statediff-fill-service/build.sh | 2 +- container-build/vulcanize-go-ethereum/build.sh | 2 +- container-build/vulcanize-ipld-eth-beacon-db/build.sh | 2 +- container-build/vulcanize-ipld-eth-beacon-indexer/build.sh | 2 +- container-build/vulcanize-ipld-eth-db/build.sh | 2 +- container-build/vulcanize-ipld-eth-server/build.sh | 2 +- container-build/vulcanize-test-contract/build.sh | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/container-build/vulcanize-eth-statediff-fill-service/build.sh b/container-build/vulcanize-eth-statediff-fill-service/build.sh index 24e2983f..33dd19b2 100755 --- a/container-build/vulcanize-eth-statediff-fill-service/build.sh +++ b/container-build/vulcanize-eth-statediff-fill-service/build.sh @@ -1,2 +1,2 @@ # Build vulcanize/eth-statediff-fill-service -docker build -t vulcanize/eth-statediff-fill-service:local ${vulcanize_repo_base_dir}/eth-statediff-fill-service +docker build -t vulcanize/eth-statediff-fill-service:local ${VULCANIZE_REPO_BASE_DIR}/eth-statediff-fill-service diff --git a/container-build/vulcanize-go-ethereum/build.sh b/container-build/vulcanize-go-ethereum/build.sh index 692da966..fd79af14 100755 --- a/container-build/vulcanize-go-ethereum/build.sh +++ b/container-build/vulcanize-go-ethereum/build.sh @@ -1,2 +1,2 @@ # Build vulcanize/go-ethereum -docker build -t vulcanize/go-ethereum:local ${vulcanize_repo_base_dir}/go-ethereum +docker build -t vulcanize/go-ethereum:local ${VULCANIZE_REPO_BASE_DIR}/go-ethereum diff --git a/container-build/vulcanize-ipld-eth-beacon-db/build.sh b/container-build/vulcanize-ipld-eth-beacon-db/build.sh index b9656fa6..888c3662 100755 --- a/container-build/vulcanize-ipld-eth-beacon-db/build.sh +++ b/container-build/vulcanize-ipld-eth-beacon-db/build.sh @@ -1,2 +1,2 @@ # Build vulcanize/ipld-eth-beacon-db -docker build -t vulcanize/ipld-eth-beacon-db:local ${vulcanize_repo_base_dir}/ipld-eth-beacon-db +docker build -t vulcanize/ipld-eth-beacon-db:local ${VULCANIZE_REPO_BASE_DIR}/ipld-eth-beacon-db diff --git a/container-build/vulcanize-ipld-eth-beacon-indexer/build.sh b/container-build/vulcanize-ipld-eth-beacon-indexer/build.sh index e82a55ea..c9586f94 100755 --- a/container-build/vulcanize-ipld-eth-beacon-indexer/build.sh +++ b/container-build/vulcanize-ipld-eth-beacon-indexer/build.sh @@ -1,2 +1,2 @@ # Build vulcanize/ipld-eth-beacon-indexer -docker build -t vulcanize/ipld-eth-beacon-indexer:local ${vulcanize_repo_base_dir}/ipld-eth-beacon-indexer +docker build -t vulcanize/ipld-eth-beacon-indexer:local ${VULCANIZE_REPO_BASE_DIR}/ipld-eth-beacon-indexer diff --git a/container-build/vulcanize-ipld-eth-db/build.sh b/container-build/vulcanize-ipld-eth-db/build.sh index 83ad34e2..3647243d 100755 --- a/container-build/vulcanize-ipld-eth-db/build.sh +++ b/container-build/vulcanize-ipld-eth-db/build.sh @@ -1,2 +1,2 @@ # Build vulcanize/ipld-eth-db -docker build -t vulcanize/ipld-eth-db:local ${vulcanize_repo_base_dir}/ipld-eth-db +docker build -t vulcanize/ipld-eth-db:local ${VULCANIZE_REPO_BASE_DIR}/ipld-eth-db diff --git a/container-build/vulcanize-ipld-eth-server/build.sh b/container-build/vulcanize-ipld-eth-server/build.sh index ca12293f..722294bc 100755 --- a/container-build/vulcanize-ipld-eth-server/build.sh +++ b/container-build/vulcanize-ipld-eth-server/build.sh @@ -1,2 +1,2 @@ # Build vulcanize/ipld-eth-server -docker build -t vulcanize/ipld-eth-server:local ${vulcanize_repo_base_dir}/ipld-eth-server +docker build -t vulcanize/ipld-eth-server:local ${VULCANIZE_REPO_BASE_DIR}/ipld-eth-server diff --git a/container-build/vulcanize-test-contract/build.sh b/container-build/vulcanize-test-contract/build.sh index 9b1be250..78f5f966 100755 --- a/container-build/vulcanize-test-contract/build.sh +++ b/container-build/vulcanize-test-contract/build.sh @@ -1,2 +1,2 @@ # Build vulcanize/test-contract -docker build -t vulcanize/test-contract:local ${vulcanize_repo_base_dir}/ipld-eth-db-validator/test/contract +docker build -t vulcanize/test-contract:local ${VULCANIZE_REPO_BASE_DIR}/ipld-eth-db-validator/test/contract From d99f548af82126f96a3a673add431f98969e0025 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 12 Aug 2022 07:48:41 -0600 Subject: [PATCH 0009/1010] Cleanup --- setup-repositories.py | 1 - 1 file changed, 1 deletion(-) diff --git a/setup-repositories.py b/setup-repositories.py index fdab73c4..eaff6102 100644 --- a/setup-repositories.py +++ b/setup-repositories.py @@ -4,7 +4,6 @@ import os import sys import argparse -from pydoc import ispackage from decouple import config import git from tqdm import tqdm From fd03a8ebb7eb485478fcbdf26850e17d76d33872 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 12 Aug 2022 08:53:35 -0600 Subject: [PATCH 0010/1010] Cleanup --- setup-repositories.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/setup-repositories.py b/setup-repositories.py index eaff6102..d75c24f6 100644 --- a/setup-repositories.py +++ b/setup-repositories.py @@ -50,15 +50,13 @@ if not os.path.isdir(dev_root_path): print(f'Dev root directory doesn\'t exist, creating') os.makedirs(dev_root_path) -with open("repository-list.txt") as repositoryListFile: - repos = repositoryListFile.read().splitlines() +with open("repository-list.txt") as repository_list_file: + repos = repository_list_file.read().splitlines() if verbose: print (f'Repos: {repos}') -# Ok, now we can go ahead and look to see which if any of the repos are already cloned - -def processRepo(repo): +def process_repo(repo): full_github_repo_path = f'git@github.com:{repo}' repoName = repo.split("/")[-1] full_filesystem_repo_path = os.path.join(dev_root_path, repoName) @@ -83,4 +81,4 @@ def processRepo(repo): for repo in repos: - processRepo(repo) + process_repo(repo) From b02bbe22e16f58db8ad1dfdca15a3b2dfc0798ed Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 12 Aug 2022 08:54:09 -0600 Subject: [PATCH 0011/1010] Add build script --- build-containers.py | 61 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 build-containers.py diff --git a/build-containers.py b/build-containers.py new file mode 100644 index 00000000..ec3a31a5 --- /dev/null +++ b/build-containers.py @@ -0,0 +1,61 @@ +# Builds or pulls containers for the system components + +# env vars: +# VULCANIZE_REPO_BASE_DIR defaults to ~/vulcanize + +# TODO: display the available list of containers; allow re-build of either all or specific containers + +import os +import sys +import argparse +from decouple import config +import subprocess + +parser = argparse.ArgumentParser( + description="build the set of containers required for a complete stack", + epilog="Config provided either in .env or settings.ini or env vars: VULCANIZE_REPO_BASE_DIR (defaults to ~/vulcanize)" + ) +parser.add_argument("--verbose", action="store_true", help="increase output verbosity") +parser.add_argument("--quiet", action="store_true", help="don\'t print informational output") +parser.add_argument("--check-only", action="store_true", help="looks at what\'s already there and checks if it looks good") +parser.add_argument("--dry-run", action="store_true", help="don\'t do anything, just print the commands that would be executed") + +args = parser.parse_args() +print(args) + +verbose = args.verbose +quiet = args.quiet + +dev_root_path = os.path.expanduser(config("VULCANIZE_REPO_BASE_DIR", default="~/vulcanize")) + +if not args.quiet: + print(f'Dev Root is: {dev_root_path}') + +if not os.path.isdir(dev_root_path): + print(f'Dev root directory doesn\'t exist, creating') + +with open("container-image-list.txt") as container_list_file: + containers = container_list_file.read().splitlines() + +if verbose: + print(f'Containers: {containers}') + +def process_container(container): + if not quiet: + print(f"Building: {container}") + build_script_filename = os.path.join("container-build",container.replace("/","-"),"build.sh") + if verbose: + print(f"Script: {build_script_filename}") + if not os.path.exists(build_script_filename): + print(f"Error, script: {build_script_filename} doesn't exist") + sys.exit(1) + if not args.dry_run: + # We need to export VULCANIZE_REPO_BASE_DIR + build_result = subprocess.run(build_script_filename, shell=True, env={'VULCANIZE_REPO_BASE_DIR':dev_root_path}) + print(f"Result is: {build_result}") + +for container in containers: + process_container(container) + + + From 1ca7b0813a1511993921fd3c40c8d8eaf311bcce Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 12 Aug 2022 08:59:45 -0600 Subject: [PATCH 0012/1010] Fix dup --- container-image-list.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/container-image-list.txt b/container-image-list.txt index 205e6d98..3ec51dd5 100644 --- a/container-image-list.txt +++ b/container-image-list.txt @@ -4,7 +4,6 @@ vulcanize/go-ethereum vulcanize/go-ethereum-foundry vulcanize/lighthouse vulcanize/ipld-eth-db -vulcanize/eth-statediff-fill-service vulcanize/ipld-eth-beacon_db vulcanize/ipld-eth-beacon-indexer vulcanize/ipld-eth-server From 4cf689c642b6ae9518b89cd4c311f1f82ba5841a Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 12 Aug 2022 09:16:40 -0600 Subject: [PATCH 0013/1010] Fix typo --- container-image-list.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/container-image-list.txt b/container-image-list.txt index 3ec51dd5..20e75a5f 100644 --- a/container-image-list.txt +++ b/container-image-list.txt @@ -4,6 +4,6 @@ vulcanize/go-ethereum vulcanize/go-ethereum-foundry vulcanize/lighthouse vulcanize/ipld-eth-db -vulcanize/ipld-eth-beacon_db +vulcanize/ipld-eth-beacon-db vulcanize/ipld-eth-beacon-indexer vulcanize/ipld-eth-server From 29fe818b12dcba535e31bbd0ad9dae54ffdc0b6b Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 12 Aug 2022 11:27:41 -0600 Subject: [PATCH 0014/1010] Initial deploy script --- build-containers.py | 1 + pip-stuff.sh | 1 + 2 files changed, 2 insertions(+) diff --git a/build-containers.py b/build-containers.py index ec3a31a5..388a68a3 100644 --- a/build-containers.py +++ b/build-containers.py @@ -52,6 +52,7 @@ def process_container(container): if not args.dry_run: # We need to export VULCANIZE_REPO_BASE_DIR build_result = subprocess.run(build_script_filename, shell=True, env={'VULCANIZE_REPO_BASE_DIR':dev_root_path}) + # TODO: check result in build_result.returncode print(f"Result is: {build_result}") for container in containers: diff --git a/pip-stuff.sh b/pip-stuff.sh index b801f7c2..4d500afc 100644 --- a/pip-stuff.sh +++ b/pip-stuff.sh @@ -3,3 +3,4 @@ python -m pip install --upgrade pip pip install python-decouple pip install gitpython pip install tqdm +pip install python-on-whales From ba5433a0680a6883f8ef66aa5d4c5f2845ec23ac Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 12 Aug 2022 11:32:40 -0600 Subject: [PATCH 0015/1010] Old versions of compose files --- compose/docker-compose-contract.yml | 0 compose/docker-compose-db-sharding.yml | 32 +++++++++++++++++ compose/docker-compose-db.yml | 0 ...ker-compose-eth-statediff-fill-service.yml | 22 ++++++++++++ compose/docker-compose-go-ethereum.yml | 34 +++++++++++++++++++ compose/docker-compose-ipld-eth-beacon-db.yml | 17 ++++++++++ ...docker-compose-ipld-eth-beacon-indexer.yml | 14 ++++++++ compose/docker-compose-ipld-eth-server.yml | 0 compose/docker-compose-lighthouse.yml | 0 compose/docker-compose-prometheus-grafana.yml | 21 ++++++++++++ 10 files changed, 140 insertions(+) create mode 100644 compose/docker-compose-contract.yml create mode 100644 compose/docker-compose-db-sharding.yml create mode 100644 compose/docker-compose-db.yml create mode 100644 compose/docker-compose-eth-statediff-fill-service.yml create mode 100644 compose/docker-compose-go-ethereum.yml create mode 100644 compose/docker-compose-ipld-eth-beacon-db.yml create mode 100644 compose/docker-compose-ipld-eth-beacon-indexer.yml create mode 100644 compose/docker-compose-ipld-eth-server.yml create mode 100644 compose/docker-compose-lighthouse.yml create mode 100644 compose/docker-compose-prometheus-grafana.yml diff --git a/compose/docker-compose-contract.yml b/compose/docker-compose-contract.yml new file mode 100644 index 00000000..e69de29b diff --git a/compose/docker-compose-db-sharding.yml b/compose/docker-compose-db-sharding.yml new file mode 100644 index 00000000..c0a267e1 --- /dev/null +++ b/compose/docker-compose-db-sharding.yml @@ -0,0 +1,32 @@ +version: "3.2" + +services: + migrations: + restart: on-failure + depends_on: + ipld-eth-db: + condition: service_healthy + image: vulcanize/ipld-eth-db:v4.1.4-alpha + environment: + DATABASE_USER: "vdbm" + DATABASE_NAME: "vulcanize_testing" + DATABASE_PASSWORD: "password" + DATABASE_HOSTNAME: "ipld-eth-db" + DATABASE_PORT: 5432 + + ipld-eth-db: + image: timescale/timescaledb:latest-pg14 + restart: always + command: ["postgres", "-c", "log_statement=all"] + environment: + POSTGRES_USER: "vdbm" + POSTGRES_DB: "vulcanize_testing" + POSTGRES_PASSWORD: "password" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "5432"] + interval: 30s + timeout: 10s + retries: 10 + start_period: 3s + ports: + - "127.0.0.1:8077:5432" diff --git a/compose/docker-compose-db.yml b/compose/docker-compose-db.yml new file mode 100644 index 00000000..e69de29b diff --git a/compose/docker-compose-eth-statediff-fill-service.yml b/compose/docker-compose-eth-statediff-fill-service.yml new file mode 100644 index 00000000..1d9f9cd1 --- /dev/null +++ b/compose/docker-compose-eth-statediff-fill-service.yml @@ -0,0 +1,22 @@ +version: "3.2" +services: + eth-statediff-fill-service: + restart: unless-stopped + depends_on: + ipld-eth-db: + condition: service_healthy + build: + context: ${vulcanize_eth_statediff_fill_service} + dockerfile: ./Dockerfile + environment: + ETH_SERVER_HTTPPATH: 0.0.0.0:8085 + VDB_COMMAND: "serve" + DATABASE_NAME: "vulcanize_testing" + DATABASE_HOSTNAME: "ipld-eth-db" + DATABASE_PORT: 5432 + DATABASE_USER: "vdbm" + DATABASE_PASSWORD: "password" + ETH_HTTP_PATH: $eth_http_path + WATCHED_ADDRESS_GAP_FILLER_INTERVAL: $watched_address_gap_filler_interval + ports: + - "127.0.0.1:8085:8085" diff --git a/compose/docker-compose-go-ethereum.yml b/compose/docker-compose-go-ethereum.yml new file mode 100644 index 00000000..d29f78cb --- /dev/null +++ b/compose/docker-compose-go-ethereum.yml @@ -0,0 +1,34 @@ +version: "3.2" + +services: + go-ethereum: + restart: unless-stopped + depends_on: + ipld-eth-db: + condition: service_healthy + build: + context: ../../ + dockerfile: ./docker/local/go-ethereum.Dockerfile + args: + GENESIS_FILE_PATH: ${genesis_file_path} + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "8545"] + interval: 30s + timeout: 3s + retries: 10 + environment: + DB_USER: vdbm + DB_NAME: vulcanize_testing + DB_HOST: ipld-eth-db + DB_PORT: 5432 + DB_PASSWORD: password + DB_WRITE: ${db_write} + DB_TYPE: postgres + DB_DRIVER: sqlx + DB_WAIT_FOR_SYNC: "true" + CHAIN_ID: "99" + USE_GENESIS: "true" + EXTRA_START_ARGS: ${extra_args} + ports: + - "127.0.0.1:8545:8545" + - "127.0.0.1:8546:8546" diff --git a/compose/docker-compose-ipld-eth-beacon-db.yml b/compose/docker-compose-ipld-eth-beacon-db.yml new file mode 100644 index 00000000..9bb38003 --- /dev/null +++ b/compose/docker-compose-ipld-eth-beacon-db.yml @@ -0,0 +1,17 @@ +version: "3.2" +services: + ipld-eth-beacon-db: + restart: always + image: vulcanize/ipld-eth-beacon-db:v0.2.0 + environment: + POSTGRES_USER: vdbm + POSTGRES_DB: vulcanize_testing + POSTGRES_PASSWORD: password + volumes: + - vdb_db_eth-beacon_db:/var/lib/postgresql/data + ports: + - "127.0.0.1:8076:5432" + command: ["postgres", "-c", "log_statement=all"] + +volumes: + vdb_db_eth-beacon_db: diff --git a/compose/docker-compose-ipld-eth-beacon-indexer.yml b/compose/docker-compose-ipld-eth-beacon-indexer.yml new file mode 100644 index 00000000..0ca3f287 --- /dev/null +++ b/compose/docker-compose-ipld-eth-beacon-indexer.yml @@ -0,0 +1,14 @@ +version: "3.2" +services: + ipld-eth-beacon-indexer: + restart: unless-stopped + depends_on: + - ipld-eth-beacon-db + - lighthouse + image: vulcanize/ipld-eth-beacon-indexer:v0.2.0 + volumes: + - type: bind + source: ${eth_beacon_config_file} + target: /root/ipld-eth-beacon-config.json + environment: + CAPTURE_MODE: ${eth_beacon_capture_mode} diff --git a/compose/docker-compose-ipld-eth-server.yml b/compose/docker-compose-ipld-eth-server.yml new file mode 100644 index 00000000..e69de29b diff --git a/compose/docker-compose-lighthouse.yml b/compose/docker-compose-lighthouse.yml new file mode 100644 index 00000000..e69de29b diff --git a/compose/docker-compose-prometheus-grafana.yml b/compose/docker-compose-prometheus-grafana.yml new file mode 100644 index 00000000..82042108 --- /dev/null +++ b/compose/docker-compose-prometheus-grafana.yml @@ -0,0 +1,21 @@ +version: "3.2" +services: + # If you want prometheus to work, you must update the following file in the ops repo locally. + # localhost:6060 --> go-ethereum:6060 + prometheus: + restart: always + user: "987" + image: prom/prometheus + volumes: + - ${vulcanize_ops}/metrics/etc:/etc/prometheus + - ./prometheus-data:/prometheus + ports: + - "127.0.0.1:9090:9090" + grafana: + restart: always + user: "472" + image: grafana/grafana + volumes: + - ./grafana-data:/var/lib/grafana + ports: + - "127.0.0.1:3000:3000" From cd03078af77abdf21107de20f1f0cec884bacd71 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sat, 13 Aug 2022 22:02:10 -0600 Subject: [PATCH 0016/1010] Initial version of deploy script --- deploy-system.py | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 deploy-system.py diff --git a/deploy-system.py b/deploy-system.py new file mode 100644 index 00000000..17337bdd --- /dev/null +++ b/deploy-system.py @@ -0,0 +1,41 @@ +# Deploys the system components using docker-compose + +import os +import argparse +from decouple import config +from python_on_whales import DockerClient + +parser = argparse.ArgumentParser( + description="deploy the complete stack" + ) +parser.add_argument("--verbose", action="store_true", help="increase output verbosity") +parser.add_argument("--quiet", action="store_true", help="don\'t print informational output") +parser.add_argument("--check-only", action="store_true", help="looks at what\'s already there and checks if it looks good") +parser.add_argument("--dry-run", action="store_true", help="don\'t do anything, just print the commands that would be executed") + +args = parser.parse_args() +print(args) + +verbose = args.verbose +quiet = args.quiet + +with open("cluster-list.txt") as cluster_list_file: + clusters = cluster_list_file.read().splitlines() + +if verbose: + print(f'Cluster components: {clusters}') + +# Construct a docker compose command suitable for our purpose + +compose_files = [] +for cluster in clusters: + compose_file_name = os.path.join("compose", f"docker-compose-{cluster}.yml") + compose_files.append(compose_file_name) + +print(f"files: {compose_files}") + +# See: https://gabrieldemarmiesse.github.io/python-on-whales/sub-commands/compose/ +docker = DockerClient(compose_files=compose_files) + +docker.compose.up() + From 12022236504d57aa66e5e7469d1697aae88f6bc9 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sat, 13 Aug 2022 22:30:12 -0600 Subject: [PATCH 0017/1010] More compose file updates --- compose/docker-compose-contract.yml | 11 +++++ compose/docker-compose-db-sharding.yml | 2 +- compose/docker-compose-db.yml | 17 +++++++ ...ker-compose-eth-statediff-fill-service.yml | 4 +- compose/docker-compose-ipld-eth-server.yml | 49 +++++++++++++++++++ .../vulcanize-go-ethereum-foundry/build.sh | 2 +- .../vulcanize-test-contract/build.sh | 2 +- 7 files changed, 81 insertions(+), 6 deletions(-) diff --git a/compose/docker-compose-contract.yml b/compose/docker-compose-contract.yml index e69de29b..9a65cd01 100644 --- a/compose/docker-compose-contract.yml +++ b/compose/docker-compose-contract.yml @@ -0,0 +1,11 @@ +version: "3.2" +services: + contract: + depends_on: + go-ethereum: + condition: service_healthy + image: vulcanize/test-contract:local + environment: + ETH_ADDR: "http://go-ethereum:8545" + ports: + - "127.0.0.1:3000:3000" diff --git a/compose/docker-compose-db-sharding.yml b/compose/docker-compose-db-sharding.yml index c0a267e1..169584a9 100644 --- a/compose/docker-compose-db-sharding.yml +++ b/compose/docker-compose-db-sharding.yml @@ -6,7 +6,7 @@ services: depends_on: ipld-eth-db: condition: service_healthy - image: vulcanize/ipld-eth-db:v4.1.4-alpha + image: vulcanize/ipld-eth-db:local environment: DATABASE_USER: "vdbm" DATABASE_NAME: "vulcanize_testing" diff --git a/compose/docker-compose-db.yml b/compose/docker-compose-db.yml index e69de29b..582ef1f1 100644 --- a/compose/docker-compose-db.yml +++ b/compose/docker-compose-db.yml @@ -0,0 +1,17 @@ +version: "3.2" +services: + ipld-eth-db: + restart: always + image: vulcanize/ipld-eth-db:local + environment: + POSTGRES_USER: "vdbm" + POSTGRES_DB: "vulcanize_testing" + POSTGRES_PASSWORD: "password" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "5432"] + interval: 5s + timeout: 3s + retries: 5 + ports: + - "127.0.0.1:8077:5432" + command: ["postgres", "-c", "log_statement=all"] \ No newline at end of file diff --git a/compose/docker-compose-eth-statediff-fill-service.yml b/compose/docker-compose-eth-statediff-fill-service.yml index 1d9f9cd1..d59de1e5 100644 --- a/compose/docker-compose-eth-statediff-fill-service.yml +++ b/compose/docker-compose-eth-statediff-fill-service.yml @@ -5,9 +5,7 @@ services: depends_on: ipld-eth-db: condition: service_healthy - build: - context: ${vulcanize_eth_statediff_fill_service} - dockerfile: ./Dockerfile + image: vulcanize/eth-statediff-fill-service:local environment: ETH_SERVER_HTTPPATH: 0.0.0.0:8085 VDB_COMMAND: "serve" diff --git a/compose/docker-compose-ipld-eth-server.yml b/compose/docker-compose-ipld-eth-server.yml index e69de29b..39b2d23f 100644 --- a/compose/docker-compose-ipld-eth-server.yml +++ b/compose/docker-compose-ipld-eth-server.yml @@ -0,0 +1,49 @@ +ersion: "3.2" +services: + ipld-eth-server: + restart: unless-stopped + depends_on: + ipld-eth-db: + condition: service_healthy + image: vulcanize/ipld-eth-server:v4.0.5-alpha + environment: + IPLD_SERVER_GRAPHQL: "true" + IPLD_POSTGRAPHILEPATH: http://graphql:5000 + ETH_SERVER_HTTPPATH: 0.0.0.0:8081 + ETH_SERVER_GRAPHQL: "true" + ETH_SERVER_GRAPHQLPATH: 0.0.0.0:8082 + VDB_COMMAND: "serve" + ETH_CHAIN_CONFIG: "/tmp/chain.json" + DATABASE_NAME: vulcanize_testing + DATABASE_HOSTNAME: ipld-eth-db + DATABASE_PORT: 5432 + DATABASE_USER: "vdbm" + DATABASE_PASSWORD: "password" + ETH_CHAIN_ID: 99 + ETH_FORWARD_ETH_CALLS: $eth_forward_eth_calls + ETH_PROXY_ON_ERROR: $eth_proxy_on_error + ETH_HTTP_PATH: $eth_http_path + volumes: + - type: bind + source: ../../start-up-files/ipld-eth-server/chain.json + target: /tmp/chain.json + ports: + - "127.0.0.1:8081:8081" + - "127.0.0.1:8082:8082" + + graphql: + restart: unless-stopped + depends_on: + ipld-eth-db: + condition: service_healthy + image: vulcanize/postgraphile:v1.0.1 + environment: + PG_HOST: ipld-eth-db + PG_PORT: 5432 + PG_DATABASE: vulcanize_testing + PG_USER: vdbm + PG_PASSWORD: password + SCHEMA: public,eth + ports: + - "127.0.0.1:5000:5000" + \ No newline at end of file diff --git a/container-build/vulcanize-go-ethereum-foundry/build.sh b/container-build/vulcanize-go-ethereum-foundry/build.sh index 43b4bc21..9124a94b 100755 --- a/container-build/vulcanize-go-ethereum-foundry/build.sh +++ b/container-build/vulcanize-go-ethereum-foundry/build.sh @@ -4,4 +4,4 @@ # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t vulcanize/go-ethereum-foundry:local ${SCRIPT_DIR} +docker build -t vulcanize/go-ethereum-foundry:local --build-arg GENESIS_FILE_PATH=genesis-automine.json ${SCRIPT_DIR} diff --git a/container-build/vulcanize-test-contract/build.sh b/container-build/vulcanize-test-contract/build.sh index 78f5f966..d1fde373 100755 --- a/container-build/vulcanize-test-contract/build.sh +++ b/container-build/vulcanize-test-contract/build.sh @@ -1,2 +1,2 @@ # Build vulcanize/test-contract -docker build -t vulcanize/test-contract:local ${VULCANIZE_REPO_BASE_DIR}/ipld-eth-db-validator/test/contract +docker build -t vulcanize/test-contract:local --build-arg ETH_ADDR=http://go-ethereum:8545 ${VULCANIZE_REPO_BASE_DIR}/ipld-eth-db-validator/test/contract From 30f06366f9cb5ed691b7dd465020c0fe14886d14 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sat, 13 Aug 2022 22:31:19 -0600 Subject: [PATCH 0018/1010] Compose file for foundry geth container --- ...ose-go-ethereum.yml => docker-compose-go-ethereum-foundry.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename compose/{docker-compose-go-ethereum.yml => docker-compose-go-ethereum-foundry.yml} (100%) diff --git a/compose/docker-compose-go-ethereum.yml b/compose/docker-compose-go-ethereum-foundry.yml similarity index 100% rename from compose/docker-compose-go-ethereum.yml rename to compose/docker-compose-go-ethereum-foundry.yml From c53595cbfef7ee8dad05021c4c0a2a4217bb4180 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sat, 13 Aug 2022 22:42:15 -0600 Subject: [PATCH 0019/1010] Fixes --- build-containers.py | 1 - cluster-list.txt | 2 +- compose/docker-compose-go-ethereum-foundry.yml | 6 +----- compose/docker-compose-ipld-eth-beacon-db.yml | 2 +- .../docker-compose-ipld-eth-beacon-indexer.yml | 2 +- compose/docker-compose-ipld-eth-server.yml | 3 +-- compose/docker-compose-lighthouse.yml | 17 +++++++++++++++++ deploy-system.py | 8 ++++++-- setup-repositories.py | 1 - 9 files changed, 28 insertions(+), 14 deletions(-) diff --git a/build-containers.py b/build-containers.py index 388a68a3..3b8e398f 100644 --- a/build-containers.py +++ b/build-containers.py @@ -21,7 +21,6 @@ parser.add_argument("--check-only", action="store_true", help="looks at what\'s parser.add_argument("--dry-run", action="store_true", help="don\'t do anything, just print the commands that would be executed") args = parser.parse_args() -print(args) verbose = args.verbose quiet = args.quiet diff --git a/cluster-list.txt b/cluster-list.txt index d99e9f24..a7823065 100644 --- a/cluster-list.txt +++ b/cluster-list.txt @@ -2,7 +2,7 @@ contract db-sharding db eth-statediff-fill-service -go-ethereum +go-ethereum-foundry ipld-eth-beacon-db ipld-eth-beacon-indexer ipld-eth-server diff --git a/compose/docker-compose-go-ethereum-foundry.yml b/compose/docker-compose-go-ethereum-foundry.yml index d29f78cb..234f94b7 100644 --- a/compose/docker-compose-go-ethereum-foundry.yml +++ b/compose/docker-compose-go-ethereum-foundry.yml @@ -6,11 +6,7 @@ services: depends_on: ipld-eth-db: condition: service_healthy - build: - context: ../../ - dockerfile: ./docker/local/go-ethereum.Dockerfile - args: - GENESIS_FILE_PATH: ${genesis_file_path} + image: vulcanize/go-ethereum-foundry healthcheck: test: ["CMD", "nc", "-v", "localhost", "8545"] interval: 30s diff --git a/compose/docker-compose-ipld-eth-beacon-db.yml b/compose/docker-compose-ipld-eth-beacon-db.yml index 9bb38003..58e936a0 100644 --- a/compose/docker-compose-ipld-eth-beacon-db.yml +++ b/compose/docker-compose-ipld-eth-beacon-db.yml @@ -2,7 +2,7 @@ version: "3.2" services: ipld-eth-beacon-db: restart: always - image: vulcanize/ipld-eth-beacon-db:v0.2.0 + image: vulcanize/ipld-eth-beacon-db:local environment: POSTGRES_USER: vdbm POSTGRES_DB: vulcanize_testing diff --git a/compose/docker-compose-ipld-eth-beacon-indexer.yml b/compose/docker-compose-ipld-eth-beacon-indexer.yml index 0ca3f287..52d133dd 100644 --- a/compose/docker-compose-ipld-eth-beacon-indexer.yml +++ b/compose/docker-compose-ipld-eth-beacon-indexer.yml @@ -5,7 +5,7 @@ services: depends_on: - ipld-eth-beacon-db - lighthouse - image: vulcanize/ipld-eth-beacon-indexer:v0.2.0 + image: vulcanize/ipld-eth-beacon-indexer:local volumes: - type: bind source: ${eth_beacon_config_file} diff --git a/compose/docker-compose-ipld-eth-server.yml b/compose/docker-compose-ipld-eth-server.yml index 39b2d23f..c22a634b 100644 --- a/compose/docker-compose-ipld-eth-server.yml +++ b/compose/docker-compose-ipld-eth-server.yml @@ -5,7 +5,7 @@ services: depends_on: ipld-eth-db: condition: service_healthy - image: vulcanize/ipld-eth-server:v4.0.5-alpha + image: vulcanize/ipld-eth-server:local environment: IPLD_SERVER_GRAPHQL: "true" IPLD_POSTGRAPHILEPATH: http://graphql:5000 @@ -46,4 +46,3 @@ services: SCHEMA: public,eth ports: - "127.0.0.1:5000:5000" - \ No newline at end of file diff --git a/compose/docker-compose-lighthouse.yml b/compose/docker-compose-lighthouse.yml index e69de29b..887b398e 100644 --- a/compose/docker-compose-lighthouse.yml +++ b/compose/docker-compose-lighthouse.yml @@ -0,0 +1,17 @@ +version: "3.2" +services: + lighthouse: + restart: always + image: vulcanize/lighthouse:local + environment: + - NETWORK=mainnet + volumes: + - lighthouse_db:/root/.lighthouse + ports: + - 127.0.0.1:5052:5052 + - 9000:9000/udp + - 9000:9000/tcp + command: ["tail", "-f", "/dev/null"] + +volumes: + lighthouse_db: \ No newline at end of file diff --git a/deploy-system.py b/deploy-system.py index 17337bdd..354c80fe 100644 --- a/deploy-system.py +++ b/deploy-system.py @@ -12,13 +12,16 @@ parser.add_argument("--verbose", action="store_true", help="increase output verb parser.add_argument("--quiet", action="store_true", help="don\'t print informational output") parser.add_argument("--check-only", action="store_true", help="looks at what\'s already there and checks if it looks good") parser.add_argument("--dry-run", action="store_true", help="don\'t do anything, just print the commands that would be executed") +parser.add_argument("--exclude", type=str, help="don\'t start these components") +parser.add_argument("--include", type=str, help="only start these components") args = parser.parse_args() -print(args) verbose = args.verbose quiet = args.quiet +print(args) + with open("cluster-list.txt") as cluster_list_file: clusters = cluster_list_file.read().splitlines() @@ -37,5 +40,6 @@ print(f"files: {compose_files}") # See: https://gabrieldemarmiesse.github.io/python-on-whales/sub-commands/compose/ docker = DockerClient(compose_files=compose_files) -docker.compose.up() +if not args.dry_run: + docker.compose.up() diff --git a/setup-repositories.py b/setup-repositories.py index d75c24f6..129569d3 100644 --- a/setup-repositories.py +++ b/setup-repositories.py @@ -35,7 +35,6 @@ parser.add_argument("--check-only", action="store_true", help="looks at what\'s parser.add_argument("--dry-run", action="store_true", help="don\'t do anything, just print the commands that would be executed") args = parser.parse_args() -print(args) verbose = args.verbose quiet = args.quiet From 155c443167a2f39941475408b32ea63b8838d6a7 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sat, 13 Aug 2022 22:58:13 -0600 Subject: [PATCH 0020/1010] Add include and exclude --- deploy-system.py | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/deploy-system.py b/deploy-system.py index 354c80fe..86e56e8a 100644 --- a/deploy-system.py +++ b/deploy-system.py @@ -5,6 +5,16 @@ import argparse from decouple import config from python_on_whales import DockerClient +def include_exclude_check(s, args): + if args.include == None and args.exclude == None: + return True + if args.include != None: + include_list = args.include.split(",") + return s in include_list + if args.exclude != None: + exclude_list = args.exclude.split(",") + return s not in exclude_list + parser = argparse.ArgumentParser( description="deploy the complete stack" ) @@ -12,8 +22,9 @@ parser.add_argument("--verbose", action="store_true", help="increase output verb parser.add_argument("--quiet", action="store_true", help="don\'t print informational output") parser.add_argument("--check-only", action="store_true", help="looks at what\'s already there and checks if it looks good") parser.add_argument("--dry-run", action="store_true", help="don\'t do anything, just print the commands that would be executed") -parser.add_argument("--exclude", type=str, help="don\'t start these components") -parser.add_argument("--include", type=str, help="only start these components") +group = parser.add_mutually_exclusive_group() +group.add_argument("--exclude", type=str, help="don\'t start these components") +group.add_argument("--include", type=str, help="only start these components") args = parser.parse_args() @@ -32,10 +43,15 @@ if verbose: compose_files = [] for cluster in clusters: - compose_file_name = os.path.join("compose", f"docker-compose-{cluster}.yml") - compose_files.append(compose_file_name) + if include_exclude_check(cluster, args): + compose_file_name = os.path.join("compose", f"docker-compose-{cluster}.yml") + compose_files.append(compose_file_name) + else: + if not quiet: + print(f"Excluding: {cluster}") -print(f"files: {compose_files}") +if verbose: + print(f"files: {compose_files}") # See: https://gabrieldemarmiesse.github.io/python-on-whales/sub-commands/compose/ docker = DockerClient(compose_files=compose_files) From c0db45c963a09cc6ca3ad8d1ba747a602c2b59aa Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sat, 13 Aug 2022 23:06:55 -0600 Subject: [PATCH 0021/1010] Add command --- deploy-system.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/deploy-system.py b/deploy-system.py index 86e56e8a..f0faf287 100644 --- a/deploy-system.py +++ b/deploy-system.py @@ -18,6 +18,7 @@ def include_exclude_check(s, args): parser = argparse.ArgumentParser( description="deploy the complete stack" ) +parser.add_argument("command", type=str, nargs=1, choices=['up', 'down', 'ps'], help="command: up|down|ps") parser.add_argument("--verbose", action="store_true", help="increase output verbosity") parser.add_argument("--quiet", action="store_true", help="don\'t print informational output") parser.add_argument("--check-only", action="store_true", help="looks at what\'s already there and checks if it looks good") @@ -56,6 +57,9 @@ if verbose: # See: https://gabrieldemarmiesse.github.io/python-on-whales/sub-commands/compose/ docker = DockerClient(compose_files=compose_files) +command = args.command if not args.dry_run: - docker.compose.up() - + if command == "up": + docker.compose.up() + elif command == "down": + docker.compose.down() From fdf22b07dada82470af0e3177f9c2fbc3d743258 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sat, 13 Aug 2022 23:23:16 -0600 Subject: [PATCH 0022/1010] Fix compose file --- compose/docker-compose-go-ethereum-foundry.yml | 2 +- deploy-system.py | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/compose/docker-compose-go-ethereum-foundry.yml b/compose/docker-compose-go-ethereum-foundry.yml index 234f94b7..ece58a94 100644 --- a/compose/docker-compose-go-ethereum-foundry.yml +++ b/compose/docker-compose-go-ethereum-foundry.yml @@ -6,7 +6,7 @@ services: depends_on: ipld-eth-db: condition: service_healthy - image: vulcanize/go-ethereum-foundry + image: vulcanize/go-ethereum-foundry:local healthcheck: test: ["CMD", "nc", "-v", "localhost", "8545"] interval: 30s diff --git a/deploy-system.py b/deploy-system.py index f0faf287..55f6b9d2 100644 --- a/deploy-system.py +++ b/deploy-system.py @@ -57,9 +57,13 @@ if verbose: # See: https://gabrieldemarmiesse.github.io/python-on-whales/sub-commands/compose/ docker = DockerClient(compose_files=compose_files) -command = args.command +command = args.command[0] if not args.dry_run: if command == "up": + if verbose: + print("Running compose up") docker.compose.up() elif command == "down": + if verbose: + print("Running compose down") docker.compose.down() From 655e02f17c757dd89c368f279089fb3049c2f71d Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 14 Aug 2022 21:38:01 -0600 Subject: [PATCH 0023/1010] Remove db component --- cluster-list.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/cluster-list.txt b/cluster-list.txt index a7823065..fb08f0a7 100644 --- a/cluster-list.txt +++ b/cluster-list.txt @@ -1,6 +1,5 @@ contract db-sharding -db eth-statediff-fill-service go-ethereum-foundry ipld-eth-beacon-db From 77fa8c94188df433ad37784614c93b16cd0a0e67 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 14 Aug 2022 21:38:16 -0600 Subject: [PATCH 0024/1010] Add comments on db component --- compose/docker-compose-db.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/compose/docker-compose-db.yml b/compose/docker-compose-db.yml index 582ef1f1..d164297b 100644 --- a/compose/docker-compose-db.yml +++ b/compose/docker-compose-db.yml @@ -1,3 +1,6 @@ +# TODO: figure out if this is needed -- it doesn't seem to make sense in the context of the +# current version of vulcanize/ipld-eth-db/Dockerfile, which is only the migrations code, not the DB itself +# The sibling component docker-compose-db-sharding.yml looks more plausible version: "3.2" services: ipld-eth-db: From 570f93493033b1347f7ffc50be3c167bc5e37ff9 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 15 Aug 2022 06:14:42 -0600 Subject: [PATCH 0025/1010] Detatch on start --- deploy-system.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy-system.py b/deploy-system.py index 55f6b9d2..c7995d95 100644 --- a/deploy-system.py +++ b/deploy-system.py @@ -62,7 +62,7 @@ if not args.dry_run: if command == "up": if verbose: print("Running compose up") - docker.compose.up() + docker.compose.up(detach=True) elif command == "down": if verbose: print("Running compose down") From fcb995ac235862d6825c9d81bd21c24a164a1e0b Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 15 Aug 2022 06:22:47 -0600 Subject: [PATCH 0026/1010] Fix typo --- compose/docker-compose-ipld-eth-server.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compose/docker-compose-ipld-eth-server.yml b/compose/docker-compose-ipld-eth-server.yml index c22a634b..0d3963dd 100644 --- a/compose/docker-compose-ipld-eth-server.yml +++ b/compose/docker-compose-ipld-eth-server.yml @@ -1,4 +1,4 @@ -ersion: "3.2" +version: "3.2" services: ipld-eth-server: restart: unless-stopped From 390a347fd55f50b4c7c2fc70a0098de741ed6e48 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 21 Aug 2022 17:25:55 -0600 Subject: [PATCH 0027/1010] Add config file --- compose/docker-compose-ipld-eth-server.yml | 2 +- config/ipld-eth-server/chain.json | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 config/ipld-eth-server/chain.json diff --git a/compose/docker-compose-ipld-eth-server.yml b/compose/docker-compose-ipld-eth-server.yml index 0d3963dd..88e6e46f 100644 --- a/compose/docker-compose-ipld-eth-server.yml +++ b/compose/docker-compose-ipld-eth-server.yml @@ -25,7 +25,7 @@ services: ETH_HTTP_PATH: $eth_http_path volumes: - type: bind - source: ../../start-up-files/ipld-eth-server/chain.json + source: ../config/ipld-eth-server/chain.json target: /tmp/chain.json ports: - "127.0.0.1:8081:8081" diff --git a/config/ipld-eth-server/chain.json b/config/ipld-eth-server/chain.json new file mode 100644 index 00000000..60f17432 --- /dev/null +++ b/config/ipld-eth-server/chain.json @@ -0,0 +1,15 @@ +{ + "chainId": 99, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "clique": { + "period": 0, + "epoch": 3000 + } +} From 4dec5c0ae2e268e68ec2b098c67ce553c0abf594 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 21 Aug 2022 20:26:55 -0600 Subject: [PATCH 0028/1010] Fix geth container startup --- README.md | 6 +++++- compose/docker-compose-go-ethereum-foundry.yml | 4 ++-- testcontainers-compose-test.py | 8 -------- 3 files changed, 7 insertions(+), 11 deletions(-) delete mode 100644 testcontainers-compose-test.py diff --git a/README.md b/README.md index d63717cc..506bb9ef 100644 --- a/README.md +++ b/README.md @@ -1 +1,5 @@ -# orchestrator-play \ No newline at end of file +# orchestrator-play + +``` +$ python deploy-system.py --verbose --include db-sharding,contract,ipld-eth-server,go-ethereum-foundry up +``` \ No newline at end of file diff --git a/compose/docker-compose-go-ethereum-foundry.yml b/compose/docker-compose-go-ethereum-foundry.yml index ece58a94..1145a2d3 100644 --- a/compose/docker-compose-go-ethereum-foundry.yml +++ b/compose/docker-compose-go-ethereum-foundry.yml @@ -18,13 +18,13 @@ services: DB_HOST: ipld-eth-db DB_PORT: 5432 DB_PASSWORD: password - DB_WRITE: ${db_write} + DB_WRITE: true DB_TYPE: postgres DB_DRIVER: sqlx DB_WAIT_FOR_SYNC: "true" CHAIN_ID: "99" USE_GENESIS: "true" - EXTRA_START_ARGS: ${extra_args} + EXTRA_START_ARGS: "--metrics --metrics.expensive --metrics.addr 0.0.0.0 --metrics.port 6060" ports: - "127.0.0.1:8545:8545" - "127.0.0.1:8546:8546" diff --git a/testcontainers-compose-test.py b/testcontainers-compose-test.py deleted file mode 100644 index e098cbe5..00000000 --- a/testcontainers-compose-test.py +++ /dev/null @@ -1,8 +0,0 @@ -from testcontainers.compose import DockerCompose -from testcontainers.core.docker_client import DockerClient -from testcontainers.core.exceptions import NoSuchPortExposed -from testcontainers.core.waiting_utils import wait_for_logs - -with DockerCompose(filepath=".", compose_file_name="docker-compose-test.yaml") as compose: - port = compose.get_service_port("db", 5432) - print(port) From a14b803ff7c3a504aac09d2759099ad5c2949a4e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 21 Aug 2022 20:43:02 -0600 Subject: [PATCH 0029/1010] Add git pull --- setup-repositories.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/setup-repositories.py b/setup-repositories.py index 129569d3..5b2c90d0 100644 --- a/setup-repositories.py +++ b/setup-repositories.py @@ -8,7 +8,7 @@ from decouple import config import git from tqdm import tqdm -class CloneProgress(git.RemoteProgress): +class GitProgress(git.RemoteProgress): def __init__(self): super().__init__() self.pbar = tqdm(unit = 'B', ascii = True, unit_scale = True) @@ -33,6 +33,7 @@ parser.add_argument("--verbose", action="store_true", help="increase output verb parser.add_argument("--quiet", action="store_true", help="don\'t print informational output") parser.add_argument("--check-only", action="store_true", help="looks at what\'s already there and checks if it looks good") parser.add_argument("--dry-run", action="store_true", help="don\'t do anything, just print the commands that would be executed") +parser.add_argument("--pull", action="store_true", help="pull from remote in already existing repositories") args = parser.parse_args() @@ -67,14 +68,24 @@ def process_repo(repo): if is_present: if not is_git_repo(full_filesystem_repo_path): print(f'Error: {full_filesystem_repo_path} does not contain a valid git repository') - sys.exit(1) + sys.exit(1) + else: + if args.pull: + if verbose: + print(f'Running git pull for {full_filesystem_repo_path}') + if not args.check_only: + repo = git.Repo(full_filesystem_repo_path) + origin = repo.remotes.origin + origin.pull(progress = None if quiet else GitProgress()) + else: + print("(git pull skipped)") if not is_present: # Clone if verbose: print(f'Running git clone for {full_github_repo_path} into {full_filesystem_repo_path}') if not args.check_only: git.Repo.clone_from(full_github_repo_path, full_filesystem_repo_path, - progress = None if quiet else CloneProgress()) + progress = None if quiet else GitProgress()) else: print("(git clone skipped)") From cebdb455592b6cc80d96b9656e6303a95b33bc7b Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 23 Aug 2022 11:32:55 -0600 Subject: [PATCH 0030/1010] Initial version of pip packaging --- LICENSE | 661 ++++++++++++++++++ MANIFEST.in | 1 + app/__init__.py | 0 app/__main__.py | 0 .../build-containers.py | 0 deploy-system.py => app/deploy-system.py | 0 app/setup-repositories.py | 94 +++ orchestrator.py | 15 + requirements.txt | 4 + setup.py | 29 + 10 files changed, 804 insertions(+) create mode 100644 LICENSE create mode 100644 MANIFEST.in create mode 100644 app/__init__.py create mode 100644 app/__main__.py rename build-containers.py => app/build-containers.py (100%) rename deploy-system.py => app/deploy-system.py (100%) create mode 100644 app/setup-repositories.py create mode 100644 orchestrator.py create mode 100644 requirements.txt create mode 100644 setup.py diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..bd018522 --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for + software and other kinds of works, specifically designed to ensure + cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed + to take away your freedom to share and change the works. By contrast, + our General Public Licenses are intended to guarantee your freedom to + share and change all versions of a program--to make sure it remains free + software for all its users. + + When we speak of free software, we are referring to freedom, not + price. Our General Public Licenses are designed to make sure that you + have the freedom to distribute copies of free software (and charge for + them if you wish), that you receive source code or can get it if you + want it, that you can change the software or use pieces of it in new + free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights + with two steps: (1) assert copyright on the software, and (2) offer + you this License which gives you legal permission to copy, distribute + and/or modify the software. + + A secondary benefit of defending all users' freedom is that + improvements made in alternate versions of the program, if they + receive widespread use, become available for other developers to + incorporate. Many developers of free software are heartened and + encouraged by the resulting cooperation. However, in the case of + software used on network servers, this result may fail to come about. + The GNU General Public License permits making a modified version and + letting the public access it on a server without ever releasing its + source code to the public. + + The GNU Affero General Public License is designed specifically to + ensure that, in such cases, the modified source code becomes available + to the community. It requires the operator of a network server to + provide the source code of the modified version running there to the + users of that server. Therefore, public use of a modified version, on + a publicly accessible server, gives the public access to the source + code of the modified version. + + An older license, called the Affero General Public License and + published by Affero, was designed to accomplish similar goals. This is + a different license, not a version of the Affero GPL, but Affero has + released a new version of the Affero GPL which permits relicensing under + this license. + + The precise terms and conditions for copying, distribution and + modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of + works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this + License. Each licensee is addressed as "you". "Licensees" and + "recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work + in a fashion requiring copyright permission, other than the making of an + exact copy. The resulting work is called a "modified version" of the + earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based + on the Program. + + To "propagate" a work means to do anything with it that, without + permission, would make you directly or secondarily liable for + infringement under applicable copyright law, except executing it on a + computer or modifying a private copy. Propagation includes copying, + distribution (with or without modification), making available to the + public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other + parties to make or receive copies. Mere interaction with a user through + a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" + to the extent that it includes a convenient and prominently visible + feature that (1) displays an appropriate copyright notice, and (2) + tells the user that there is no warranty for the work (except to the + extent that warranties are provided), that licensees may convey the + work under this License, and how to view a copy of this License. If + the interface presents a list of user commands or options, such as a + menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work + for making modifications to it. "Object code" means any non-source + form of a work. + + A "Standard Interface" means an interface that either is an official + standard defined by a recognized standards body, or, in the case of + interfaces specified for a particular programming language, one that + is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other + than the work as a whole, that (a) is included in the normal form of + packaging a Major Component, but which is not part of that Major + Component, and (b) serves only to enable use of the work with that + Major Component, or to implement a Standard Interface for which an + implementation is available to the public in source code form. A + "Major Component", in this context, means a major essential component + (kernel, window system, and so on) of the specific operating system + (if any) on which the executable work runs, or a compiler used to + produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all + the source code needed to generate, install, and (for an executable + work) run the object code and to modify the work, including scripts to + control those activities. However, it does not include the work's + System Libraries, or general-purpose tools or generally available free + programs which are used unmodified in performing those activities but + which are not part of the work. For example, Corresponding Source + includes interface definition files associated with source files for + the work, and the source code for shared libraries and dynamically + linked subprograms that the work is specifically designed to require, + such as by intimate data communication or control flow between those + subprograms and other parts of the work. + + The Corresponding Source need not include anything that users + can regenerate automatically from other parts of the Corresponding + Source. + + The Corresponding Source for a work in source code form is that + same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of + copyright on the Program, and are irrevocable provided the stated + conditions are met. This License explicitly affirms your unlimited + permission to run the unmodified Program. The output from running a + covered work is covered by this License only if the output, given its + content, constitutes a covered work. This License acknowledges your + rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not + convey, without conditions so long as your license otherwise remains + in force. You may convey covered works to others for the sole purpose + of having them make modifications exclusively for you, or provide you + with facilities for running those works, provided that you comply with + the terms of this License in conveying all material for which you do + not control copyright. Those thus making or running the covered works + for you must do so exclusively on your behalf, under your direction + and control, on terms that prohibit them from making any copies of + your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under + the conditions stated below. Sublicensing is not allowed; section 10 + makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological + measure under any applicable law fulfilling obligations under article + 11 of the WIPO copyright treaty adopted on 20 December 1996, or + similar laws prohibiting or restricting circumvention of such + measures. + + When you convey a covered work, you waive any legal power to forbid + circumvention of technological measures to the extent such circumvention + is effected by exercising rights under this License with respect to + the covered work, and you disclaim any intention to limit operation or + modification of the work as a means of enforcing, against the work's + users, your or third parties' legal rights to forbid circumvention of + technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you + receive it, in any medium, provided that you conspicuously and + appropriately publish on each copy an appropriate copyright notice; + keep intact all notices stating that this License and any + non-permissive terms added in accord with section 7 apply to the code; + keep intact all notices of the absence of any warranty; and give all + recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, + and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to + produce it from the Program, in the form of source code under the + terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent + works, which are not by their nature extensions of the covered work, + and which are not combined with it such as to form a larger program, + in or on a volume of a storage or distribution medium, is called an + "aggregate" if the compilation and its resulting copyright are not + used to limit the access or legal rights of the compilation's users + beyond what the individual works permit. Inclusion of a covered work + in an aggregate does not cause this License to apply to the other + parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms + of sections 4 and 5, provided that you also convey the + machine-readable Corresponding Source under the terms of this License, + in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded + from the Corresponding Source as a System Library, need not be + included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any + tangible personal property which is normally used for personal, family, + or household purposes, or (2) anything designed or sold for incorporation + into a dwelling. In determining whether a product is a consumer product, + doubtful cases shall be resolved in favor of coverage. For a particular + product received by a particular user, "normally used" refers to a + typical or common use of that class of product, regardless of the status + of the particular user or of the way in which the particular user + actually uses, or expects or is expected to use, the product. A product + is a consumer product regardless of whether the product has substantial + commercial, industrial or non-consumer uses, unless such uses represent + the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, + procedures, authorization keys, or other information required to install + and execute modified versions of a covered work in that User Product from + a modified version of its Corresponding Source. The information must + suffice to ensure that the continued functioning of the modified object + code is in no case prevented or interfered with solely because + modification has been made. + + If you convey an object code work under this section in, or with, or + specifically for use in, a User Product, and the conveying occurs as + part of a transaction in which the right of possession and use of the + User Product is transferred to the recipient in perpetuity or for a + fixed term (regardless of how the transaction is characterized), the + Corresponding Source conveyed under this section must be accompanied + by the Installation Information. But this requirement does not apply + if neither you nor any third party retains the ability to install + modified object code on the User Product (for example, the work has + been installed in ROM). + + The requirement to provide Installation Information does not include a + requirement to continue to provide support service, warranty, or updates + for a work that has been modified or installed by the recipient, or for + the User Product in which it has been modified or installed. Access to a + network may be denied when the modification itself materially and + adversely affects the operation of the network or violates the rules and + protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, + in accord with this section must be in a format that is publicly + documented (and with an implementation available to the public in + source code form), and must require no special password or key for + unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this + License by making exceptions from one or more of its conditions. + Additional permissions that are applicable to the entire Program shall + be treated as though they were included in this License, to the extent + that they are valid under applicable law. If additional permissions + apply only to part of the Program, that part may be used separately + under those permissions, but the entire Program remains governed by + this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option + remove any additional permissions from that copy, or from any part of + it. (Additional permissions may be written to require their own + removal in certain cases when you modify the work.) You may place + additional permissions on material, added by you to a covered work, + for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you + add to a covered work, you may (if authorized by the copyright holders of + that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further + restrictions" within the meaning of section 10. If the Program as you + received it, or any part of it, contains a notice stating that it is + governed by this License along with a term that is a further + restriction, you may remove that term. If a license document contains + a further restriction but permits relicensing or conveying under this + License, you may add to a covered work material governed by the terms + of that license document, provided that the further restriction does + not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you + must place, in the relevant source files, a statement of the + additional terms that apply to those files, or a notice indicating + where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the + form of a separately written license, or stated as exceptions; + the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly + provided under this License. Any attempt otherwise to propagate or + modify it is void, and will automatically terminate your rights under + this License (including any patent licenses granted under the third + paragraph of section 11). + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the copyright + holder fails to notify you of the violation by some reasonable means + prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from that + copyright holder, and you cure the violation prior to 30 days after + your receipt of the notice. + + Termination of your rights under this section does not terminate the + licenses of parties who have received copies or rights from you under + this License. If your rights have been terminated and not permanently + reinstated, you do not qualify to receive new licenses for the same + material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or + run a copy of the Program. Ancillary propagation of a covered work + occurring solely as a consequence of using peer-to-peer transmission + to receive a copy likewise does not require acceptance. However, + nothing other than this License grants you permission to propagate or + modify any covered work. These actions infringe copyright if you do + not accept this License. Therefore, by modifying or propagating a + covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically + receives a license from the original licensors, to run, modify and + propagate that work, subject to this License. You are not responsible + for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an + organization, or substantially all assets of one, or subdividing an + organization, or merging organizations. If propagation of a covered + work results from an entity transaction, each party to that + transaction who receives a copy of the work also receives whatever + licenses to the work the party's predecessor in interest had or could + give under the previous paragraph, plus a right to possession of the + Corresponding Source of the work from the predecessor in interest, if + the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the + rights granted or affirmed under this License. For example, you may + not impose a license fee, royalty, or other charge for exercise of + rights granted under this License, and you may not initiate litigation + (including a cross-claim or counterclaim in a lawsuit) alleging that + any patent claim is infringed by making, using, selling, offering for + sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this + License of the Program or a work on which the Program is based. The + work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims + owned or controlled by the contributor, whether already acquired or + hereafter acquired, that would be infringed by some manner, permitted + by this License, of making, using, or selling its contributor version, + but do not include claims that would be infringed only as a + consequence of further modification of the contributor version. For + purposes of this definition, "control" includes the right to grant + patent sublicenses in a manner consistent with the requirements of + this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free + patent license under the contributor's essential patent claims, to + make, use, sell, offer for sale, import and otherwise run, modify and + propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express + agreement or commitment, however denominated, not to enforce a patent + (such as an express permission to practice a patent or covenant not to + sue for patent infringement). To "grant" such a patent license to a + party means to make such an agreement or commitment not to enforce a + patent against the party. + + If you convey a covered work, knowingly relying on a patent license, + and the Corresponding Source of the work is not available for anyone + to copy, free of charge and under the terms of this License, through a + publicly available network server or other readily accessible means, + then you must either (1) cause the Corresponding Source to be so + available, or (2) arrange to deprive yourself of the benefit of the + patent license for this particular work, or (3) arrange, in a manner + consistent with the requirements of this License, to extend the patent + license to downstream recipients. "Knowingly relying" means you have + actual knowledge that, but for the patent license, your conveying the + covered work in a country, or your recipient's use of the covered work + in a country, would infringe one or more identifiable patents in that + country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or + arrangement, you convey, or propagate by procuring conveyance of, a + covered work, and grant a patent license to some of the parties + receiving the covered work authorizing them to use, propagate, modify + or convey a specific copy of the covered work, then the patent license + you grant is automatically extended to all recipients of the covered + work and works based on it. + + A patent license is "discriminatory" if it does not include within + the scope of its coverage, prohibits the exercise of, or is + conditioned on the non-exercise of one or more of the rights that are + specifically granted under this License. You may not convey a covered + work if you are a party to an arrangement with a third party that is + in the business of distributing software, under which you make payment + to the third party based on the extent of your activity of conveying + the work, and under which the third party grants, to any of the + parties who would receive the covered work from you, a discriminatory + patent license (a) in connection with copies of the covered work + conveyed by you (or copies made from those copies), or (b) primarily + for and in connection with specific products or compilations that + contain the covered work, unless you entered into that arrangement, + or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting + any implied license or other defenses to infringement that may + otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not + excuse you from the conditions of this License. If you cannot convey a + covered work so as to satisfy simultaneously your obligations under this + License and any other pertinent obligations, then as a consequence you may + not convey it at all. For example, if you agree to terms that obligate you + to collect a royalty for further conveying from those to whom you convey + the Program, the only way you could satisfy both those terms and this + License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the + Program, your modified version must prominently offer all users + interacting with it remotely through a computer network (if your version + supports such interaction) an opportunity to receive the Corresponding + Source of your version by providing access to the Corresponding Source + from a network server at no charge, through some standard or customary + means of facilitating copying of software. This Corresponding Source + shall include the Corresponding Source for any work covered by version 3 + of the GNU General Public License that is incorporated pursuant to the + following paragraph. + + Notwithstanding any other provision of this License, you have + permission to link or combine any covered work with a work licensed + under version 3 of the GNU General Public License into a single + combined work, and to convey the resulting work. The terms of this + License will continue to apply to the part which is the covered work, + but the work with which it is combined will remain governed by version + 3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of + the GNU Affero General Public License from time to time. Such new versions + will be similar in spirit to the present version, but may differ in detail to + address new problems or concerns. + + Each version is given a distinguishing version number. If the + Program specifies that a certain numbered version of the GNU Affero General + Public License "or any later version" applies to it, you have the + option of following the terms and conditions either of that numbered + version or of any later version published by the Free Software + Foundation. If the Program does not specify a version number of the + GNU Affero General Public License, you may choose any version ever published + by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future + versions of the GNU Affero General Public License can be used, that proxy's + public statement of acceptance of a version permanently authorizes you + to choose that version for the Program. + + Later license versions may give you additional or different + permissions. However, no additional obligations are imposed on any + author or copyright holder as a result of your choosing to follow a + later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY + APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT + HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY + OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM + IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF + ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS + THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY + GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE + USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF + DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD + PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), + EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF + SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided + above cannot be given local legal effect according to their terms, + reviewing courts shall apply local law that most closely approximates + an absolute waiver of all civil liability in connection with the + Program, unless a warranty or assumption of liability accompanies a + copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest + possible use to the public, the best way to achieve this is to make it + free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest + to attach them to the start of each source file to most effectively + state the exclusion of warranty; and each file should have at least + the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer + network, you should also make sure that it provides a way for users to + get its source. For example, if your program is a web application, its + interface could display a "Source" link that leads users to an archive + of the code. There are many ways you could offer source, and different + solutions will be better for different programs; see section 13 for the + specific requirements. + + You should also get your employer (if you work as a programmer) or school, + if any, to sign a "copyright disclaimer" for the program, if necessary. + For more information on this, and how to apply and follow the GNU AGPL, see + . \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 00000000..1aba38f6 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1 @@ +include LICENSE diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/__main__.py b/app/__main__.py new file mode 100644 index 00000000..e69de29b diff --git a/build-containers.py b/app/build-containers.py similarity index 100% rename from build-containers.py rename to app/build-containers.py diff --git a/deploy-system.py b/app/deploy-system.py similarity index 100% rename from deploy-system.py rename to app/deploy-system.py diff --git a/app/setup-repositories.py b/app/setup-repositories.py new file mode 100644 index 00000000..5b2c90d0 --- /dev/null +++ b/app/setup-repositories.py @@ -0,0 +1,94 @@ +# env vars: +# VULCANIZE_REPO_BASE_DIR defaults to ~/vulcanize + +import os +import sys +import argparse +from decouple import config +import git +from tqdm import tqdm + +class GitProgress(git.RemoteProgress): + def __init__(self): + super().__init__() + self.pbar = tqdm(unit = 'B', ascii = True, unit_scale = True) + + def update(self, op_code, cur_count, max_count=None, message=''): + self.pbar.total = max_count + self.pbar.n = cur_count + self.pbar.refresh() + +def is_git_repo(path): + try: + _ = git.Repo(path).git_dir + return True + except git.exc.InvalidGitRepositoryError: + return False + +parser = argparse.ArgumentParser( + description="git clone the set of repositories required to build the complete system from source", + epilog="Config provided either in .env or settings.ini or env vars: VULCANIZE_REPO_BASE_DIR (defaults to ~/vulcanize)" + ) +parser.add_argument("--verbose", action="store_true", help="increase output verbosity") +parser.add_argument("--quiet", action="store_true", help="don\'t print informational output") +parser.add_argument("--check-only", action="store_true", help="looks at what\'s already there and checks if it looks good") +parser.add_argument("--dry-run", action="store_true", help="don\'t do anything, just print the commands that would be executed") +parser.add_argument("--pull", action="store_true", help="pull from remote in already existing repositories") + +args = parser.parse_args() + +verbose = args.verbose +quiet = args.quiet + +dev_root_path = os.path.expanduser(config("DEV_ROOT", default="~/vulcanize")) + +if not args.quiet: + print(f'Dev Root is: {dev_root_path}') + +if not os.path.isdir(dev_root_path): + if not quiet: + print(f'Dev root directory doesn\'t exist, creating') + os.makedirs(dev_root_path) + +with open("repository-list.txt") as repository_list_file: + repos = repository_list_file.read().splitlines() + +if verbose: + print (f'Repos: {repos}') + +def process_repo(repo): + full_github_repo_path = f'git@github.com:{repo}' + repoName = repo.split("/")[-1] + full_filesystem_repo_path = os.path.join(dev_root_path, repoName) + is_present = os.path.isdir(full_filesystem_repo_path) + if not quiet: + present_text = f'already exists active branch: {git.Repo(full_filesystem_repo_path).active_branch}' if is_present else 'Needs to be fetched' + print(f'Checking: {full_filesystem_repo_path}: {present_text}') + # Quick check that it's actually a repo + if is_present: + if not is_git_repo(full_filesystem_repo_path): + print(f'Error: {full_filesystem_repo_path} does not contain a valid git repository') + sys.exit(1) + else: + if args.pull: + if verbose: + print(f'Running git pull for {full_filesystem_repo_path}') + if not args.check_only: + repo = git.Repo(full_filesystem_repo_path) + origin = repo.remotes.origin + origin.pull(progress = None if quiet else GitProgress()) + else: + print("(git pull skipped)") + if not is_present: + # Clone + if verbose: + print(f'Running git clone for {full_github_repo_path} into {full_filesystem_repo_path}') + if not args.check_only: + git.Repo.clone_from(full_github_repo_path, full_filesystem_repo_path, + progress = None if quiet else GitProgress()) + else: + print("(git clone skipped)") + + +for repo in repos: + process_repo(repo) diff --git a/orchestrator.py b/orchestrator.py new file mode 100644 index 00000000..09e4aa92 --- /dev/null +++ b/orchestrator.py @@ -0,0 +1,15 @@ +# Copyright © 2022 Cerc + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..571719ee --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +python-decouple>=3.6 +GitPython>=3.1.27 +tqdm>=4.64.0 +python-on-whales>=0.52.0 diff --git a/setup.py b/setup.py new file mode 100644 index 00000000..81bf1ba1 --- /dev/null +++ b/setup.py @@ -0,0 +1,29 @@ +# See https://medium.com/nerd-for-tech/how-to-build-and-distribute-a-cli-tool-with-python-537ae41d9d78 +from setuptools import setup, find_packages +with open("README.md", "r", encoding="utf-8") as fh: + long_description = fh.read() +with open("requirements.txt", "r", encoding="utf-8") as fh: + requirements = fh.read() +setup( + name = 'laconic-stack-orchestrator', + version = '0.0.1', + author = 'Cerc', + author_email = 'info@cerc.io', + license = 'GNU Affero General Public License', + description = 'Orchestrates deployment of the Laconic stack', + long_description = long_description, + long_description_content_type = "text/markdown", + url = 'https://github.com/cerc-io/stack-orchestrator', + py_modules = ['orchestrator', 'app'], + packages = find_packages(), + install_requires = [requirements], + python_requires='>=3.7', + classifiers=[ + "Programming Language :: Python :: 3.8", + "Operating System :: OS Independent", + ], + entry_points = ''' + [console_scripts] + laconic-stack-orchestrator=orchestrator:cli + ''' +) From b5df703f6074cf42ed546b9aa753e90126741320 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 23 Aug 2022 15:58:32 -0600 Subject: [PATCH 0031/1010] Add copyright --- app/build-containers.py | 15 +++++++ app/deploy-system.py | 15 +++++++ app/setup-repositories.py | 15 +++++++ pip-stuff.sh | 6 --- setup-repositories.py | 94 --------------------------------------- 5 files changed, 45 insertions(+), 100 deletions(-) delete mode 100644 pip-stuff.sh delete mode 100644 setup-repositories.py diff --git a/app/build-containers.py b/app/build-containers.py index 3b8e398f..fac5e149 100644 --- a/app/build-containers.py +++ b/app/build-containers.py @@ -1,3 +1,18 @@ +# Copyright © 2022 Cerc + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + # Builds or pulls containers for the system components # env vars: diff --git a/app/deploy-system.py b/app/deploy-system.py index c7995d95..a80c7b2f 100644 --- a/app/deploy-system.py +++ b/app/deploy-system.py @@ -1,3 +1,18 @@ +# Copyright © 2022 Cerc + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + # Deploys the system components using docker-compose import os diff --git a/app/setup-repositories.py b/app/setup-repositories.py index 5b2c90d0..9623b4e9 100644 --- a/app/setup-repositories.py +++ b/app/setup-repositories.py @@ -1,3 +1,18 @@ +# Copyright © 2022 Cerc + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + # env vars: # VULCANIZE_REPO_BASE_DIR defaults to ~/vulcanize diff --git a/pip-stuff.sh b/pip-stuff.sh deleted file mode 100644 index 4d500afc..00000000 --- a/pip-stuff.sh +++ /dev/null @@ -1,6 +0,0 @@ -pip install testcontainers -python -m pip install --upgrade pip -pip install python-decouple -pip install gitpython -pip install tqdm -pip install python-on-whales diff --git a/setup-repositories.py b/setup-repositories.py deleted file mode 100644 index 5b2c90d0..00000000 --- a/setup-repositories.py +++ /dev/null @@ -1,94 +0,0 @@ -# env vars: -# VULCANIZE_REPO_BASE_DIR defaults to ~/vulcanize - -import os -import sys -import argparse -from decouple import config -import git -from tqdm import tqdm - -class GitProgress(git.RemoteProgress): - def __init__(self): - super().__init__() - self.pbar = tqdm(unit = 'B', ascii = True, unit_scale = True) - - def update(self, op_code, cur_count, max_count=None, message=''): - self.pbar.total = max_count - self.pbar.n = cur_count - self.pbar.refresh() - -def is_git_repo(path): - try: - _ = git.Repo(path).git_dir - return True - except git.exc.InvalidGitRepositoryError: - return False - -parser = argparse.ArgumentParser( - description="git clone the set of repositories required to build the complete system from source", - epilog="Config provided either in .env or settings.ini or env vars: VULCANIZE_REPO_BASE_DIR (defaults to ~/vulcanize)" - ) -parser.add_argument("--verbose", action="store_true", help="increase output verbosity") -parser.add_argument("--quiet", action="store_true", help="don\'t print informational output") -parser.add_argument("--check-only", action="store_true", help="looks at what\'s already there and checks if it looks good") -parser.add_argument("--dry-run", action="store_true", help="don\'t do anything, just print the commands that would be executed") -parser.add_argument("--pull", action="store_true", help="pull from remote in already existing repositories") - -args = parser.parse_args() - -verbose = args.verbose -quiet = args.quiet - -dev_root_path = os.path.expanduser(config("DEV_ROOT", default="~/vulcanize")) - -if not args.quiet: - print(f'Dev Root is: {dev_root_path}') - -if not os.path.isdir(dev_root_path): - if not quiet: - print(f'Dev root directory doesn\'t exist, creating') - os.makedirs(dev_root_path) - -with open("repository-list.txt") as repository_list_file: - repos = repository_list_file.read().splitlines() - -if verbose: - print (f'Repos: {repos}') - -def process_repo(repo): - full_github_repo_path = f'git@github.com:{repo}' - repoName = repo.split("/")[-1] - full_filesystem_repo_path = os.path.join(dev_root_path, repoName) - is_present = os.path.isdir(full_filesystem_repo_path) - if not quiet: - present_text = f'already exists active branch: {git.Repo(full_filesystem_repo_path).active_branch}' if is_present else 'Needs to be fetched' - print(f'Checking: {full_filesystem_repo_path}: {present_text}') - # Quick check that it's actually a repo - if is_present: - if not is_git_repo(full_filesystem_repo_path): - print(f'Error: {full_filesystem_repo_path} does not contain a valid git repository') - sys.exit(1) - else: - if args.pull: - if verbose: - print(f'Running git pull for {full_filesystem_repo_path}') - if not args.check_only: - repo = git.Repo(full_filesystem_repo_path) - origin = repo.remotes.origin - origin.pull(progress = None if quiet else GitProgress()) - else: - print("(git pull skipped)") - if not is_present: - # Clone - if verbose: - print(f'Running git clone for {full_github_repo_path} into {full_filesystem_repo_path}') - if not args.check_only: - git.Repo.clone_from(full_github_repo_path, full_filesystem_repo_path, - progress = None if quiet else GitProgress()) - else: - print("(git clone skipped)") - - -for repo in repos: - process_repo(repo) From 8aae9b8f8424d18d34df95c108e92655490b30b4 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 23 Aug 2022 16:02:38 -0600 Subject: [PATCH 0032/1010] Rebrand --- app/build-containers.py | 10 +++++----- app/setup-repositories.py | 6 +++--- compose/docker-compose-contract.yml | 2 +- compose/docker-compose-db-sharding.yml | 6 +++--- compose/docker-compose-db.yml | 6 +++--- ...cker-compose-eth-statediff-fill-service.yml | 4 ++-- compose/docker-compose-go-ethereum-foundry.yml | 4 ++-- compose/docker-compose-ipld-eth-beacon-db.yml | 4 ++-- .../docker-compose-ipld-eth-beacon-indexer.yml | 2 +- compose/docker-compose-ipld-eth-server.yml | 8 ++++---- compose/docker-compose-lighthouse.yml | 2 +- compose/docker-compose-prometheus-grafana.yml | 2 +- .../build.sh | 4 ++-- .../vulcanize-go-ethereum-foundry/Dockerfile | 2 +- .../vulcanize-go-ethereum-foundry/build.sh | 4 ++-- .../deploy-local-network.sh | 2 +- container-build/vulcanize-go-ethereum/build.sh | 4 ++-- .../vulcanize-ipld-eth-beacon-db/build.sh | 4 ++-- .../vulcanize-ipld-eth-beacon-indexer/build.sh | 4 ++-- container-build/vulcanize-ipld-eth-db/build.sh | 4 ++-- .../vulcanize-ipld-eth-server/build.sh | 4 ++-- container-build/vulcanize-lighthouse/build.sh | 4 ++-- .../vulcanize-test-contract/build.sh | 4 ++-- container-image-list.txt | 18 +++++++++--------- repository-list.txt | 16 ++++++++-------- 25 files changed, 65 insertions(+), 65 deletions(-) diff --git a/app/build-containers.py b/app/build-containers.py index fac5e149..74f8295f 100644 --- a/app/build-containers.py +++ b/app/build-containers.py @@ -16,7 +16,7 @@ # Builds or pulls containers for the system components # env vars: -# VULCANIZE_REPO_BASE_DIR defaults to ~/vulcanize +# CERC_REPO_BASE_DIR defaults to ~/cerc # TODO: display the available list of containers; allow re-build of either all or specific containers @@ -28,7 +28,7 @@ import subprocess parser = argparse.ArgumentParser( description="build the set of containers required for a complete stack", - epilog="Config provided either in .env or settings.ini or env vars: VULCANIZE_REPO_BASE_DIR (defaults to ~/vulcanize)" + epilog="Config provided either in .env or settings.ini or env vars: CERC_REPO_BASE_DIR (defaults to ~/cerc)" ) parser.add_argument("--verbose", action="store_true", help="increase output verbosity") parser.add_argument("--quiet", action="store_true", help="don\'t print informational output") @@ -40,7 +40,7 @@ args = parser.parse_args() verbose = args.verbose quiet = args.quiet -dev_root_path = os.path.expanduser(config("VULCANIZE_REPO_BASE_DIR", default="~/vulcanize")) +dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) if not args.quiet: print(f'Dev Root is: {dev_root_path}') @@ -64,8 +64,8 @@ def process_container(container): print(f"Error, script: {build_script_filename} doesn't exist") sys.exit(1) if not args.dry_run: - # We need to export VULCANIZE_REPO_BASE_DIR - build_result = subprocess.run(build_script_filename, shell=True, env={'VULCANIZE_REPO_BASE_DIR':dev_root_path}) + # We need to export CERC_REPO_BASE_DIR + build_result = subprocess.run(build_script_filename, shell=True, env={'CERC_REPO_BASE_DIR':dev_root_path}) # TODO: check result in build_result.returncode print(f"Result is: {build_result}") diff --git a/app/setup-repositories.py b/app/setup-repositories.py index 9623b4e9..b9ee06a4 100644 --- a/app/setup-repositories.py +++ b/app/setup-repositories.py @@ -14,7 +14,7 @@ # along with this program. If not, see . # env vars: -# VULCANIZE_REPO_BASE_DIR defaults to ~/vulcanize +# CERC_REPO_BASE_DIR defaults to ~/cerc import os import sys @@ -42,7 +42,7 @@ def is_git_repo(path): parser = argparse.ArgumentParser( description="git clone the set of repositories required to build the complete system from source", - epilog="Config provided either in .env or settings.ini or env vars: VULCANIZE_REPO_BASE_DIR (defaults to ~/vulcanize)" + epilog="Config provided either in .env or settings.ini or env vars: CERC_REPO_BASE_DIR (defaults to ~/cerc)" ) parser.add_argument("--verbose", action="store_true", help="increase output verbosity") parser.add_argument("--quiet", action="store_true", help="don\'t print informational output") @@ -55,7 +55,7 @@ args = parser.parse_args() verbose = args.verbose quiet = args.quiet -dev_root_path = os.path.expanduser(config("DEV_ROOT", default="~/vulcanize")) +dev_root_path = os.path.expanduser(config("DEV_ROOT", default="~/cerc")) if not args.quiet: print(f'Dev Root is: {dev_root_path}') diff --git a/compose/docker-compose-contract.yml b/compose/docker-compose-contract.yml index 9a65cd01..b8815f90 100644 --- a/compose/docker-compose-contract.yml +++ b/compose/docker-compose-contract.yml @@ -4,7 +4,7 @@ services: depends_on: go-ethereum: condition: service_healthy - image: vulcanize/test-contract:local + image: cerc/test-contract:local environment: ETH_ADDR: "http://go-ethereum:8545" ports: diff --git a/compose/docker-compose-db-sharding.yml b/compose/docker-compose-db-sharding.yml index 169584a9..b6117661 100644 --- a/compose/docker-compose-db-sharding.yml +++ b/compose/docker-compose-db-sharding.yml @@ -6,10 +6,10 @@ services: depends_on: ipld-eth-db: condition: service_healthy - image: vulcanize/ipld-eth-db:local + image: cerc/ipld-eth-db:local environment: DATABASE_USER: "vdbm" - DATABASE_NAME: "vulcanize_testing" + DATABASE_NAME: "cerc_testing" DATABASE_PASSWORD: "password" DATABASE_HOSTNAME: "ipld-eth-db" DATABASE_PORT: 5432 @@ -20,7 +20,7 @@ services: command: ["postgres", "-c", "log_statement=all"] environment: POSTGRES_USER: "vdbm" - POSTGRES_DB: "vulcanize_testing" + POSTGRES_DB: "cerc_testing" POSTGRES_PASSWORD: "password" healthcheck: test: ["CMD", "nc", "-v", "localhost", "5432"] diff --git a/compose/docker-compose-db.yml b/compose/docker-compose-db.yml index d164297b..a984f7f0 100644 --- a/compose/docker-compose-db.yml +++ b/compose/docker-compose-db.yml @@ -1,14 +1,14 @@ # TODO: figure out if this is needed -- it doesn't seem to make sense in the context of the -# current version of vulcanize/ipld-eth-db/Dockerfile, which is only the migrations code, not the DB itself +# current version of cerc/ipld-eth-db/Dockerfile, which is only the migrations code, not the DB itself # The sibling component docker-compose-db-sharding.yml looks more plausible version: "3.2" services: ipld-eth-db: restart: always - image: vulcanize/ipld-eth-db:local + image: cerc/ipld-eth-db:local environment: POSTGRES_USER: "vdbm" - POSTGRES_DB: "vulcanize_testing" + POSTGRES_DB: "cerc_testing" POSTGRES_PASSWORD: "password" healthcheck: test: ["CMD", "nc", "-v", "localhost", "5432"] diff --git a/compose/docker-compose-eth-statediff-fill-service.yml b/compose/docker-compose-eth-statediff-fill-service.yml index d59de1e5..16135250 100644 --- a/compose/docker-compose-eth-statediff-fill-service.yml +++ b/compose/docker-compose-eth-statediff-fill-service.yml @@ -5,11 +5,11 @@ services: depends_on: ipld-eth-db: condition: service_healthy - image: vulcanize/eth-statediff-fill-service:local + image: cerc/eth-statediff-fill-service:local environment: ETH_SERVER_HTTPPATH: 0.0.0.0:8085 VDB_COMMAND: "serve" - DATABASE_NAME: "vulcanize_testing" + DATABASE_NAME: "cerc_testing" DATABASE_HOSTNAME: "ipld-eth-db" DATABASE_PORT: 5432 DATABASE_USER: "vdbm" diff --git a/compose/docker-compose-go-ethereum-foundry.yml b/compose/docker-compose-go-ethereum-foundry.yml index 1145a2d3..c4a496b5 100644 --- a/compose/docker-compose-go-ethereum-foundry.yml +++ b/compose/docker-compose-go-ethereum-foundry.yml @@ -6,7 +6,7 @@ services: depends_on: ipld-eth-db: condition: service_healthy - image: vulcanize/go-ethereum-foundry:local + image: cerc/go-ethereum-foundry:local healthcheck: test: ["CMD", "nc", "-v", "localhost", "8545"] interval: 30s @@ -14,7 +14,7 @@ services: retries: 10 environment: DB_USER: vdbm - DB_NAME: vulcanize_testing + DB_NAME: cerc_testing DB_HOST: ipld-eth-db DB_PORT: 5432 DB_PASSWORD: password diff --git a/compose/docker-compose-ipld-eth-beacon-db.yml b/compose/docker-compose-ipld-eth-beacon-db.yml index 58e936a0..957b0b28 100644 --- a/compose/docker-compose-ipld-eth-beacon-db.yml +++ b/compose/docker-compose-ipld-eth-beacon-db.yml @@ -2,10 +2,10 @@ version: "3.2" services: ipld-eth-beacon-db: restart: always - image: vulcanize/ipld-eth-beacon-db:local + image: cerc/ipld-eth-beacon-db:local environment: POSTGRES_USER: vdbm - POSTGRES_DB: vulcanize_testing + POSTGRES_DB: cerc_testing POSTGRES_PASSWORD: password volumes: - vdb_db_eth-beacon_db:/var/lib/postgresql/data diff --git a/compose/docker-compose-ipld-eth-beacon-indexer.yml b/compose/docker-compose-ipld-eth-beacon-indexer.yml index 52d133dd..69b4c17e 100644 --- a/compose/docker-compose-ipld-eth-beacon-indexer.yml +++ b/compose/docker-compose-ipld-eth-beacon-indexer.yml @@ -5,7 +5,7 @@ services: depends_on: - ipld-eth-beacon-db - lighthouse - image: vulcanize/ipld-eth-beacon-indexer:local + image: cerc/ipld-eth-beacon-indexer:local volumes: - type: bind source: ${eth_beacon_config_file} diff --git a/compose/docker-compose-ipld-eth-server.yml b/compose/docker-compose-ipld-eth-server.yml index 88e6e46f..785d2d31 100644 --- a/compose/docker-compose-ipld-eth-server.yml +++ b/compose/docker-compose-ipld-eth-server.yml @@ -5,7 +5,7 @@ services: depends_on: ipld-eth-db: condition: service_healthy - image: vulcanize/ipld-eth-server:local + image: cerc/ipld-eth-server:local environment: IPLD_SERVER_GRAPHQL: "true" IPLD_POSTGRAPHILEPATH: http://graphql:5000 @@ -14,7 +14,7 @@ services: ETH_SERVER_GRAPHQLPATH: 0.0.0.0:8082 VDB_COMMAND: "serve" ETH_CHAIN_CONFIG: "/tmp/chain.json" - DATABASE_NAME: vulcanize_testing + DATABASE_NAME: cerc_testing DATABASE_HOSTNAME: ipld-eth-db DATABASE_PORT: 5432 DATABASE_USER: "vdbm" @@ -36,11 +36,11 @@ services: depends_on: ipld-eth-db: condition: service_healthy - image: vulcanize/postgraphile:v1.0.1 + image: cerc/postgraphile:v1.0.1 environment: PG_HOST: ipld-eth-db PG_PORT: 5432 - PG_DATABASE: vulcanize_testing + PG_DATABASE: cerc_testing PG_USER: vdbm PG_PASSWORD: password SCHEMA: public,eth diff --git a/compose/docker-compose-lighthouse.yml b/compose/docker-compose-lighthouse.yml index 887b398e..73d90797 100644 --- a/compose/docker-compose-lighthouse.yml +++ b/compose/docker-compose-lighthouse.yml @@ -2,7 +2,7 @@ version: "3.2" services: lighthouse: restart: always - image: vulcanize/lighthouse:local + image: cerc/lighthouse:local environment: - NETWORK=mainnet volumes: diff --git a/compose/docker-compose-prometheus-grafana.yml b/compose/docker-compose-prometheus-grafana.yml index 82042108..494748bc 100644 --- a/compose/docker-compose-prometheus-grafana.yml +++ b/compose/docker-compose-prometheus-grafana.yml @@ -7,7 +7,7 @@ services: user: "987" image: prom/prometheus volumes: - - ${vulcanize_ops}/metrics/etc:/etc/prometheus + - ${cerc_ops}/metrics/etc:/etc/prometheus - ./prometheus-data:/prometheus ports: - "127.0.0.1:9090:9090" diff --git a/container-build/vulcanize-eth-statediff-fill-service/build.sh b/container-build/vulcanize-eth-statediff-fill-service/build.sh index 33dd19b2..a88129c4 100755 --- a/container-build/vulcanize-eth-statediff-fill-service/build.sh +++ b/container-build/vulcanize-eth-statediff-fill-service/build.sh @@ -1,2 +1,2 @@ -# Build vulcanize/eth-statediff-fill-service -docker build -t vulcanize/eth-statediff-fill-service:local ${VULCANIZE_REPO_BASE_DIR}/eth-statediff-fill-service +# Build cerc/eth-statediff-fill-service +docker build -t cerc/eth-statediff-fill-service:local ${CERC_REPO_BASE_DIR}/eth-statediff-fill-service diff --git a/container-build/vulcanize-go-ethereum-foundry/Dockerfile b/container-build/vulcanize-go-ethereum-foundry/Dockerfile index 24cc838b..bbbc64fc 100644 --- a/container-build/vulcanize-go-ethereum-foundry/Dockerfile +++ b/container-build/vulcanize-go-ethereum-foundry/Dockerfile @@ -11,7 +11,7 @@ COPY start-private-network.sh . COPY deploy-local-network.sh . COPY $GENESIS_FILE_PATH ./genesis.json # TODO: figure out if this works for aarm64 -COPY --from=vulcanize/go-ethereum:local /usr/local/bin/geth /bin/geth +COPY --from=cerc/go-ethereum:local /usr/local/bin/geth /bin/geth RUN chmod +x /bin/geth EXPOSE 8545 diff --git a/container-build/vulcanize-go-ethereum-foundry/build.sh b/container-build/vulcanize-go-ethereum-foundry/build.sh index 9124a94b..d4fd2deb 100755 --- a/container-build/vulcanize-go-ethereum-foundry/build.sh +++ b/container-build/vulcanize-go-ethereum-foundry/build.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash -# Build vulcanize/go-ethereum-foundry +# Build cerc/go-ethereum-foundry # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t vulcanize/go-ethereum-foundry:local --build-arg GENESIS_FILE_PATH=genesis-automine.json ${SCRIPT_DIR} +docker build -t cerc/go-ethereum-foundry:local --build-arg GENESIS_FILE_PATH=genesis-automine.json ${SCRIPT_DIR} diff --git a/container-build/vulcanize-go-ethereum-foundry/deploy-local-network.sh b/container-build/vulcanize-go-ethereum-foundry/deploy-local-network.sh index 3ccb6994..e286bf30 100755 --- a/container-build/vulcanize-go-ethereum-foundry/deploy-local-network.sh +++ b/container-build/vulcanize-go-ethereum-foundry/deploy-local-network.sh @@ -31,7 +31,7 @@ eval "$( DB_USER=vdbm DB_PASSWORD=password -DB_NAME=vulcanize_public +DB_NAME=cerc_public DB_HOST=127.0.0.1 DB_PORT=5432 DB_TYPE=postgres diff --git a/container-build/vulcanize-go-ethereum/build.sh b/container-build/vulcanize-go-ethereum/build.sh index fd79af14..da59ec34 100755 --- a/container-build/vulcanize-go-ethereum/build.sh +++ b/container-build/vulcanize-go-ethereum/build.sh @@ -1,2 +1,2 @@ -# Build vulcanize/go-ethereum -docker build -t vulcanize/go-ethereum:local ${VULCANIZE_REPO_BASE_DIR}/go-ethereum +# Build cerc/go-ethereum +docker build -t cerc/go-ethereum:local ${CERC_REPO_BASE_DIR}/go-ethereum diff --git a/container-build/vulcanize-ipld-eth-beacon-db/build.sh b/container-build/vulcanize-ipld-eth-beacon-db/build.sh index 888c3662..b0bc8973 100755 --- a/container-build/vulcanize-ipld-eth-beacon-db/build.sh +++ b/container-build/vulcanize-ipld-eth-beacon-db/build.sh @@ -1,2 +1,2 @@ -# Build vulcanize/ipld-eth-beacon-db -docker build -t vulcanize/ipld-eth-beacon-db:local ${VULCANIZE_REPO_BASE_DIR}/ipld-eth-beacon-db +# Build cerc/ipld-eth-beacon-db +docker build -t cerc/ipld-eth-beacon-db:local ${CERC_REPO_BASE_DIR}/ipld-eth-beacon-db diff --git a/container-build/vulcanize-ipld-eth-beacon-indexer/build.sh b/container-build/vulcanize-ipld-eth-beacon-indexer/build.sh index c9586f94..59395bfc 100755 --- a/container-build/vulcanize-ipld-eth-beacon-indexer/build.sh +++ b/container-build/vulcanize-ipld-eth-beacon-indexer/build.sh @@ -1,2 +1,2 @@ -# Build vulcanize/ipld-eth-beacon-indexer -docker build -t vulcanize/ipld-eth-beacon-indexer:local ${VULCANIZE_REPO_BASE_DIR}/ipld-eth-beacon-indexer +# Build cerc/ipld-eth-beacon-indexer +docker build -t cerc/ipld-eth-beacon-indexer:local ${CERC_REPO_BASE_DIR}/ipld-eth-beacon-indexer diff --git a/container-build/vulcanize-ipld-eth-db/build.sh b/container-build/vulcanize-ipld-eth-db/build.sh index 3647243d..e6b164dc 100755 --- a/container-build/vulcanize-ipld-eth-db/build.sh +++ b/container-build/vulcanize-ipld-eth-db/build.sh @@ -1,2 +1,2 @@ -# Build vulcanize/ipld-eth-db -docker build -t vulcanize/ipld-eth-db:local ${VULCANIZE_REPO_BASE_DIR}/ipld-eth-db +# Build cerc/ipld-eth-db +docker build -t cerc/ipld-eth-db:local ${CERC_REPO_BASE_DIR}/ipld-eth-db diff --git a/container-build/vulcanize-ipld-eth-server/build.sh b/container-build/vulcanize-ipld-eth-server/build.sh index 722294bc..41f2b8a2 100755 --- a/container-build/vulcanize-ipld-eth-server/build.sh +++ b/container-build/vulcanize-ipld-eth-server/build.sh @@ -1,2 +1,2 @@ -# Build vulcanize/ipld-eth-server -docker build -t vulcanize/ipld-eth-server:local ${VULCANIZE_REPO_BASE_DIR}/ipld-eth-server +# Build cerc/ipld-eth-server +docker build -t cerc/ipld-eth-server:local ${CERC_REPO_BASE_DIR}/ipld-eth-server diff --git a/container-build/vulcanize-lighthouse/build.sh b/container-build/vulcanize-lighthouse/build.sh index c6359367..7babdbd1 100755 --- a/container-build/vulcanize-lighthouse/build.sh +++ b/container-build/vulcanize-lighthouse/build.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash -# Build vulcanize/lighthouse +# Build cerc/lighthouse # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t vulcanize/lighthouse:local ${SCRIPT_DIR} +docker build -t cerc/lighthouse:local ${SCRIPT_DIR} diff --git a/container-build/vulcanize-test-contract/build.sh b/container-build/vulcanize-test-contract/build.sh index d1fde373..1f721658 100755 --- a/container-build/vulcanize-test-contract/build.sh +++ b/container-build/vulcanize-test-contract/build.sh @@ -1,2 +1,2 @@ -# Build vulcanize/test-contract -docker build -t vulcanize/test-contract:local --build-arg ETH_ADDR=http://go-ethereum:8545 ${VULCANIZE_REPO_BASE_DIR}/ipld-eth-db-validator/test/contract +# Build cerc/test-contract +docker build -t cerc/test-contract:local --build-arg ETH_ADDR=http://go-ethereum:8545 ${CERC_REPO_BASE_DIR}/ipld-eth-db-validator/test/contract diff --git a/container-image-list.txt b/container-image-list.txt index 20e75a5f..23456a9a 100644 --- a/container-image-list.txt +++ b/container-image-list.txt @@ -1,9 +1,9 @@ -vulcanize/test-contract -vulcanize/eth-statediff-fill-service -vulcanize/go-ethereum -vulcanize/go-ethereum-foundry -vulcanize/lighthouse -vulcanize/ipld-eth-db -vulcanize/ipld-eth-beacon-db -vulcanize/ipld-eth-beacon-indexer -vulcanize/ipld-eth-server +cerc/test-contract +cerc/eth-statediff-fill-service +cerc/go-ethereum +cerc/go-ethereum-foundry +cerc/lighthouse +cerc/ipld-eth-db +cerc/ipld-eth-beacon-db +cerc/ipld-eth-beacon-indexer +cerc/ipld-eth-server diff --git a/repository-list.txt b/repository-list.txt index f37ba485..7f5bad0b 100644 --- a/repository-list.txt +++ b/repository-list.txt @@ -1,8 +1,8 @@ -vulcanize/ops -vulcanize/ipld-eth-db -vulcanize/go-ethereum -vulcanize/ipld-eth-server -vulcanize/eth-statediff-fill-service -vulcanize/ipld-eth-db-validator -vulcanize/ipld-eth-beacon-indexer -vulcanize/ipld-eth-beacon-db +cerc/ops +cerc/ipld-eth-db +cerc/go-ethereum +cerc/ipld-eth-server +cerc/eth-statediff-fill-service +cerc/ipld-eth-db-validator +cerc/ipld-eth-beacon-indexer +cerc/ipld-eth-beacon-db From 271b078cf9498cac8afc50a831fba3eb25b11808 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 23 Aug 2022 20:51:07 -0600 Subject: [PATCH 0033/1010] Rename for compatibility with Python import --- app/{build-containers.py => build_containers.py} | 0 app/{deploy-system.py => deploy_system.py} | 0 app/{setup-repositories.py => setup_repositories.py} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename app/{build-containers.py => build_containers.py} (100%) rename app/{deploy-system.py => deploy_system.py} (100%) rename app/{setup-repositories.py => setup_repositories.py} (100%) diff --git a/app/build-containers.py b/app/build_containers.py similarity index 100% rename from app/build-containers.py rename to app/build_containers.py diff --git a/app/deploy-system.py b/app/deploy_system.py similarity index 100% rename from app/deploy-system.py rename to app/deploy_system.py diff --git a/app/setup-repositories.py b/app/setup_repositories.py similarity index 100% rename from app/setup-repositories.py rename to app/setup_repositories.py From 8e75a1cedbcdb23a69050ce8b29772c54fb142e1 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 23 Aug 2022 20:51:18 -0600 Subject: [PATCH 0034/1010] Add new module --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 571719ee..7ee8181a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ python-decouple>=3.6 GitPython>=3.1.27 tqdm>=4.64.0 python-on-whales>=0.52.0 +click>=8.1.3 From fbf9d17a64974b49172bc5c9c1654621c96e8582 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 23 Aug 2022 21:27:42 -0600 Subject: [PATCH 0035/1010] Beginnings of click support --- app/build_containers.py | 57 ++++++++++++----------- app/deploy_system.py | 58 ++++++++++++----------- app/setup_repositories.py | 98 ++++++++++++++++++++------------------- orchestrator.py | 13 ++++++ 4 files changed, 124 insertions(+), 102 deletions(-) diff --git a/app/build_containers.py b/app/build_containers.py index 74f8295f..d1cc3c7e 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -25,6 +25,7 @@ import sys import argparse from decouple import config import subprocess +import click parser = argparse.ArgumentParser( description="build the set of containers required for a complete stack", @@ -37,40 +38,42 @@ parser.add_argument("--dry-run", action="store_true", help="don\'t do anything, args = parser.parse_args() -verbose = args.verbose -quiet = args.quiet +@click.command() +def command(): + verbose = args.verbose + quiet = args.quiet -dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) + dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) -if not args.quiet: - print(f'Dev Root is: {dev_root_path}') + if not args.quiet: + print(f'Dev Root is: {dev_root_path}') -if not os.path.isdir(dev_root_path): - print(f'Dev root directory doesn\'t exist, creating') + if not os.path.isdir(dev_root_path): + print(f'Dev root directory doesn\'t exist, creating') -with open("container-image-list.txt") as container_list_file: - containers = container_list_file.read().splitlines() + with open("container-image-list.txt") as container_list_file: + containers = container_list_file.read().splitlines() -if verbose: - print(f'Containers: {containers}') - -def process_container(container): - if not quiet: - print(f"Building: {container}") - build_script_filename = os.path.join("container-build",container.replace("/","-"),"build.sh") if verbose: - print(f"Script: {build_script_filename}") - if not os.path.exists(build_script_filename): - print(f"Error, script: {build_script_filename} doesn't exist") - sys.exit(1) - if not args.dry_run: - # We need to export CERC_REPO_BASE_DIR - build_result = subprocess.run(build_script_filename, shell=True, env={'CERC_REPO_BASE_DIR':dev_root_path}) - # TODO: check result in build_result.returncode - print(f"Result is: {build_result}") + print(f'Containers: {containers}') -for container in containers: - process_container(container) + def process_container(container): + if not quiet: + print(f"Building: {container}") + build_script_filename = os.path.join("container-build",container.replace("/","-"),"build.sh") + if verbose: + print(f"Script: {build_script_filename}") + if not os.path.exists(build_script_filename): + print(f"Error, script: {build_script_filename} doesn't exist") + sys.exit(1) + if not args.dry_run: + # We need to export CERC_REPO_BASE_DIR + build_result = subprocess.run(build_script_filename, shell=True, env={'CERC_REPO_BASE_DIR':dev_root_path}) + # TODO: check result in build_result.returncode + print(f"Result is: {build_result}") + + for container in containers: + process_container(container) diff --git a/app/deploy_system.py b/app/deploy_system.py index a80c7b2f..369fe73c 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -19,6 +19,7 @@ import os import argparse from decouple import config from python_on_whales import DockerClient +import click def include_exclude_check(s, args): if args.include == None and args.exclude == None: @@ -47,38 +48,39 @@ args = parser.parse_args() verbose = args.verbose quiet = args.quiet -print(args) +@click.command() +def command(): -with open("cluster-list.txt") as cluster_list_file: - clusters = cluster_list_file.read().splitlines() + with open("cluster-list.txt") as cluster_list_file: + clusters = cluster_list_file.read().splitlines() -if verbose: - print(f'Cluster components: {clusters}') + if verbose: + print(f'Cluster components: {clusters}') -# Construct a docker compose command suitable for our purpose + # Construct a docker compose command suitable for our purpose -compose_files = [] -for cluster in clusters: - if include_exclude_check(cluster, args): - compose_file_name = os.path.join("compose", f"docker-compose-{cluster}.yml") - compose_files.append(compose_file_name) - else: - if not quiet: - print(f"Excluding: {cluster}") + compose_files = [] + for cluster in clusters: + if include_exclude_check(cluster, args): + compose_file_name = os.path.join("compose", f"docker-compose-{cluster}.yml") + compose_files.append(compose_file_name) + else: + if not quiet: + print(f"Excluding: {cluster}") -if verbose: - print(f"files: {compose_files}") + if verbose: + print(f"files: {compose_files}") -# See: https://gabrieldemarmiesse.github.io/python-on-whales/sub-commands/compose/ -docker = DockerClient(compose_files=compose_files) + # See: https://gabrieldemarmiesse.github.io/python-on-whales/sub-commands/compose/ + docker = DockerClient(compose_files=compose_files) -command = args.command[0] -if not args.dry_run: - if command == "up": - if verbose: - print("Running compose up") - docker.compose.up(detach=True) - elif command == "down": - if verbose: - print("Running compose down") - docker.compose.down() + command = args.command[0] + if not args.dry_run: + if command == "up": + if verbose: + print("Running compose up") + docker.compose.up(detach=True) + elif command == "down": + if verbose: + print("Running compose down") + docker.compose.down() diff --git a/app/setup_repositories.py b/app/setup_repositories.py index b9ee06a4..f185055e 100644 --- a/app/setup_repositories.py +++ b/app/setup_repositories.py @@ -22,6 +22,7 @@ import argparse from decouple import config import git from tqdm import tqdm +import click class GitProgress(git.RemoteProgress): def __init__(self): @@ -52,58 +53,61 @@ parser.add_argument("--pull", action="store_true", help="pull from remote in alr args = parser.parse_args() -verbose = args.verbose -quiet = args.quiet +@click.command() +def command(): -dev_root_path = os.path.expanduser(config("DEV_ROOT", default="~/cerc")) + verbose = args.verbose + quiet = args.quiet -if not args.quiet: - print(f'Dev Root is: {dev_root_path}') + dev_root_path = os.path.expanduser(config("DEV_ROOT", default="~/cerc")) -if not os.path.isdir(dev_root_path): - if not quiet: - print(f'Dev root directory doesn\'t exist, creating') - os.makedirs(dev_root_path) + if not args.quiet: + print(f'Dev Root is: {dev_root_path}') -with open("repository-list.txt") as repository_list_file: - repos = repository_list_file.read().splitlines() + if not os.path.isdir(dev_root_path): + if not quiet: + print(f'Dev root directory doesn\'t exist, creating') + os.makedirs(dev_root_path) -if verbose: - print (f'Repos: {repos}') + with open("repository-list.txt") as repository_list_file: + repos = repository_list_file.read().splitlines() -def process_repo(repo): - full_github_repo_path = f'git@github.com:{repo}' - repoName = repo.split("/")[-1] - full_filesystem_repo_path = os.path.join(dev_root_path, repoName) - is_present = os.path.isdir(full_filesystem_repo_path) - if not quiet: - present_text = f'already exists active branch: {git.Repo(full_filesystem_repo_path).active_branch}' if is_present else 'Needs to be fetched' - print(f'Checking: {full_filesystem_repo_path}: {present_text}') - # Quick check that it's actually a repo - if is_present: - if not is_git_repo(full_filesystem_repo_path): - print(f'Error: {full_filesystem_repo_path} does not contain a valid git repository') - sys.exit(1) - else: - if args.pull: - if verbose: - print(f'Running git pull for {full_filesystem_repo_path}') - if not args.check_only: - repo = git.Repo(full_filesystem_repo_path) - origin = repo.remotes.origin - origin.pull(progress = None if quiet else GitProgress()) - else: - print("(git pull skipped)") - if not is_present: - # Clone - if verbose: - print(f'Running git clone for {full_github_repo_path} into {full_filesystem_repo_path}') - if not args.check_only: - git.Repo.clone_from(full_github_repo_path, full_filesystem_repo_path, - progress = None if quiet else GitProgress()) - else: - print("(git clone skipped)") + if verbose: + print (f'Repos: {repos}') + + def process_repo(repo): + full_github_repo_path = f'git@github.com:{repo}' + repoName = repo.split("/")[-1] + full_filesystem_repo_path = os.path.join(dev_root_path, repoName) + is_present = os.path.isdir(full_filesystem_repo_path) + if not quiet: + present_text = f'already exists active branch: {git.Repo(full_filesystem_repo_path).active_branch}' if is_present else 'Needs to be fetched' + print(f'Checking: {full_filesystem_repo_path}: {present_text}') + # Quick check that it's actually a repo + if is_present: + if not is_git_repo(full_filesystem_repo_path): + print(f'Error: {full_filesystem_repo_path} does not contain a valid git repository') + sys.exit(1) + else: + if args.pull: + if verbose: + print(f'Running git pull for {full_filesystem_repo_path}') + if not args.check_only: + repo = git.Repo(full_filesystem_repo_path) + origin = repo.remotes.origin + origin.pull(progress = None if quiet else GitProgress()) + else: + print("(git pull skipped)") + if not is_present: + # Clone + if verbose: + print(f'Running git clone for {full_github_repo_path} into {full_filesystem_repo_path}') + if not args.check_only: + git.Repo.clone_from(full_github_repo_path, full_filesystem_repo_path, + progress = None if quiet else GitProgress()) + else: + print("(git clone skipped)") -for repo in repos: - process_repo(repo) + for repo in repos: + process_repo(repo) diff --git a/orchestrator.py b/orchestrator.py index 09e4aa92..9212de13 100644 --- a/orchestrator.py +++ b/orchestrator.py @@ -13,3 +13,16 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import click + +from .app import setup_repositories +from .app import build_containers +from .app import deploy_system + +@click.group() +def main_command_group(): + pass + +main_command_group.add_command(setup_repositories.command) +main_command_group.add_command(build_containers.command) +main_command_group.add_command(deploy_system.command) From c9d42886d530b46c876d45e6901725419633b1ac Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 24 Aug 2022 11:57:35 -0600 Subject: [PATCH 0036/1010] Fix click integration --- app/deploy_system.py | 30 ++++++++++++++++-------------- orchestrator.py => cli.py | 25 ++++++++++++++++--------- setup.py | 9 ++++----- 3 files changed, 36 insertions(+), 28 deletions(-) rename orchestrator.py => cli.py (53%) diff --git a/app/deploy_system.py b/app/deploy_system.py index 369fe73c..7c2195ae 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -31,22 +31,24 @@ def include_exclude_check(s, args): exclude_list = args.exclude.split(",") return s not in exclude_list -parser = argparse.ArgumentParser( - description="deploy the complete stack" - ) -parser.add_argument("command", type=str, nargs=1, choices=['up', 'down', 'ps'], help="command: up|down|ps") -parser.add_argument("--verbose", action="store_true", help="increase output verbosity") -parser.add_argument("--quiet", action="store_true", help="don\'t print informational output") -parser.add_argument("--check-only", action="store_true", help="looks at what\'s already there and checks if it looks good") -parser.add_argument("--dry-run", action="store_true", help="don\'t do anything, just print the commands that would be executed") -group = parser.add_mutually_exclusive_group() -group.add_argument("--exclude", type=str, help="don\'t start these components") -group.add_argument("--include", type=str, help="only start these components") +#parser = argparse.ArgumentParser( +# description="deploy the complete stack" +# ) +#parser.add_argument("command", type=str, nargs=1, choices=['up', 'down', 'ps'], help="command: up|down|ps") +#parser.add_argument("--verbose", action="store_true", help="increase output verbosity") +#parser.add_argument("--quiet", action="store_true", help="don\'t print informational output") +#parser.add_argument("--check-only", action="store_true", help="looks at what\'s already there and checks if it looks good") +#parser.add_argument("--dry-run", action="store_true", help="don\'t do anything, just print the commands that would be executed") +#group = parser.add_mutually_exclusive_group() +#group.add_argument("--exclude", type=str, help="don\'t start these components") +#group.add_argument("--include", type=str, help="only start these components") -args = parser.parse_args() +#args = parser.parse_args() -verbose = args.verbose -quiet = args.quiet +#verbose = args.verbose +#quiet = args.quiet + +#print("Yo2!") @click.command() def command(): diff --git a/orchestrator.py b/cli.py similarity index 53% rename from orchestrator.py rename to cli.py index 9212de13..47d4811f 100644 --- a/orchestrator.py +++ b/cli.py @@ -15,14 +15,21 @@ import click -from .app import setup_repositories -from .app import build_containers -from .app import deploy_system +from app import setup_repositories +from app import build_containers +from app import deploy_system -@click.group() -def main_command_group(): - pass +CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) -main_command_group.add_command(setup_repositories.command) -main_command_group.add_command(build_containers.command) -main_command_group.add_command(deploy_system.command) +@click.group(context_settings=CONTEXT_SETTINGS) +@click.option('--quiet', default=False) +@click.option('--verbose', default=False) +@click.option('--dry-run', default=False) +def cli(): + """Example script.""" + print("Yo!") + click.echo('Hello World!') + +cli.add_command(setup_repositories.command,"setup-repositories") +cli.add_command(build_containers.command,"build-containers") +cli.add_command(deploy_system.command,"deploy-system") diff --git a/setup.py b/setup.py index 81bf1ba1..429e9a47 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ with open("requirements.txt", "r", encoding="utf-8") as fh: requirements = fh.read() setup( name = 'laconic-stack-orchestrator', - version = '0.0.1', + version = '0.0.3', author = 'Cerc', author_email = 'info@cerc.io', license = 'GNU Affero General Public License', @@ -22,8 +22,7 @@ setup( "Programming Language :: Python :: 3.8", "Operating System :: OS Independent", ], - entry_points = ''' - [console_scripts] - laconic-stack-orchestrator=orchestrator:cli - ''' + entry_points = { + 'console_scripts': ['laconic-stack-orchestrator=cli:cli'], + } ) From 2fadafbd8736098e36e54e3391f4b0002a5f2e5b Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 24 Aug 2022 12:29:51 -0600 Subject: [PATCH 0037/1010] More click code --- app/setup_repositories.py | 32 +++++++++++++++----------------- cli.py | 15 +++++++++++---- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/app/setup_repositories.py b/app/setup_repositories.py index f185055e..9eb2ab69 100644 --- a/app/setup_repositories.py +++ b/app/setup_repositories.py @@ -41,23 +41,21 @@ def is_git_repo(path): except git.exc.InvalidGitRepositoryError: return False -parser = argparse.ArgumentParser( - description="git clone the set of repositories required to build the complete system from source", - epilog="Config provided either in .env or settings.ini or env vars: CERC_REPO_BASE_DIR (defaults to ~/cerc)" - ) -parser.add_argument("--verbose", action="store_true", help="increase output verbosity") -parser.add_argument("--quiet", action="store_true", help="don\'t print informational output") -parser.add_argument("--check-only", action="store_true", help="looks at what\'s already there and checks if it looks good") -parser.add_argument("--dry-run", action="store_true", help="don\'t do anything, just print the commands that would be executed") -parser.add_argument("--pull", action="store_true", help="pull from remote in already existing repositories") - -args = parser.parse_args() +# TODO: find a place for this in the context of click +#parser = argparse.ArgumentParser( +# epilog="Config provided either in .env or settings.ini or env vars: CERC_REPO_BASE_DIR (defaults to ~/cerc)" +# ) @click.command() -def command(): +@click.option('--check-only', default=False) +@click.option('--pull', default=False) +@click.pass_context +def command(ctx, check_only, pull): + '''git clone the set of repositories required to build the complete system from source''' - verbose = args.verbose - quiet = args.quiet + quiet = ctx.obj.quiet + verbose = ctx.obj.verbose + dry_run = ctx.obj.verbose dev_root_path = os.path.expanduser(config("DEV_ROOT", default="~/cerc")) @@ -89,10 +87,10 @@ def command(): print(f'Error: {full_filesystem_repo_path} does not contain a valid git repository') sys.exit(1) else: - if args.pull: + if pull: if verbose: print(f'Running git pull for {full_filesystem_repo_path}') - if not args.check_only: + if not check_only: repo = git.Repo(full_filesystem_repo_path) origin = repo.remotes.origin origin.pull(progress = None if quiet else GitProgress()) @@ -102,7 +100,7 @@ def command(): # Clone if verbose: print(f'Running git clone for {full_github_repo_path} into {full_filesystem_repo_path}') - if not args.check_only: + if not dry_run: git.Repo.clone_from(full_github_repo_path, full_filesystem_repo_path, progress = None if quiet else GitProgress()) else: diff --git a/cli.py b/cli.py index 47d4811f..dda2b4a5 100644 --- a/cli.py +++ b/cli.py @@ -21,14 +21,21 @@ from app import deploy_system CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) +class Options(object): + def __init__(self, quiet, verbose, dry_run): + self.quiet = quiet + self.verbose = verbose + self.dry_run = dry_run + @click.group(context_settings=CONTEXT_SETTINGS) @click.option('--quiet', default=False) @click.option('--verbose', default=False) @click.option('--dry-run', default=False) -def cli(): - """Example script.""" - print("Yo!") - click.echo('Hello World!') +# See: https://click.palletsprojects.com/en/8.1.x/complex/#building-a-git-clone +@click.pass_context +def cli(ctx, quiet, verbose, dry_run): + """Laconic Stack Orchestrator""" + ctx.obj = Options(quiet, verbose, dry_run) cli.add_command(setup_repositories.command,"setup-repositories") cli.add_command(build_containers.command,"build-containers") From 397866f18b4594745af653cc73ce29258fd271de Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 24 Aug 2022 12:36:58 -0600 Subject: [PATCH 0038/1010] More click refactoring --- app/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 156 bytes app/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 156 bytes .../build_containers.cpython-38.pyc | Bin 0 -> 1430 bytes .../build_containers.cpython-39.pyc | Bin 0 -> 2019 bytes app/__pycache__/deploy_system.cpython-38.pyc | Bin 0 -> 1396 bytes app/__pycache__/deploy_system.cpython-39.pyc | Bin 0 -> 2143 bytes .../setup_repositories.cpython-38.pyc | Bin 0 -> 2908 bytes .../setup_repositories.cpython-39.pyc | Bin 0 -> 3413 bytes app/build_containers.py | 31 ++++++++++-------- app/deploy_system.py | 11 +++++-- 10 files changed, 25 insertions(+), 17 deletions(-) create mode 100644 app/__pycache__/__init__.cpython-38.pyc create mode 100644 app/__pycache__/__init__.cpython-39.pyc create mode 100644 app/__pycache__/build_containers.cpython-38.pyc create mode 100644 app/__pycache__/build_containers.cpython-39.pyc create mode 100644 app/__pycache__/deploy_system.cpython-38.pyc create mode 100644 app/__pycache__/deploy_system.cpython-39.pyc create mode 100644 app/__pycache__/setup_repositories.cpython-38.pyc create mode 100644 app/__pycache__/setup_repositories.cpython-39.pyc diff --git a/app/__pycache__/__init__.cpython-38.pyc b/app/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42da53cc51514f858c06c228f7ea339563e13285 GIT binary patch literal 156 zcmWIL<>g`kg5t+4$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6vJKO;XkRX-)M zEHg#FpeR2pHMyi%zpOMTIWaG@DpkL@Br!Q#H@_%3Bel4sD6u5JNI$WlKtDb{GcU6w ZK3=b&@)n0pZhlH>PO2Tq=+8jR000|bCNuy5 literal 0 HcmV?d00001 diff --git a/app/__pycache__/__init__.cpython-39.pyc b/app/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00879fd41006b78d25492d2a0250fb9cf4c0adc4 GIT binary patch literal 156 zcmYe~<>g`kg5t+4$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6vJKO;XkRX-)M zEHg#FpeR2pHMyi%zpOMTIWaG@DpkL@Br!Q#H@_%3Bel4sD6u5JNI$WlKtDb{GcU6w ZK3=b&@)n0pZhlH>PO2Tq=+8jR001JdCO`lH literal 0 HcmV?d00001 diff --git a/app/__pycache__/build_containers.cpython-38.pyc b/app/__pycache__/build_containers.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a58c334d39649cd122c7028c5ace90300cf20a5 GIT binary patch literal 1430 zcmZWp&2J+$6t_K}nI_%c><8sTC_+dmXq%k4psK*OJ?y1G3IdIUMw7AIOm;FeYdcXo zO1QLAQ;8LK&`JrnmH3N%<+T4oPdq#QV1-A1_WSVj@BREVKQ&xuMJ4rME)N9s1Ow_BlGkXE^jI zK0z5YF(uS` zMOOF{Er{5a9<>+fPxP9cVT??azd$Q2df;)4tw!B5{CjhbXLuQ`&~jsi=Hw^z1^OQK z(9dXL@pFjvX5=Qz1-if&7+CR=Qp3i-5^a2CrnKdH8WHW{ZmHKq;p6SJs@siN+nZhPKVaDtI}%^4?q1>T z$~Q_!3@ZO9;b|##=mF;if7%i^hRt_rd#iiv2d>L+6Xl2j%Q9uLd{S-nn1F{c^tS`$ zlswI)B85p(^uJ60WB|7D)dTa6XHnf1> z3sM1_mT-D380SP=_3uYHseo=*c2Tli+0fn;I4!eOX3*TC?Iuq6F$=711%nF@gWH1U4w3eB0dIzY#+l11woOd4!Zz9G5h8{AM;NkqFr0Vz7Kol z$NZ#>xnRntEGfoi#@6tg+Uq1)n!GTlRK1LaFm$r1T;nicj4)vQol!x@8QXmi&I+C0 NV8MU_`wbTe{})e%hSmT8 literal 0 HcmV?d00001 diff --git a/app/__pycache__/build_containers.cpython-39.pyc b/app/__pycache__/build_containers.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e544127cf7bf8921bd8c7d3b7c19c3e570c7ff8 GIT binary patch literal 2019 zcmZWq&5zSY6rUM?#G8-Z1xgDlYNuQvh$OAl3uuMP$4ccw(Nd`*QWbeUlf+raV`j!- zV`Y0;B$i4`Z#}f4+VsY~e@hR(_Qb!yq3WASHc(;9FMc0>^XB({ZxS{dRRq_szj@K$ zHH7{#%KMiG$~W++KR__VaDuvvU);r3CtU)+Byq-W*ToB;*Y&K=@A{mKD$HRn^NvY3 z;K68(`K-bMws!1bWc4cOwfFQo=#BUEbz<8fu5Fjzbd{ zCd(v6z150_JlboCG?^AR5+U{!4K;l_4D}UwOJGShH5f`x!<11Qt!Uh*v8Idgfe_48 z&E&Kt^R&3VSd|I*V5)}z(seq@)oC539{~3lvH={h4t*+e=+iEze4j_T<}5O;JiT0a z3E*+yQGbEZXoO!7kmLo{&d5FSw9haj%sD1={KEK&`dU|*dxU;RugD?B$i@XnXpYsl z;PI>t$asi-lxIIAM&U2XfXm8~B1PjKpU@p4pkqL$ z;+j#VQ5o(ubVaIv_sB6uqvhXdY9z~9#Ux~K!8m(;&WBMc~> zUIx|*Jm=t1FF_n(bymZy&)$KDN94p|1YmN_G|vh1=FR~IFt#Ale+Py(k=_gg%)8*R zFtOm31w#8L6}C1v&46=2{j95_+6=QQs~w>jv-+`f08M3$899a40=NF4sNOMy3>ySE zHr{Q~j`v&Kd5c>`V3oES7QrJsQ6_X-N+GY)#fX7n{r|wdF)(~D4Yy!~JO#6pln%^s zQQP4Prqwo}SuZ_1KqV2XbhA(oOLrvVw5&*;C1J#2a!nsp>8L40fTBw`lmi7lmD3)K z1PpS%3uj5h6-0rd>6B}$jdai3;(Load;K`!X*lNH`ob)2Ew7!j!T6+Sn9#FDcy`9i z%JQ&yjo#kx48@ptSO{lU2bLQFT~ue1CsCNj1@G9ittBMPu+lOFDs{pv>nxU8m806( zv^=w{wzo2G8Gd{W0$~@g;|o^S@g}ZfpL|4$%gdQ=ZzUoM6LqWoL5gNwegfai&yD!Z zh)pBTfGDecKZ6q?S6oVBtQ*Ga#R^zox+3Fg>6)_$pv;n3Cvb|ZrrSNYs;_6bZo%tT zS4Jf-n_Qn7L5;X%#1|mS%Cg=jD9V@-@$F80yiV#kAXR*gz)s2LMu6p2@HZQade6gq z89;+GIPQ5FFdm5<{yi3TUo>7XO5$j*T)!;``Ix8rp^22GZ@-XbJ!Gs039PTITC363 u0w1&3qFlOqvo!}>W5M!--!d>N;|#F5pRi!4Kw&5%bCxVi3Q1qi zhP3pu2Hmm*0qm{)XZiw(`=$0YZNp z<0>!%##~5@{kcAUF*kDdU7jEp@IWD}|W0bkCQS5VX6KoOp@*eY; z{~F!k8yp7=KSiV9AFzwgM_7AlRldkBVHQ2A(m5ArMaD~&5<}>k@y3CE23kQE;2Qu8cR(RaVg`d<4lW8syOP1R{H}96W|Yz$Fpj|$1J(Z*tix| z&Qm4FSIZ(z%52TYQYGp9q!Q_jOC=IjiE&cbW5(;ET219jD!w?aSNhKFQMZS{hID?< z#A65o;Ui3Oh$9?WDI&m9Y*xC~hp`9Uh7iF@gL0JP7Tb}SAc0O=M>!1A^xI)e8@i!e zv~jnnb$>?p(T`|?o|{n0*r{?0rMO07E^=9W5FBT_E@hC8%KU@ zLKZ^8{{rrx!0j6!nqIz_@3V*v-hftq37kFPd<4$Fz}dg$Y=&F-d7J9t`FaSMg$Roi zlfYATt=30pJLEX67IjrZAwRWR^rX{I*7S6>DAxTSY>i~)<-_B({~{|m z?1G9ObiApBVmgClYqG4@hm&Pl0)2Ok5okk$I3Y-b znm+7CYhx6O&%uBW;JVg{fG`D&r`579xG?WaJgir0R+UruUd<9nn+=0@(;`dfyPz3g sbW|r&PT{3e{91kDt@Ycutb=bB63lDtz4}(r_>Hq)$ literal 0 HcmV?d00001 diff --git a/app/__pycache__/deploy_system.cpython-39.pyc b/app/__pycache__/deploy_system.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82705c0df61e1e343be1f604c42d9f7d85c30edf GIT binary patch literal 2143 zcmZuy&5zqe6!+MU<9zLAKU#L%1>6IwQf-=o1QIKRC@np%5ERi`LXqp4O`JF$cV@h8 zEH9Vsbw%%0r3CfD|HH{wxb)7c7kF>tpcTT&JkNXcKIXld-*eFEG!1xuc;tj{+J^B5 zGMAq^Fkiute*vKeC9&bJ-oz)so3S~we2bvWitSm=ujx679p9lgt-Ub(IwKR8I<$U4 z{03`Gn$%@2+87zM`75C<+P(lAE$`3`x=Fhi;7{{gz;9pTcYxo$#9sma>Y87)mxkYA z9q|7i_}`=Z+7I&AfWKbxjl~A&ZL-Zt*Y5(|^0(MFJvb*2(^>2+4f;NHUl`}a-=XAt zqxZpE$lN&Yk;!H|!D6l4OmnVMn`W>7Jl zq2EewiO+DhFsZpDXJ%m(=Bc4qQP&a=(W+XtVAVPWTM8OI>-gb2a@e!VdX$85Mp;>B z&sUS0OyfxP?2^dR4#Y_M?Mi1DM^gFiN>Ova83M1sy9a|YpRoZAP9r)<1)s1`$-!wB zhd~nMY#>z-PWxPhVXaO$U^vF`p0RTq-uZozBZE>rm?;U=U9CupV6?2H7Px zX_7W^H5G8{jC_CP##3YFg?yIAOfgSKgle}alc9)G74f93!}2Uh=vxAIkiD6urA_&> zq%>2R?^dfvUYex^ii=c2A#62ISy@Z47~o>eqmV&u#w`@_uT}7oF4CZPaC8I-clF9Wxs*+;OBsj)kJd3IKgn8^a3p2&Ex9YU=gOxX^y->Ih z$R7`cCvekc&lEe5@hWZDLUq*nbxa4(>wj!=`!WCIMhIsAKG;-T7#bul9HfHAa!!6Z zI5P@kL6!iArEx}ngo|#&?;P4e(*4+wx9%83{~iNXmUy6SY8K>`@!CZAjtl@0xo`aR z^_it=g{7QxQ~a#z6L-;|7PSlOl|gH-t)+Qp7v`c_*h{c_daPRV7(6++zVZYzOS}PD zy)f4@)hj@1YrLOR=4){w0H7@N5 zj}kys3NC0_(@+xFL&XLv*5RHH;hu|q6yZ+wR(f@RtE!Z4V>%t*twd5>14X}Hv7m}~ zSTe0OOoADMuahpD4x&5YinK5Q2L2R=yaU9rn&g&glMUO}J?koI1J^}~)ij$RbD^WT zqznBF-@RRN1FT9HnoSxAXe%ydA1aoyYzLGM!LME`Eoj8$0g7gs%7Qqa4>gQsbjpS!0U^uU>ebZtXeo91 z#fPvF@evXa2_}502>3w|Sc%g8V#a9}voE)SlZQYs-8Qyw({0+s{M)hiAobM`i_kS) J(;<$g{{RPmRf_-s literal 0 HcmV?d00001 diff --git a/app/__pycache__/setup_repositories.cpython-38.pyc b/app/__pycache__/setup_repositories.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37c8fa4fd023ac3bf9f69e94fd562465a240f3ea GIT binary patch literal 2908 zcmY*b&5qp05$-0NKg;=%yjly9<2Zy7$C^aDgCs}}f?x=-Y$J#;c2;ui5C{k^yJwfP z9FpqpS?m%sx$FWv0wP3*+zbOVx#^N;$RQ7qTMS-vQXU`&U!1C*S!+y!&FbpvVpr8y zRs6Km2?$*O9=qv(uMzSeoNQh$Ozy*@p2NTir#XpMZyHfEw;~JPR&I}3#OP|xi5%eB zxjS|vcg^!6?<2w)cPmMe^bxud?5Q5;@BkPh3DW}}J@FSah z+~Mv8jo2k&ByvEz-?To;^e3`BltQVLZs)P@*kV3Ag>so|4$+ z1XQs>Lx26aXGd&OWV&$@m1bEK;3QUQl8YW|95tzgZ2UORkR3}@-mvN*k!Y3@`S1m8 zw&FO=6Q$z#1^N27{iAX$`aC(wc)yb6NTgczPbPVq6j?3$N+;>@ZYk3vp|nhNDf>xP z^_9?*Dwd)uRR+9FsJ-e;`tZ3o(H;f^p#iOTHq76JUS z$?2N(#t@I>P{X6ipagXJRmUK$W#A-0Z}oc zPnmgJPo4GK(qQYt(XL4!`aEt0EntHrNuZL%5og4aw1a^`42w$eZ2qi$B%3GPyJNLRQ?dWRd*hU zlW@N*b(pEUVf_=FN}NKZA>B)P7V=W4;$0nz(@g0*VJbzUv*NJ6@$HGuc5_(T)2F)j z3>xl+-vJ~B2^0ASJnA-7Hx6J#=gi=}0N5=lw{MY|r2(J|dk)FHv}U%Mv8lbJGX|mH zQzjpBrk#b0ype|*3X3~42iy(3F9q*u21RIp0npvUfSCdEU9@TR|N6)oz#-0Ok6I*|S=>+SGdunpc%WA+ky(v4=El zRAxovWC~C!ZvjWX0YlVTxgcJ-pm8b*T1{1HY)FZQ0faTSgK?>aYFubehoFby8BH0D z0`ut@6Q}1j46Tk{AHp)$Er@_AT``uo$j8M2)b{9>5g2Bd2gcrK;PJ}!t)w(&EstS6` z6k3+~>_d=Mzk&fB4 zkCS5o5raUKl>omZe4D_;HqQ#7z~y$TPh}sspw-dNE8N9cV`B7jfBf zQpO|R+6X+QdK(7fVXOA79m}O%3ti&VzzXP1FurTueA}n;9!T}ND|324H$I%cN~D6) z$p!o*KxH*%t?-8Zrg73dOOK=Oz5&!HYv3Cs8Ppl20JBPGWzn=N{ISC1!uY@H?S?Yv e_V2C!5Z*I|5+QAl4Kaj9569mQ{I&}e8t{L8c>?PI literal 0 HcmV?d00001 diff --git a/app/__pycache__/setup_repositories.cpython-39.pyc b/app/__pycache__/setup_repositories.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f21b25d80e27a3db2aab9e43bbe028e365d3be3b GIT binary patch literal 3413 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 C*{f&( literal 0 HcmV?d00001 diff --git a/app/build_containers.py b/app/build_containers.py index d1cc3c7e..b0bb229f 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -27,25 +27,28 @@ from decouple import config import subprocess import click -parser = argparse.ArgumentParser( - description="build the set of containers required for a complete stack", - epilog="Config provided either in .env or settings.ini or env vars: CERC_REPO_BASE_DIR (defaults to ~/cerc)" - ) -parser.add_argument("--verbose", action="store_true", help="increase output verbosity") -parser.add_argument("--quiet", action="store_true", help="don\'t print informational output") -parser.add_argument("--check-only", action="store_true", help="looks at what\'s already there and checks if it looks good") -parser.add_argument("--dry-run", action="store_true", help="don\'t do anything, just print the commands that would be executed") +#parser = argparse.ArgumentParser( +# description="build the set of containers required for a complete stack", +# epilog="Config provided either in .env or settings.ini or env vars: CERC_REPO_BASE_DIR (defaults to ~/cerc)" +# ) +#parser.add_argument("--verbose", action="store_true", help="increase output verbosity") +#parser.add_argument("--quiet", action="store_true", help="don\'t print informational output") +#parser.add_argument("--check-only", action="store_true", help="looks at what\'s already there and checks if it looks good") +#parser.add_argument("--dry-run", action="store_true", help="don\'t do anything, just print the commands that would be executed") -args = parser.parse_args() +#args = parser.parse_args() @click.command() -def command(): - verbose = args.verbose - quiet = args.quiet +@click.pass_context +def command(ctx): + + quiet = ctx.obj.quiet + verbose = ctx.obj.verbose + dry_run = ctx.obj.verbose dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) - if not args.quiet: + if not quiet: print(f'Dev Root is: {dev_root_path}') if not os.path.isdir(dev_root_path): @@ -66,7 +69,7 @@ def command(): if not os.path.exists(build_script_filename): print(f"Error, script: {build_script_filename} doesn't exist") sys.exit(1) - if not args.dry_run: + if not dry_run: # We need to export CERC_REPO_BASE_DIR build_result = subprocess.run(build_script_filename, shell=True, env={'CERC_REPO_BASE_DIR':dev_root_path}) # TODO: check result in build_result.returncode diff --git a/app/deploy_system.py b/app/deploy_system.py index 7c2195ae..606280d4 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -51,7 +51,12 @@ def include_exclude_check(s, args): #print("Yo2!") @click.command() -def command(): +@click.pass_context +def command(ctx): + + quiet = ctx.obj.quiet + verbose = ctx.obj.verbose + dry_run = ctx.obj.verbose with open("cluster-list.txt") as cluster_list_file: clusters = cluster_list_file.read().splitlines() @@ -76,8 +81,8 @@ def command(): # See: https://gabrieldemarmiesse.github.io/python-on-whales/sub-commands/compose/ docker = DockerClient(compose_files=compose_files) - command = args.command[0] - if not args.dry_run: + command = "hack" + if not dry_run: if command == "up": if verbose: print("Running compose up") From ca5cf5548521e038f01d4f31bbb5a8729d1058c0 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 24 Aug 2022 12:40:15 -0600 Subject: [PATCH 0039/1010] More rebranding --- .../build.sh | 0 .../Dockerfile | 0 .../build.sh | 0 .../deploy-local-network.sh | 0 .../genesis-automine.json | 0 .../genesis.json | 0 .../start-private-network.sh | 0 .../stateful/foundry.toml | 0 .../stateful/lib/ds-test/LICENSE | 0 .../stateful/lib/ds-test/Makefile | 0 .../stateful/lib/ds-test/default.nix | 0 .../stateful/lib/ds-test/demo/demo.sol | 0 .../stateful/lib/ds-test/src/test.sol | 0 .../stateful/src/Stateful.sol | 0 .../stateful/src/test/Stateful.t.sol | 0 .../{vulcanize-go-ethereum => cerc-go-ethereum}/build.sh | 0 .../build.sh | 0 .../build.sh | 0 .../{vulcanize-ipld-eth-db => cerc-ipld-eth-db}/build.sh | 0 .../{vulcanize-ipld-eth-server => cerc-ipld-eth-server}/build.sh | 0 .../{vulcanize-lighthouse => cerc-lighthouse}/Dockerfile | 0 .../{vulcanize-lighthouse => cerc-lighthouse}/build.sh | 0 .../{vulcanize-lighthouse => cerc-lighthouse}/start-lighthouse.sh | 0 .../{vulcanize-test-contract => cerc-test-contract}/build.sh | 0 24 files changed, 0 insertions(+), 0 deletions(-) rename container-build/{vulcanize-eth-statediff-fill-service => cerc-eth-statediff-fill-service}/build.sh (100%) rename container-build/{vulcanize-go-ethereum-foundry => cerc-go-ethereum-foundry}/Dockerfile (100%) rename container-build/{vulcanize-go-ethereum-foundry => cerc-go-ethereum-foundry}/build.sh (100%) rename container-build/{vulcanize-go-ethereum-foundry => cerc-go-ethereum-foundry}/deploy-local-network.sh (100%) rename container-build/{vulcanize-go-ethereum-foundry => cerc-go-ethereum-foundry}/genesis-automine.json (100%) rename container-build/{vulcanize-go-ethereum-foundry => cerc-go-ethereum-foundry}/genesis.json (100%) rename container-build/{vulcanize-go-ethereum-foundry => cerc-go-ethereum-foundry}/start-private-network.sh (100%) rename container-build/{vulcanize-go-ethereum-foundry => cerc-go-ethereum-foundry}/stateful/foundry.toml (100%) rename container-build/{vulcanize-go-ethereum-foundry => cerc-go-ethereum-foundry}/stateful/lib/ds-test/LICENSE (100%) rename container-build/{vulcanize-go-ethereum-foundry => cerc-go-ethereum-foundry}/stateful/lib/ds-test/Makefile (100%) rename container-build/{vulcanize-go-ethereum-foundry => cerc-go-ethereum-foundry}/stateful/lib/ds-test/default.nix (100%) rename container-build/{vulcanize-go-ethereum-foundry => cerc-go-ethereum-foundry}/stateful/lib/ds-test/demo/demo.sol (100%) rename container-build/{vulcanize-go-ethereum-foundry => cerc-go-ethereum-foundry}/stateful/lib/ds-test/src/test.sol (100%) rename container-build/{vulcanize-go-ethereum-foundry => cerc-go-ethereum-foundry}/stateful/src/Stateful.sol (100%) rename container-build/{vulcanize-go-ethereum-foundry => cerc-go-ethereum-foundry}/stateful/src/test/Stateful.t.sol (100%) rename container-build/{vulcanize-go-ethereum => cerc-go-ethereum}/build.sh (100%) rename container-build/{vulcanize-ipld-eth-beacon-db => cerc-ipld-eth-beacon-db}/build.sh (100%) rename container-build/{vulcanize-ipld-eth-beacon-indexer => cerc-ipld-eth-beacon-indexer}/build.sh (100%) rename container-build/{vulcanize-ipld-eth-db => cerc-ipld-eth-db}/build.sh (100%) rename container-build/{vulcanize-ipld-eth-server => cerc-ipld-eth-server}/build.sh (100%) rename container-build/{vulcanize-lighthouse => cerc-lighthouse}/Dockerfile (100%) rename container-build/{vulcanize-lighthouse => cerc-lighthouse}/build.sh (100%) rename container-build/{vulcanize-lighthouse => cerc-lighthouse}/start-lighthouse.sh (100%) rename container-build/{vulcanize-test-contract => cerc-test-contract}/build.sh (100%) diff --git a/container-build/vulcanize-eth-statediff-fill-service/build.sh b/container-build/cerc-eth-statediff-fill-service/build.sh similarity index 100% rename from container-build/vulcanize-eth-statediff-fill-service/build.sh rename to container-build/cerc-eth-statediff-fill-service/build.sh diff --git a/container-build/vulcanize-go-ethereum-foundry/Dockerfile b/container-build/cerc-go-ethereum-foundry/Dockerfile similarity index 100% rename from container-build/vulcanize-go-ethereum-foundry/Dockerfile rename to container-build/cerc-go-ethereum-foundry/Dockerfile diff --git a/container-build/vulcanize-go-ethereum-foundry/build.sh b/container-build/cerc-go-ethereum-foundry/build.sh similarity index 100% rename from container-build/vulcanize-go-ethereum-foundry/build.sh rename to container-build/cerc-go-ethereum-foundry/build.sh diff --git a/container-build/vulcanize-go-ethereum-foundry/deploy-local-network.sh b/container-build/cerc-go-ethereum-foundry/deploy-local-network.sh similarity index 100% rename from container-build/vulcanize-go-ethereum-foundry/deploy-local-network.sh rename to container-build/cerc-go-ethereum-foundry/deploy-local-network.sh diff --git a/container-build/vulcanize-go-ethereum-foundry/genesis-automine.json b/container-build/cerc-go-ethereum-foundry/genesis-automine.json similarity index 100% rename from container-build/vulcanize-go-ethereum-foundry/genesis-automine.json rename to container-build/cerc-go-ethereum-foundry/genesis-automine.json diff --git a/container-build/vulcanize-go-ethereum-foundry/genesis.json b/container-build/cerc-go-ethereum-foundry/genesis.json similarity index 100% rename from container-build/vulcanize-go-ethereum-foundry/genesis.json rename to container-build/cerc-go-ethereum-foundry/genesis.json diff --git a/container-build/vulcanize-go-ethereum-foundry/start-private-network.sh b/container-build/cerc-go-ethereum-foundry/start-private-network.sh similarity index 100% rename from container-build/vulcanize-go-ethereum-foundry/start-private-network.sh rename to container-build/cerc-go-ethereum-foundry/start-private-network.sh diff --git a/container-build/vulcanize-go-ethereum-foundry/stateful/foundry.toml b/container-build/cerc-go-ethereum-foundry/stateful/foundry.toml similarity index 100% rename from container-build/vulcanize-go-ethereum-foundry/stateful/foundry.toml rename to container-build/cerc-go-ethereum-foundry/stateful/foundry.toml diff --git a/container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/LICENSE b/container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/LICENSE similarity index 100% rename from container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/LICENSE rename to container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/LICENSE diff --git a/container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/Makefile b/container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/Makefile similarity index 100% rename from container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/Makefile rename to container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/Makefile diff --git a/container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/default.nix b/container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/default.nix similarity index 100% rename from container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/default.nix rename to container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/default.nix diff --git a/container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/demo/demo.sol b/container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/demo/demo.sol similarity index 100% rename from container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/demo/demo.sol rename to container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/demo/demo.sol diff --git a/container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/src/test.sol b/container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/src/test.sol similarity index 100% rename from container-build/vulcanize-go-ethereum-foundry/stateful/lib/ds-test/src/test.sol rename to container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/src/test.sol diff --git a/container-build/vulcanize-go-ethereum-foundry/stateful/src/Stateful.sol b/container-build/cerc-go-ethereum-foundry/stateful/src/Stateful.sol similarity index 100% rename from container-build/vulcanize-go-ethereum-foundry/stateful/src/Stateful.sol rename to container-build/cerc-go-ethereum-foundry/stateful/src/Stateful.sol diff --git a/container-build/vulcanize-go-ethereum-foundry/stateful/src/test/Stateful.t.sol b/container-build/cerc-go-ethereum-foundry/stateful/src/test/Stateful.t.sol similarity index 100% rename from container-build/vulcanize-go-ethereum-foundry/stateful/src/test/Stateful.t.sol rename to container-build/cerc-go-ethereum-foundry/stateful/src/test/Stateful.t.sol diff --git a/container-build/vulcanize-go-ethereum/build.sh b/container-build/cerc-go-ethereum/build.sh similarity index 100% rename from container-build/vulcanize-go-ethereum/build.sh rename to container-build/cerc-go-ethereum/build.sh diff --git a/container-build/vulcanize-ipld-eth-beacon-db/build.sh b/container-build/cerc-ipld-eth-beacon-db/build.sh similarity index 100% rename from container-build/vulcanize-ipld-eth-beacon-db/build.sh rename to container-build/cerc-ipld-eth-beacon-db/build.sh diff --git a/container-build/vulcanize-ipld-eth-beacon-indexer/build.sh b/container-build/cerc-ipld-eth-beacon-indexer/build.sh similarity index 100% rename from container-build/vulcanize-ipld-eth-beacon-indexer/build.sh rename to container-build/cerc-ipld-eth-beacon-indexer/build.sh diff --git a/container-build/vulcanize-ipld-eth-db/build.sh b/container-build/cerc-ipld-eth-db/build.sh similarity index 100% rename from container-build/vulcanize-ipld-eth-db/build.sh rename to container-build/cerc-ipld-eth-db/build.sh diff --git a/container-build/vulcanize-ipld-eth-server/build.sh b/container-build/cerc-ipld-eth-server/build.sh similarity index 100% rename from container-build/vulcanize-ipld-eth-server/build.sh rename to container-build/cerc-ipld-eth-server/build.sh diff --git a/container-build/vulcanize-lighthouse/Dockerfile b/container-build/cerc-lighthouse/Dockerfile similarity index 100% rename from container-build/vulcanize-lighthouse/Dockerfile rename to container-build/cerc-lighthouse/Dockerfile diff --git a/container-build/vulcanize-lighthouse/build.sh b/container-build/cerc-lighthouse/build.sh similarity index 100% rename from container-build/vulcanize-lighthouse/build.sh rename to container-build/cerc-lighthouse/build.sh diff --git a/container-build/vulcanize-lighthouse/start-lighthouse.sh b/container-build/cerc-lighthouse/start-lighthouse.sh similarity index 100% rename from container-build/vulcanize-lighthouse/start-lighthouse.sh rename to container-build/cerc-lighthouse/start-lighthouse.sh diff --git a/container-build/vulcanize-test-contract/build.sh b/container-build/cerc-test-contract/build.sh similarity index 100% rename from container-build/vulcanize-test-contract/build.sh rename to container-build/cerc-test-contract/build.sh From b0fc8da64d79c908f8d080ff58d71f452d661f4e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 24 Aug 2022 12:53:51 -0600 Subject: [PATCH 0040/1010] Finish converstion to click --- app/build_containers.py | 14 ++------------ app/deploy_system.py | 42 ++++++++++++++--------------------------- 2 files changed, 16 insertions(+), 40 deletions(-) diff --git a/app/build_containers.py b/app/build_containers.py index b0bb229f..fe6aa95b 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -27,20 +27,13 @@ from decouple import config import subprocess import click -#parser = argparse.ArgumentParser( -# description="build the set of containers required for a complete stack", +# TODO: find a place for this # epilog="Config provided either in .env or settings.ini or env vars: CERC_REPO_BASE_DIR (defaults to ~/cerc)" -# ) -#parser.add_argument("--verbose", action="store_true", help="increase output verbosity") -#parser.add_argument("--quiet", action="store_true", help="don\'t print informational output") -#parser.add_argument("--check-only", action="store_true", help="looks at what\'s already there and checks if it looks good") -#parser.add_argument("--dry-run", action="store_true", help="don\'t do anything, just print the commands that would be executed") - -#args = parser.parse_args() @click.command() @click.pass_context def command(ctx): + '''build the set of containers required for a complete stack''' quiet = ctx.obj.quiet verbose = ctx.obj.verbose @@ -77,6 +70,3 @@ def command(ctx): for container in containers: process_container(container) - - - diff --git a/app/deploy_system.py b/app/deploy_system.py index 606280d4..b45905d2 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -21,38 +21,25 @@ from decouple import config from python_on_whales import DockerClient import click -def include_exclude_check(s, args): - if args.include == None and args.exclude == None: +def include_exclude_check(s, include, exclude): + if include == None and exclude == None: return True - if args.include != None: - include_list = args.include.split(",") + if include != None: + include_list = include.split(",") return s in include_list - if args.exclude != None: - exclude_list = args.exclude.split(",") + if exclude != None: + exclude_list = exclude.split(",") return s not in exclude_list -#parser = argparse.ArgumentParser( -# description="deploy the complete stack" -# ) -#parser.add_argument("command", type=str, nargs=1, choices=['up', 'down', 'ps'], help="command: up|down|ps") -#parser.add_argument("--verbose", action="store_true", help="increase output verbosity") -#parser.add_argument("--quiet", action="store_true", help="don\'t print informational output") -#parser.add_argument("--check-only", action="store_true", help="looks at what\'s already there and checks if it looks good") -#parser.add_argument("--dry-run", action="store_true", help="don\'t do anything, just print the commands that would be executed") -#group = parser.add_mutually_exclusive_group() -#group.add_argument("--exclude", type=str, help="don\'t start these components") -#group.add_argument("--include", type=str, help="only start these components") - -#args = parser.parse_args() - -#verbose = args.verbose -#quiet = args.quiet - -#print("Yo2!") - @click.command() +@click.option('--include', help="only start these components") +@click.option('--exclude', help="don\'t start these components") +@click.argument('command' help="command: up|down|ps") @click.pass_context -def command(ctx): +def command(ctx, include, exclude, command): + '''deploy a stack''' + + # TODO: implement option exclusion and command value constraint lost with the move from argparse to click quiet = ctx.obj.quiet verbose = ctx.obj.verbose @@ -68,7 +55,7 @@ def command(ctx): compose_files = [] for cluster in clusters: - if include_exclude_check(cluster, args): + if include_exclude_check(cluster, include, exclude): compose_file_name = os.path.join("compose", f"docker-compose-{cluster}.yml") compose_files.append(compose_file_name) else: @@ -81,7 +68,6 @@ def command(ctx): # See: https://gabrieldemarmiesse.github.io/python-on-whales/sub-commands/compose/ docker = DockerClient(compose_files=compose_files) - command = "hack" if not dry_run: if command == "up": if verbose: From 5890b3f06af75923efb8d9ffad6c34ecc09c41e4 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 24 Aug 2022 13:01:35 -0600 Subject: [PATCH 0041/1010] Clean up --- app/__pycache__/__init__.cpython-38.pyc | Bin 156 -> 0 bytes app/__pycache__/__init__.cpython-39.pyc | Bin 156 -> 0 bytes app/__pycache__/build_containers.cpython-38.pyc | Bin 1430 -> 0 bytes app/__pycache__/build_containers.cpython-39.pyc | Bin 2019 -> 0 bytes app/__pycache__/deploy_system.cpython-38.pyc | Bin 1396 -> 0 bytes app/__pycache__/deploy_system.cpython-39.pyc | Bin 2143 -> 0 bytes .../setup_repositories.cpython-38.pyc | Bin 2908 -> 0 bytes .../setup_repositories.cpython-39.pyc | Bin 3413 -> 0 bytes app/deploy_system.py | 2 +- app/setup_repositories.py | 8 ++++---- cli.py | 6 +++--- 11 files changed, 8 insertions(+), 8 deletions(-) delete mode 100644 app/__pycache__/__init__.cpython-38.pyc delete mode 100644 app/__pycache__/__init__.cpython-39.pyc delete mode 100644 app/__pycache__/build_containers.cpython-38.pyc delete mode 100644 app/__pycache__/build_containers.cpython-39.pyc delete mode 100644 app/__pycache__/deploy_system.cpython-38.pyc delete mode 100644 app/__pycache__/deploy_system.cpython-39.pyc delete mode 100644 app/__pycache__/setup_repositories.cpython-38.pyc delete mode 100644 app/__pycache__/setup_repositories.cpython-39.pyc diff --git a/app/__pycache__/__init__.cpython-38.pyc b/app/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 42da53cc51514f858c06c228f7ea339563e13285..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmWIL<>g`kg5t+4$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6vJKO;XkRX-)M zEHg#FpeR2pHMyi%zpOMTIWaG@DpkL@Br!Q#H@_%3Bel4sD6u5JNI$WlKtDb{GcU6w ZK3=b&@)n0pZhlH>PO2Tq=+8jR000|bCNuy5 diff --git a/app/__pycache__/__init__.cpython-39.pyc b/app/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 00879fd41006b78d25492d2a0250fb9cf4c0adc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmYe~<>g`kg5t+4$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6vJKO;XkRX-)M zEHg#FpeR2pHMyi%zpOMTIWaG@DpkL@Br!Q#H@_%3Bel4sD6u5JNI$WlKtDb{GcU6w ZK3=b&@)n0pZhlH>PO2Tq=+8jR001JdCO`lH diff --git a/app/__pycache__/build_containers.cpython-38.pyc b/app/__pycache__/build_containers.cpython-38.pyc deleted file mode 100644 index 0a58c334d39649cd122c7028c5ace90300cf20a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1430 zcmZWp&2J+$6t_K}nI_%c><8sTC_+dmXq%k4psK*OJ?y1G3IdIUMw7AIOm;FeYdcXo zO1QLAQ;8LK&`JrnmH3N%<+T4oPdq#QV1-A1_WSVj@BREVKQ&xuMJ4rME)N9s1Ow_BlGkXE^jI zK0z5YF(uS` zMOOF{Er{5a9<>+fPxP9cVT??azd$Q2df;)4tw!B5{CjhbXLuQ`&~jsi=Hw^z1^OQK z(9dXL@pFjvX5=Qz1-if&7+CR=Qp3i-5^a2CrnKdH8WHW{ZmHKq;p6SJs@siN+nZhPKVaDtI}%^4?q1>T z$~Q_!3@ZO9;b|##=mF;if7%i^hRt_rd#iiv2d>L+6Xl2j%Q9uLd{S-nn1F{c^tS`$ zlswI)B85p(^uJ60WB|7D)dTa6XHnf1> z3sM1_mT-D380SP=_3uYHseo=*c2Tli+0fn;I4!eOX3*TC?Iuq6F$=711%nF@gWH1U4w3eB0dIzY#+l11woOd4!Zz9G5h8{AM;NkqFr0Vz7Kol z$NZ#>xnRntEGfoi#@6tg+Uq1)n!GTlRK1LaFm$r1T;nicj4)vQol!x@8QXmi&I+C0 NV8MU_`wbTe{})e%hSmT8 diff --git a/app/__pycache__/build_containers.cpython-39.pyc b/app/__pycache__/build_containers.cpython-39.pyc deleted file mode 100644 index 5e544127cf7bf8921bd8c7d3b7c19c3e570c7ff8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2019 zcmZWq&5zSY6rUM?#G8-Z1xgDlYNuQvh$OAl3uuMP$4ccw(Nd`*QWbeUlf+raV`j!- zV`Y0;B$i4`Z#}f4+VsY~e@hR(_Qb!yq3WASHc(;9FMc0>^XB({ZxS{dRRq_szj@K$ zHH7{#%KMiG$~W++KR__VaDuvvU);r3CtU)+Byq-W*ToB;*Y&K=@A{mKD$HRn^NvY3 z;K68(`K-bMws!1bWc4cOwfFQo=#BUEbz<8fu5Fjzbd{ zCd(v6z150_JlboCG?^AR5+U{!4K;l_4D}UwOJGShH5f`x!<11Qt!Uh*v8Idgfe_48 z&E&Kt^R&3VSd|I*V5)}z(seq@)oC539{~3lvH={h4t*+e=+iEze4j_T<}5O;JiT0a z3E*+yQGbEZXoO!7kmLo{&d5FSw9haj%sD1={KEK&`dU|*dxU;RugD?B$i@XnXpYsl z;PI>t$asi-lxIIAM&U2XfXm8~B1PjKpU@p4pkqL$ z;+j#VQ5o(ubVaIv_sB6uqvhXdY9z~9#Ux~K!8m(;&WBMc~> zUIx|*Jm=t1FF_n(bymZy&)$KDN94p|1YmN_G|vh1=FR~IFt#Ale+Py(k=_gg%)8*R zFtOm31w#8L6}C1v&46=2{j95_+6=QQs~w>jv-+`f08M3$899a40=NF4sNOMy3>ySE zHr{Q~j`v&Kd5c>`V3oES7QrJsQ6_X-N+GY)#fX7n{r|wdF)(~D4Yy!~JO#6pln%^s zQQP4Prqwo}SuZ_1KqV2XbhA(oOLrvVw5&*;C1J#2a!nsp>8L40fTBw`lmi7lmD3)K z1PpS%3uj5h6-0rd>6B}$jdai3;(Load;K`!X*lNH`ob)2Ew7!j!T6+Sn9#FDcy`9i z%JQ&yjo#kx48@ptSO{lU2bLQFT~ue1CsCNj1@G9ittBMPu+lOFDs{pv>nxU8m806( zv^=w{wzo2G8Gd{W0$~@g;|o^S@g}ZfpL|4$%gdQ=ZzUoM6LqWoL5gNwegfai&yD!Z zh)pBTfGDecKZ6q?S6oVBtQ*Ga#R^zox+3Fg>6)_$pv;n3Cvb|ZrrSNYs;_6bZo%tT zS4Jf-n_Qn7L5;X%#1|mS%Cg=jD9V@-@$F80yiV#kAXR*gz)s2LMu6p2@HZQade6gq z89;+GIPQ5FFdm5<{yi3TUo>7XO5$j*T)!;``Ix8rp^22GZ@-XbJ!Gs039PTITC363 u0w1&3qFlOqvo!}>W5M!--!d>N;|#F5pRi!4Kw&5%bCxVi3Q1qi zhP3pu2Hmm*0qm{)XZiw(`=$0YZNp z<0>!%##~5@{kcAUF*kDdU7jEp@IWD}|W0bkCQS5VX6KoOp@*eY; z{~F!k8yp7=KSiV9AFzwgM_7AlRldkBVHQ2A(m5ArMaD~&5<}>k@y3CE23kQE;2Qu8cR(RaVg`d<4lW8syOP1R{H}96W|Yz$Fpj|$1J(Z*tix| z&Qm4FSIZ(z%52TYQYGp9q!Q_jOC=IjiE&cbW5(;ET219jD!w?aSNhKFQMZS{hID?< z#A65o;Ui3Oh$9?WDI&m9Y*xC~hp`9Uh7iF@gL0JP7Tb}SAc0O=M>!1A^xI)e8@i!e zv~jnnb$>?p(T`|?o|{n0*r{?0rMO07E^=9W5FBT_E@hC8%KU@ zLKZ^8{{rrx!0j6!nqIz_@3V*v-hftq37kFPd<4$Fz}dg$Y=&F-d7J9t`FaSMg$Roi zlfYATt=30pJLEX67IjrZAwRWR^rX{I*7S6>DAxTSY>i~)<-_B({~{|m z?1G9ObiApBVmgClYqG4@hm&Pl0)2Ok5okk$I3Y-b znm+7CYhx6O&%uBW;JVg{fG`D&r`579xG?WaJgir0R+UruUd<9nn+=0@(;`dfyPz3g sbW|r&PT{3e{91kDt@Ycutb=bB63lDtz4}(r_>Hq)$ diff --git a/app/__pycache__/deploy_system.cpython-39.pyc b/app/__pycache__/deploy_system.cpython-39.pyc deleted file mode 100644 index 82705c0df61e1e343be1f604c42d9f7d85c30edf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2143 zcmZuy&5zqe6!+MU<9zLAKU#L%1>6IwQf-=o1QIKRC@np%5ERi`LXqp4O`JF$cV@h8 zEH9Vsbw%%0r3CfD|HH{wxb)7c7kF>tpcTT&JkNXcKIXld-*eFEG!1xuc;tj{+J^B5 zGMAq^Fkiute*vKeC9&bJ-oz)so3S~we2bvWitSm=ujx679p9lgt-Ub(IwKR8I<$U4 z{03`Gn$%@2+87zM`75C<+P(lAE$`3`x=Fhi;7{{gz;9pTcYxo$#9sma>Y87)mxkYA z9q|7i_}`=Z+7I&AfWKbxjl~A&ZL-Zt*Y5(|^0(MFJvb*2(^>2+4f;NHUl`}a-=XAt zqxZpE$lN&Yk;!H|!D6l4OmnVMn`W>7Jl zq2EewiO+DhFsZpDXJ%m(=Bc4qQP&a=(W+XtVAVPWTM8OI>-gb2a@e!VdX$85Mp;>B z&sUS0OyfxP?2^dR4#Y_M?Mi1DM^gFiN>Ova83M1sy9a|YpRoZAP9r)<1)s1`$-!wB zhd~nMY#>z-PWxPhVXaO$U^vF`p0RTq-uZozBZE>rm?;U=U9CupV6?2H7Px zX_7W^H5G8{jC_CP##3YFg?yIAOfgSKgle}alc9)G74f93!}2Uh=vxAIkiD6urA_&> zq%>2R?^dfvUYex^ii=c2A#62ISy@Z47~o>eqmV&u#w`@_uT}7oF4CZPaC8I-clF9Wxs*+;OBsj)kJd3IKgn8^a3p2&Ex9YU=gOxX^y->Ih z$R7`cCvekc&lEe5@hWZDLUq*nbxa4(>wj!=`!WCIMhIsAKG;-T7#bul9HfHAa!!6Z zI5P@kL6!iArEx}ngo|#&?;P4e(*4+wx9%83{~iNXmUy6SY8K>`@!CZAjtl@0xo`aR z^_it=g{7QxQ~a#z6L-;|7PSlOl|gH-t)+Qp7v`c_*h{c_daPRV7(6++zVZYzOS}PD zy)f4@)hj@1YrLOR=4){w0H7@N5 zj}kys3NC0_(@+xFL&XLv*5RHH;hu|q6yZ+wR(f@RtE!Z4V>%t*twd5>14X}Hv7m}~ zSTe0OOoADMuahpD4x&5YinK5Q2L2R=yaU9rn&g&glMUO}J?koI1J^}~)ij$RbD^WT zqznBF-@RRN1FT9HnoSxAXe%ydA1aoyYzLGM!LME`Eoj8$0g7gs%7Qqa4>gQsbjpS!0U^uU>ebZtXeo91 z#fPvF@evXa2_}502>3w|Sc%g8V#a9}voE)SlZQYs-8Qyw({0+s{M)hiAobM`i_kS) J(;<$g{{RPmRf_-s diff --git a/app/__pycache__/setup_repositories.cpython-38.pyc b/app/__pycache__/setup_repositories.cpython-38.pyc deleted file mode 100644 index 37c8fa4fd023ac3bf9f69e94fd562465a240f3ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2908 zcmY*b&5qp05$-0NKg;=%yjly9<2Zy7$C^aDgCs}}f?x=-Y$J#;c2;ui5C{k^yJwfP z9FpqpS?m%sx$FWv0wP3*+zbOVx#^N;$RQ7qTMS-vQXU`&U!1C*S!+y!&FbpvVpr8y zRs6Km2?$*O9=qv(uMzSeoNQh$Ozy*@p2NTir#XpMZyHfEw;~JPR&I}3#OP|xi5%eB zxjS|vcg^!6?<2w)cPmMe^bxud?5Q5;@BkPh3DW}}J@FSah z+~Mv8jo2k&ByvEz-?To;^e3`BltQVLZs)P@*kV3Ag>so|4$+ z1XQs>Lx26aXGd&OWV&$@m1bEK;3QUQl8YW|95tzgZ2UORkR3}@-mvN*k!Y3@`S1m8 zw&FO=6Q$z#1^N27{iAX$`aC(wc)yb6NTgczPbPVq6j?3$N+;>@ZYk3vp|nhNDf>xP z^_9?*Dwd)uRR+9FsJ-e;`tZ3o(H;f^p#iOTHq76JUS z$?2N(#t@I>P{X6ipagXJRmUK$W#A-0Z}oc zPnmgJPo4GK(qQYt(XL4!`aEt0EntHrNuZL%5og4aw1a^`42w$eZ2qi$B%3GPyJNLRQ?dWRd*hU zlW@N*b(pEUVf_=FN}NKZA>B)P7V=W4;$0nz(@g0*VJbzUv*NJ6@$HGuc5_(T)2F)j z3>xl+-vJ~B2^0ASJnA-7Hx6J#=gi=}0N5=lw{MY|r2(J|dk)FHv}U%Mv8lbJGX|mH zQzjpBrk#b0ype|*3X3~42iy(3F9q*u21RIp0npvUfSCdEU9@TR|N6)oz#-0Ok6I*|S=>+SGdunpc%WA+ky(v4=El zRAxovWC~C!ZvjWX0YlVTxgcJ-pm8b*T1{1HY)FZQ0faTSgK?>aYFubehoFby8BH0D z0`ut@6Q}1j46Tk{AHp)$Er@_AT``uo$j8M2)b{9>5g2Bd2gcrK;PJ}!t)w(&EstS6` z6k3+~>_d=Mzk&fB4 zkCS5o5raUKl>omZe4D_;HqQ#7z~y$TPh}sspw-dNE8N9cV`B7jfBf zQpO|R+6X+QdK(7fVXOA79m}O%3ti&VzzXP1FurTueA}n;9!T}ND|324H$I%cN~D6) z$p!o*KxH*%t?-8Zrg73dOOK=Oz5&!HYv3Cs8Ppl20JBPGWzn=N{ISC1!uY@H?S?Yv e_V2C!5Z*I|5+QAl4Kaj9569mQ{I&}e8t{L8c>?PI diff --git a/app/__pycache__/setup_repositories.cpython-39.pyc b/app/__pycache__/setup_repositories.cpython-39.pyc deleted file mode 100644 index f21b25d80e27a3db2aab9e43bbe028e365d3be3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3413 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 C*{f&( diff --git a/app/deploy_system.py b/app/deploy_system.py index b45905d2..020fb671 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -34,7 +34,7 @@ def include_exclude_check(s, include, exclude): @click.command() @click.option('--include', help="only start these components") @click.option('--exclude', help="don\'t start these components") -@click.argument('command' help="command: up|down|ps") +@click.argument('command') # help: command: up|down|ps @click.pass_context def command(ctx, include, exclude, command): '''deploy a stack''' diff --git a/app/setup_repositories.py b/app/setup_repositories.py index 9eb2ab69..a93a3e2a 100644 --- a/app/setup_repositories.py +++ b/app/setup_repositories.py @@ -47,19 +47,19 @@ def is_git_repo(path): # ) @click.command() -@click.option('--check-only', default=False) -@click.option('--pull', default=False) +@click.option('--check-only', is_flag=True, default=False) +@click.option('--pull', is_flag=True, default=False) @click.pass_context def command(ctx, check_only, pull): '''git clone the set of repositories required to build the complete system from source''' quiet = ctx.obj.quiet verbose = ctx.obj.verbose - dry_run = ctx.obj.verbose + dry_run = ctx.obj.dry_run dev_root_path = os.path.expanduser(config("DEV_ROOT", default="~/cerc")) - if not args.quiet: + if not quiet: print(f'Dev Root is: {dev_root_path}') if not os.path.isdir(dev_root_path): diff --git a/cli.py b/cli.py index dda2b4a5..057ce1a3 100644 --- a/cli.py +++ b/cli.py @@ -28,9 +28,9 @@ class Options(object): self.dry_run = dry_run @click.group(context_settings=CONTEXT_SETTINGS) -@click.option('--quiet', default=False) -@click.option('--verbose', default=False) -@click.option('--dry-run', default=False) +@click.option('--quiet', is_flag=True, default=False) +@click.option('--verbose', is_flag=True, default=False) +@click.option('--dry-run', is_flag=True, default=False) # See: https://click.palletsprojects.com/en/8.1.x/complex/#building-a-git-clone @click.pass_context def cli(ctx, quiet, verbose, dry_run): From 7efd8be95d2b7b00d0f9784b0f67cf0aee5bd907 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 24 Aug 2022 13:03:22 -0600 Subject: [PATCH 0042/1010] Unbrand repo names --- repository-list.txt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/repository-list.txt b/repository-list.txt index 7f5bad0b..f37ba485 100644 --- a/repository-list.txt +++ b/repository-list.txt @@ -1,8 +1,8 @@ -cerc/ops -cerc/ipld-eth-db -cerc/go-ethereum -cerc/ipld-eth-server -cerc/eth-statediff-fill-service -cerc/ipld-eth-db-validator -cerc/ipld-eth-beacon-indexer -cerc/ipld-eth-beacon-db +vulcanize/ops +vulcanize/ipld-eth-db +vulcanize/go-ethereum +vulcanize/ipld-eth-server +vulcanize/eth-statediff-fill-service +vulcanize/ipld-eth-db-validator +vulcanize/ipld-eth-beacon-indexer +vulcanize/ipld-eth-beacon-db From 818957d24439144601561dc94f2e1a9fee15b57a Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 24 Aug 2022 13:53:48 -0600 Subject: [PATCH 0043/1010] Fixes --- app/build_containers.py | 4 +++- app/deploy_system.py | 10 +++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/build_containers.py b/app/build_containers.py index fe6aa95b..51c43615 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -37,7 +37,7 @@ def command(ctx): quiet = ctx.obj.quiet verbose = ctx.obj.verbose - dry_run = ctx.obj.verbose + dry_run = ctx.obj.dry_run dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) @@ -67,6 +67,8 @@ def command(ctx): build_result = subprocess.run(build_script_filename, shell=True, env={'CERC_REPO_BASE_DIR':dev_root_path}) # TODO: check result in build_result.returncode print(f"Result is: {build_result}") + else: + print("Skipped") for container in containers: process_container(container) diff --git a/app/deploy_system.py b/app/deploy_system.py index 020fb671..5b8f424b 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -43,7 +43,7 @@ def command(ctx, include, exclude, command): quiet = ctx.obj.quiet verbose = ctx.obj.verbose - dry_run = ctx.obj.verbose + dry_run = ctx.obj.dry_run with open("cluster-list.txt") as cluster_list_file: clusters = cluster_list_file.read().splitlines() @@ -77,3 +77,11 @@ def command(ctx, include, exclude, command): if verbose: print("Running compose down") docker.compose.down() + elif command == "ps": + if verbose: + print("Running compose ps") + docker.compose.ps() + elif command == "logs": + if verbose: + print("Running compose logs") + docker.compose.logs() From d9142e2bc95ac18a9c54faaaae5cda3b622d32a1 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 24 Aug 2022 14:31:44 -0600 Subject: [PATCH 0044/1010] Change command name, add doc --- README.md | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- setup.py | 2 +- 2 files changed, 98 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 506bb9ef..dcd9e1b1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,99 @@ -# orchestrator-play +# Stack Orchestrator + +Stack Orchestrator allows building and deployment of a Laconic stack on a single machine. + +## Setup +### Developer Mode +Developer mode runs the orchestrator from a cloned git repository. +#### Prerequisites +1. Python3 +1. Docker +#### Install +1. Clone this repository: + ``` + $ git clone (https://github.com/cerc-io/stack-orchestrator.git + ``` +1. Enter the project directory: + ``` + $ cd stack-orchestrator + ``` +1. Create and activate a venv: + ``` + $ python3 -m venv venv + $ source ./venv/bin/activate + (venv) $ + ``` +1. Install the cli in edit mode: + ``` + $ pip install --editable . + ``` +1. Verify installation: + ``` + (venv) $ laconic-so + Usage: laconic-so [OPTIONS] COMMAND [ARGS]... + + Laconic Stack Orchestrator + + Options: + --quiet + --verbose + --dry-run + -h, --help Show this message and exit. + + Commands: + build-containers build the set of containers required for a complete... + deploy-system deploy a stack + setup-repositories git clone the set of repositories required to build... + ``` +### CI Mode +_write-me_ + +## Usage +There are three sub-commands: `setup-repositories`, `build-containers` and `deploy-system` that are generally run in order: +### Setup Repositories +Clones the set of git repositories necessary to build a system. +``` +$ laconic-so --verbose setup-repositories +``` +### Build Containers +Builds the set of docker container images required to run a system. +``` +$ laconic-so --verbose build-containers +``` +### Deploy System +Uses `docker compose` to deploy a system. +``` +$ laconic-so --verbose deploy-system --include db-sharding,contract,ipld-eth-server,go-ethereum-foundry up +``` +## Implementation ``` -$ python deploy-system.py --verbose --include db-sharding,contract,ipld-eth-server,go-ethereum-foundry up -``` \ No newline at end of file +├── cluster-list.txt +├── compose +│   ├── docker-compose-contract.yml +│   ├── docker-compose-db-sharding.yml +│   ├── docker-compose-db.yml +│   ├── docker-compose-eth-statediff-fill-service.yml +│   ├── docker-compose-go-ethereum-foundry.yml +│   ├── docker-compose-ipld-eth-beacon-db.yml +│   ├── docker-compose-ipld-eth-beacon-indexer.yml +│   ├── docker-compose-ipld-eth-server.yml +│   ├── docker-compose-lighthouse.yml +│   └── docker-compose-prometheus-grafana.yml +├── config +│   └── ipld-eth-server +├── container-build +│   ├── cerc-eth-statediff-fill-service +│   ├── cerc-go-ethereum +│   ├── cerc-go-ethereum-foundry +│   ├── cerc-ipld-eth-beacon-db +│   ├── cerc-ipld-eth-beacon-indexer +│   ├── cerc-ipld-eth-db +│   ├── cerc-ipld-eth-server +│   ├── cerc-lighthouse +│   └── cerc-test-contract +├── container-image-list.txt +├── repository-list.txt +``` + +_write-more-of-me_ diff --git a/setup.py b/setup.py index 429e9a47..1a08ad0f 100644 --- a/setup.py +++ b/setup.py @@ -23,6 +23,6 @@ setup( "Operating System :: OS Independent", ], entry_points = { - 'console_scripts': ['laconic-stack-orchestrator=cli:cli'], + 'console_scripts': ['laconic-so=cli:cli'], } ) From c13faa96309b1709f8cafba3bdb21492114df473 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 24 Aug 2022 14:48:55 -0600 Subject: [PATCH 0045/1010] More doc --- README.md | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index dcd9e1b1..426b04c7 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,25 @@ # Stack Orchestrator -Stack Orchestrator allows building and deployment of a Laconic stack on a single machine. +Stack Orchestrator allows building and deployment of a Laconic stack on a single machine with minimial prerequisites. ## Setup ### Developer Mode Developer mode runs the orchestrator from a cloned git repository. #### Prerequisites -1. Python3 -1. Docker +Stack Orchestrator is a Python3 CLI tool that runs on any OS with Python3 and Docker. Tested on: Ubuntu 20/22. + +Ensure that the following are already installed: + +1. Python3 (the version 3.8 available in Ubuntu 20/22 works) + ``` + $ python3 --version + Python 3.8.10 + ``` +1. Docker (Install a current version from dockerco, don't use the version from any Linux distro) + ``` + $ docker --version + Docker version 20.10.17, build 100c701 + ``` #### Install 1. Clone this repository: ``` @@ -52,21 +64,31 @@ _write-me_ There are three sub-commands: `setup-repositories`, `build-containers` and `deploy-system` that are generally run in order: ### Setup Repositories Clones the set of git repositories necessary to build a system. + +Note: the use of `ssh-agent` is recommended in order to avoid entering your ssh key passphrase for each repository. ``` $ laconic-so --verbose setup-repositories ``` ### Build Containers -Builds the set of docker container images required to run a system. +Builds the set of docker container images required to run a system. It takes around 10 minutes to build all the containers from cold. ``` $ laconic-so --verbose build-containers ``` ### Deploy System Uses `docker compose` to deploy a system. + +Use `---include ` to deploy a subset of all containers: ``` $ laconic-so --verbose deploy-system --include db-sharding,contract,ipld-eth-server,go-ethereum-foundry up ``` +``` +$ laconic-so --verbose deploy-system --include db-sharding,contract,ipld-eth-server,go-ethereum-foundry down +``` ## Implementation - +The orchestrator's operation is driven by files shown below. `repository-list.txt` container the list of git repositories; `container-image-list.txt` contains +the list of container image names, while `clister-list.txt` specifies the set of compose components (corresponding to individual docker-compose-xxx.yml files which may in turn specify more than one container). +Files required to build each container image are stored under `./container-build/` +Files required at deploy-time are stored under `./config/` ``` ├── cluster-list.txt ├── compose From 2e0b9f35fa97a71579aeff31fa9cb61e7ccf048e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 24 Aug 2022 21:42:36 -0600 Subject: [PATCH 0046/1010] Unbrand image name --- compose/docker-compose-ipld-eth-server.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compose/docker-compose-ipld-eth-server.yml b/compose/docker-compose-ipld-eth-server.yml index 785d2d31..35f6685a 100644 --- a/compose/docker-compose-ipld-eth-server.yml +++ b/compose/docker-compose-ipld-eth-server.yml @@ -36,7 +36,7 @@ services: depends_on: ipld-eth-db: condition: service_healthy - image: cerc/postgraphile:v1.0.1 + image: vulcanize/postgraphile:v1.0.1 environment: PG_HOST: ipld-eth-db PG_PORT: 5432 From f71d7d52ec4672505ade14749684ab350fb524c9 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sat, 17 Sep 2022 09:17:34 -0600 Subject: [PATCH 0047/1010] Change names of repos that moved org --- repository-list.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/repository-list.txt b/repository-list.txt index f37ba485..921981f9 100644 --- a/repository-list.txt +++ b/repository-list.txt @@ -1,7 +1,7 @@ vulcanize/ops -vulcanize/ipld-eth-db -vulcanize/go-ethereum -vulcanize/ipld-eth-server +cerc-io/ipld-eth-db +cerc-io/go-ethereum +cerc-io/ipld-eth-server vulcanize/eth-statediff-fill-service vulcanize/ipld-eth-db-validator vulcanize/ipld-eth-beacon-indexer From debbc5295b16030cec2b961df7bc6fd8e5b722cc Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 18 Sep 2022 23:00:02 -0600 Subject: [PATCH 0048/1010] Add capability to override the default branch in a repo --- app/setup_repositories.py | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/app/setup_repositories.py b/app/setup_repositories.py index a93a3e2a..8a4b1217 100644 --- a/app/setup_repositories.py +++ b/app/setup_repositories.py @@ -49,14 +49,23 @@ def is_git_repo(path): @click.command() @click.option('--check-only', is_flag=True, default=False) @click.option('--pull', is_flag=True, default=False) +@click.option('--branches-file', help="checkout branches specified in this file") @click.pass_context -def command(ctx, check_only, pull): +def command(ctx, check_only, pull, branches_file): '''git clone the set of repositories required to build the complete system from source''' quiet = ctx.obj.quiet verbose = ctx.obj.verbose dry_run = ctx.obj.dry_run + if branches_file: + if verbose: + print(f"loading branches from: {branches_file}") + with open(branches_file) as branches_file_open: + branches = branches_file_open.read().splitlines() + if verbose: + print(f"Branches are: {branches}") + dev_root_path = os.path.expanduser(config("DEV_ROOT", default="~/cerc")) if not quiet: @@ -91,8 +100,8 @@ def command(ctx, check_only, pull): if verbose: print(f'Running git pull for {full_filesystem_repo_path}') if not check_only: - repo = git.Repo(full_filesystem_repo_path) - origin = repo.remotes.origin + git_repo = git.Repo(full_filesystem_repo_path) + origin = git_repo.remotes.origin origin.pull(progress = None if quiet else GitProgress()) else: print("(git pull skipped)") @@ -105,6 +114,19 @@ def command(ctx, check_only, pull): progress = None if quiet else GitProgress()) else: print("(git clone skipped)") + # Checkout the requested branch, if one was specified + if branches: + # Find the current repo in the branches list + for repo_branch in branches: + repo_branch_tuple = repo_branch.split(" ") + if repo_branch_tuple[0] == repo: + # checkout specified branch + branch_to_checkout = repo_branch_tuple[1] + if verbose: + print(f"checking out branch {branch_to_checkout} in repo {repo}") + git_repo = git.Repo(full_filesystem_repo_path) + git_repo.git.checkout(branch_to_checkout) + for repo in repos: From 1d7c57bde136be9cd559e4663d1fcdae3c62111a Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 18 Sep 2022 23:28:34 -0600 Subject: [PATCH 0049/1010] First pass at adding laconicd support --- cluster-list.txt | 1 + compose/docker-compose-laconicd.yml | 6 ++++++ container-image-list.txt | 1 + repository-list.txt | 1 + 4 files changed, 9 insertions(+) create mode 100644 compose/docker-compose-laconicd.yml diff --git a/cluster-list.txt b/cluster-list.txt index fb08f0a7..a09aa826 100644 --- a/cluster-list.txt +++ b/cluster-list.txt @@ -7,3 +7,4 @@ ipld-eth-beacon-indexer ipld-eth-server lighthouse prometheus-grafana +laconicd diff --git a/compose/docker-compose-laconicd.yml b/compose/docker-compose-laconicd.yml new file mode 100644 index 00000000..d5c95d48 --- /dev/null +++ b/compose/docker-compose-laconicd.yml @@ -0,0 +1,6 @@ +version: "3.2" +services: + laconicd: + restart: unless-stopped + image: cerc/laconicd:local + diff --git a/container-image-list.txt b/container-image-list.txt index 23456a9a..de89408c 100644 --- a/container-image-list.txt +++ b/container-image-list.txt @@ -7,3 +7,4 @@ cerc/ipld-eth-db cerc/ipld-eth-beacon-db cerc/ipld-eth-beacon-indexer cerc/ipld-eth-server +cerc/laconicd diff --git a/repository-list.txt b/repository-list.txt index 921981f9..26f08f1d 100644 --- a/repository-list.txt +++ b/repository-list.txt @@ -6,3 +6,4 @@ vulcanize/eth-statediff-fill-service vulcanize/ipld-eth-db-validator vulcanize/ipld-eth-beacon-indexer vulcanize/ipld-eth-beacon-db +cerc-io/laconicd From fe8bd8e1205e8412c687c768f1d1ddd18c39309e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 21 Sep 2022 20:34:24 -0600 Subject: [PATCH 0050/1010] Add laconic client repo --- repository-list.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/repository-list.txt b/repository-list.txt index 26f08f1d..50fb5e77 100644 --- a/repository-list.txt +++ b/repository-list.txt @@ -7,3 +7,4 @@ vulcanize/ipld-eth-db-validator vulcanize/ipld-eth-beacon-indexer vulcanize/ipld-eth-beacon-db cerc-io/laconicd +cerc-io/laconic-client From 40102a774e0fa2a529ba92621f97a265f6461b27 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 21 Sep 2022 21:35:18 -0600 Subject: [PATCH 0051/1010] Add laconic-client build --- .../cerc-eth-statediff-fill-service/build.sh | 1 + container-build/cerc-go-ethereum/build.sh | 1 + container-build/cerc-ipld-eth-beacon-db/build.sh | 1 + container-build/cerc-ipld-eth-beacon-indexer/build.sh | 1 + container-build/cerc-ipld-eth-db/build.sh | 1 + container-build/cerc-ipld-eth-server/build.sh | 1 + container-build/cerc-laconic-client/Dockerfile | 10 ++++++++++ container-build/cerc-laconic-client/build.sh | 7 +++++++ container-build/cerc-laconicd/build.sh | 3 +++ container-build/cerc-test-contract/build.sh | 1 + container-image-list.txt | 1 + 11 files changed, 28 insertions(+) create mode 100644 container-build/cerc-laconic-client/Dockerfile create mode 100755 container-build/cerc-laconic-client/build.sh create mode 100755 container-build/cerc-laconicd/build.sh diff --git a/container-build/cerc-eth-statediff-fill-service/build.sh b/container-build/cerc-eth-statediff-fill-service/build.sh index a88129c4..2a73352f 100755 --- a/container-build/cerc-eth-statediff-fill-service/build.sh +++ b/container-build/cerc-eth-statediff-fill-service/build.sh @@ -1,2 +1,3 @@ +#!/usr/bin/env bash # Build cerc/eth-statediff-fill-service docker build -t cerc/eth-statediff-fill-service:local ${CERC_REPO_BASE_DIR}/eth-statediff-fill-service diff --git a/container-build/cerc-go-ethereum/build.sh b/container-build/cerc-go-ethereum/build.sh index da59ec34..0ab91354 100755 --- a/container-build/cerc-go-ethereum/build.sh +++ b/container-build/cerc-go-ethereum/build.sh @@ -1,2 +1,3 @@ +#!/usr/bin/env bash # Build cerc/go-ethereum docker build -t cerc/go-ethereum:local ${CERC_REPO_BASE_DIR}/go-ethereum diff --git a/container-build/cerc-ipld-eth-beacon-db/build.sh b/container-build/cerc-ipld-eth-beacon-db/build.sh index b0bc8973..c3c620d2 100755 --- a/container-build/cerc-ipld-eth-beacon-db/build.sh +++ b/container-build/cerc-ipld-eth-beacon-db/build.sh @@ -1,2 +1,3 @@ +#!/usr/bin/env bash # Build cerc/ipld-eth-beacon-db docker build -t cerc/ipld-eth-beacon-db:local ${CERC_REPO_BASE_DIR}/ipld-eth-beacon-db diff --git a/container-build/cerc-ipld-eth-beacon-indexer/build.sh b/container-build/cerc-ipld-eth-beacon-indexer/build.sh index 59395bfc..78a4cd00 100755 --- a/container-build/cerc-ipld-eth-beacon-indexer/build.sh +++ b/container-build/cerc-ipld-eth-beacon-indexer/build.sh @@ -1,2 +1,3 @@ +#!/usr/bin/env bash # Build cerc/ipld-eth-beacon-indexer docker build -t cerc/ipld-eth-beacon-indexer:local ${CERC_REPO_BASE_DIR}/ipld-eth-beacon-indexer diff --git a/container-build/cerc-ipld-eth-db/build.sh b/container-build/cerc-ipld-eth-db/build.sh index e6b164dc..ec5a905e 100755 --- a/container-build/cerc-ipld-eth-db/build.sh +++ b/container-build/cerc-ipld-eth-db/build.sh @@ -1,2 +1,3 @@ +#!/usr/bin/env bash # Build cerc/ipld-eth-db docker build -t cerc/ipld-eth-db:local ${CERC_REPO_BASE_DIR}/ipld-eth-db diff --git a/container-build/cerc-ipld-eth-server/build.sh b/container-build/cerc-ipld-eth-server/build.sh index 41f2b8a2..7e714294 100755 --- a/container-build/cerc-ipld-eth-server/build.sh +++ b/container-build/cerc-ipld-eth-server/build.sh @@ -1,2 +1,3 @@ +#!/usr/bin/env bash # Build cerc/ipld-eth-server docker build -t cerc/ipld-eth-server:local ${CERC_REPO_BASE_DIR}/ipld-eth-server diff --git a/container-build/cerc-laconic-client/Dockerfile b/container-build/cerc-laconic-client/Dockerfile new file mode 100644 index 00000000..b83d034f --- /dev/null +++ b/container-build/cerc-laconic-client/Dockerfile @@ -0,0 +1,10 @@ +FROM node:16.13.1-alpine3.14 + +ARG NPM_AUTH_TOKEN +WORKDIR /app + +COPY . . + +RUN echo //npm.pkg.github.com/:_authToken=$NPM_AUTH_TOKEN > ~/.npmrc + +RUN apk --update --no-cache add git && yarn diff --git a/container-build/cerc-laconic-client/build.sh b/container-build/cerc-laconic-client/build.sh new file mode 100755 index 00000000..aa6a603d --- /dev/null +++ b/container-build/cerc-laconic-client/build.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# Build cerc/laconic-client +set -x +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t cerc/laconic-client:local -f ${SCRIPT_DIR}/Dockerfile --build-arg NPM_AUTH_TOKEN=$(NPM_AUTH_TOKEN) ${CERC_REPO_BASE_DIR}/laconic-client diff --git a/container-build/cerc-laconicd/build.sh b/container-build/cerc-laconicd/build.sh new file mode 100755 index 00000000..f5685097 --- /dev/null +++ b/container-build/cerc-laconicd/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +# Build cerc/chiba-clonk +docker build -t cerc/laconicd:local ${CERC_REPO_BASE_DIR}/laconicd \ No newline at end of file diff --git a/container-build/cerc-test-contract/build.sh b/container-build/cerc-test-contract/build.sh index 1f721658..1b3c925e 100755 --- a/container-build/cerc-test-contract/build.sh +++ b/container-build/cerc-test-contract/build.sh @@ -1,2 +1,3 @@ +#!/usr/bin/env bash # Build cerc/test-contract docker build -t cerc/test-contract:local --build-arg ETH_ADDR=http://go-ethereum:8545 ${CERC_REPO_BASE_DIR}/ipld-eth-db-validator/test/contract diff --git a/container-image-list.txt b/container-image-list.txt index de89408c..7db5b94c 100644 --- a/container-image-list.txt +++ b/container-image-list.txt @@ -8,3 +8,4 @@ cerc/ipld-eth-beacon-db cerc/ipld-eth-beacon-indexer cerc/ipld-eth-server cerc/laconicd +cerc/laconic-client From 8be1d6fad5dd70367b502d0be199a72bbbde9e44 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 21 Sep 2022 21:53:57 -0600 Subject: [PATCH 0052/1010] Remove debug code --- container-build/cerc-laconic-client/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/container-build/cerc-laconic-client/build.sh b/container-build/cerc-laconic-client/build.sh index aa6a603d..d525dd1a 100755 --- a/container-build/cerc-laconic-client/build.sh +++ b/container-build/cerc-laconic-client/build.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # Build cerc/laconic-client -set -x + # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) From 2f94da47d89cb431bad68afe0446f65fb559820f Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 27 Sep 2022 15:40:00 -0600 Subject: [PATCH 0053/1010] Fix package definition, add shiv doc --- README.md | 32 ++++++++++++++++++++++++++++++++ setup.py | 4 ++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 426b04c7..94fd9fc6 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,36 @@ Ensure that the following are already installed: deploy-system deploy a stack setup-repositories git clone the set of repositories required to build... ``` +#### Build a zipapp (single file distributable script) +Use shiv to build a single file Python executable zip archive of laconic-so: +1. Install [shiv](https://github.com/linkedin/shiv): + ``` + $ (venv) pip install shiv + ``` +1. Run shiv to create a zipapp file: + ``` + $ (venv) shiv -c laconic-so -o laconic-so . + ``` + This creates a file `./laconic-so` that is executable outside of any venv, and on other machines and OSes and architectures, and requiring only the system Python3: +1. Verify it works: + ``` + $ cp stack-orchetrator/laconic-so ~/bin + $ laconic-so + Usage: python -m laconic-so [OPTIONS] COMMAND [ARGS]... + + Laconic Stack Orchestrator + + Options: + --quiet + --verbose + --dry-run + -h, --help Show this message and exit. + + Commands: + build-containers build the set of containers required for a complete... + deploy-system deploy a stack + setup-repositories git clone the set of repositories required to build... + ``` ### CI Mode _write-me_ @@ -84,6 +114,8 @@ $ laconic-so --verbose deploy-system --include db-sharding,contract,ipld-eth-ser ``` $ laconic-so --verbose deploy-system --include db-sharding,contract,ipld-eth-server,go-ethereum-foundry down ``` +## Platform Support +Native aarm64 is _not_ currently supported. x64 emulation on ARM64 macos should work (not yet tested). ## Implementation The orchestrator's operation is driven by files shown below. `repository-list.txt` container the list of git repositories; `container-image-list.txt` contains the list of container image names, while `clister-list.txt` specifies the set of compose components (corresponding to individual docker-compose-xxx.yml files which may in turn specify more than one container). diff --git a/setup.py b/setup.py index 1a08ad0f..d302ee4f 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ with open("requirements.txt", "r", encoding="utf-8") as fh: requirements = fh.read() setup( name = 'laconic-stack-orchestrator', - version = '0.0.3', + version = '0.0.5', author = 'Cerc', author_email = 'info@cerc.io', license = 'GNU Affero General Public License', @@ -14,7 +14,7 @@ setup( long_description = long_description, long_description_content_type = "text/markdown", url = 'https://github.com/cerc-io/stack-orchestrator', - py_modules = ['orchestrator', 'app'], + py_modules = ['cli', 'app'], packages = find_packages(), install_requires = [requirements], python_requires='>=3.7', From 1cdb6d661f8b1d009eb7f55dba4256924090079e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 28 Sep 2022 10:07:13 -0600 Subject: [PATCH 0054/1010] Allow selective container build --- app/build_containers.py | 11 +++++++++-- app/util.py | 24 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 app/util.py diff --git a/app/build_containers.py b/app/build_containers.py index 51c43615..25e8f8dc 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -26,13 +26,16 @@ import argparse from decouple import config import subprocess import click +from .util import include_exclude_check # TODO: find a place for this # epilog="Config provided either in .env or settings.ini or env vars: CERC_REPO_BASE_DIR (defaults to ~/cerc)" @click.command() +@click.option('--include', help="only build these containers") +@click.option('--exclude', help="don\'t build these containers") @click.pass_context -def command(ctx): +def command(ctx, include, exclude): '''build the set of containers required for a complete stack''' quiet = ctx.obj.quiet @@ -71,4 +74,8 @@ def command(ctx): print("Skipped") for container in containers: - process_container(container) + if include_exclude_check(container, include, exclude): + process_container(container) + else: + if verbose: + print(f"Excluding: {container}") diff --git a/app/util.py b/app/util.py new file mode 100644 index 00000000..48381bf0 --- /dev/null +++ b/app/util.py @@ -0,0 +1,24 @@ +# Copyright © 2022 Cerc + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +def include_exclude_check(s, include, exclude): + if include == None and exclude == None: + return True + if include != None: + include_list = include.split(",") + return s in include_list + if exclude != None: + exclude_list = exclude.split(",") + return s not in exclude_list From a6ce56264b9e0b4734d9e6931738b60507ef651a Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 28 Sep 2022 10:21:37 -0600 Subject: [PATCH 0055/1010] Fix branch processing when no branches specified --- app/deploy_system.py | 11 +---------- app/setup_repositories.py | 2 ++ 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/app/deploy_system.py b/app/deploy_system.py index 5b8f424b..d779bef9 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -20,16 +20,7 @@ import argparse from decouple import config from python_on_whales import DockerClient import click - -def include_exclude_check(s, include, exclude): - if include == None and exclude == None: - return True - if include != None: - include_list = include.split(",") - return s in include_list - if exclude != None: - exclude_list = exclude.split(",") - return s not in exclude_list +from .util import include_exclude_check @click.command() @click.option('--include', help="only start these components") diff --git a/app/setup_repositories.py b/app/setup_repositories.py index 8a4b1217..f595e7dd 100644 --- a/app/setup_repositories.py +++ b/app/setup_repositories.py @@ -58,6 +58,8 @@ def command(ctx, check_only, pull, branches_file): verbose = ctx.obj.verbose dry_run = ctx.obj.dry_run + branches = [] + if branches_file: if verbose: print(f"loading branches from: {branches_file}") From 7ec8455a76dad67f9e3ade9dac58fe93330c3993 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 28 Sep 2022 11:37:57 -0600 Subject: [PATCH 0056/1010] Update to latest node container image --- container-build/cerc-laconic-client/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/container-build/cerc-laconic-client/Dockerfile b/container-build/cerc-laconic-client/Dockerfile index b83d034f..8fa3be9d 100644 --- a/container-build/cerc-laconic-client/Dockerfile +++ b/container-build/cerc-laconic-client/Dockerfile @@ -1,4 +1,4 @@ -FROM node:16.13.1-alpine3.14 +FROM node:16.17.1-alpine3.16 ARG NPM_AUTH_TOKEN WORKDIR /app From 7a32c701521e1237ae987d3f15a702cb40a531b7 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 28 Sep 2022 20:32:58 -0600 Subject: [PATCH 0057/1010] Fixes for laconic-sdk --- container-build/cerc-laconic-client/Dockerfile | 2 +- container-build/cerc-laconic-client/build.sh | 3 ++- repository-list.txt | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/container-build/cerc-laconic-client/Dockerfile b/container-build/cerc-laconic-client/Dockerfile index 8fa3be9d..08b86fd5 100644 --- a/container-build/cerc-laconic-client/Dockerfile +++ b/container-build/cerc-laconic-client/Dockerfile @@ -7,4 +7,4 @@ COPY . . RUN echo //npm.pkg.github.com/:_authToken=$NPM_AUTH_TOKEN > ~/.npmrc -RUN apk --update --no-cache add git && yarn +RUN apk --update --no-cache add git && yarn && yarn build diff --git a/container-build/cerc-laconic-client/build.sh b/container-build/cerc-laconic-client/build.sh index d525dd1a..97c646fc 100755 --- a/container-build/cerc-laconic-client/build.sh +++ b/container-build/cerc-laconic-client/build.sh @@ -4,4 +4,5 @@ # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/laconic-client:local -f ${SCRIPT_DIR}/Dockerfile --build-arg NPM_AUTH_TOKEN=$(NPM_AUTH_TOKEN) ${CERC_REPO_BASE_DIR}/laconic-client +# TODO: change the repo name to laconic-client, if it becomes re-named (laconic-client currently is just the TS protocol client library, not the CLI tool) +docker build -t cerc/laconic-client:local -f ${SCRIPT_DIR}/Dockerfile --build-arg NPM_AUTH_TOKEN=$(NPM_AUTH_TOKEN) ${CERC_REPO_BASE_DIR}/laconic-sdk diff --git a/repository-list.txt b/repository-list.txt index 50fb5e77..42fcc347 100644 --- a/repository-list.txt +++ b/repository-list.txt @@ -7,4 +7,4 @@ vulcanize/ipld-eth-db-validator vulcanize/ipld-eth-beacon-indexer vulcanize/ipld-eth-beacon-db cerc-io/laconicd -cerc-io/laconic-client +cerc-io/laconic-sdk From 0c41f1bed3fe81ad84da1eaf92d3bafb23b9650d Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 28 Sep 2022 21:00:57 -0600 Subject: [PATCH 0058/1010] Fix entrypoint --- container-build/cerc-laconic-client/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/container-build/cerc-laconic-client/Dockerfile b/container-build/cerc-laconic-client/Dockerfile index 08b86fd5..dab45c26 100644 --- a/container-build/cerc-laconic-client/Dockerfile +++ b/container-build/cerc-laconic-client/Dockerfile @@ -1,3 +1,4 @@ +# TODO: move this into the cerc-io/laconic-sdk (aka client) repo FROM node:16.17.1-alpine3.16 ARG NPM_AUTH_TOKEN @@ -8,3 +9,5 @@ COPY . . RUN echo //npm.pkg.github.com/:_authToken=$NPM_AUTH_TOKEN > ~/.npmrc RUN apk --update --no-cache add git && yarn && yarn build + +ENTRYPOINT ["/app/bin/laconic"] From a8d04943247ca02cd30e1f451235d01100fa10fe Mon Sep 17 00:00:00 2001 From: Michael Shaw Date: Thu, 29 Sep 2022 14:46:21 -0400 Subject: [PATCH 0059/1010] first pass tweaks for local dev prefs and foibles --- .gitignore | 6 ++++++ README.md | 12 +++++++++++- app/build_containers.py | 7 ++++++- compose/docker-compose-go-ethereum-foundry.yml | 2 +- 4 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..6137a646 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.idea +venv +.vscode +laconic-so +laconic_stack_orchestrator.egg-info +__pycache__ \ No newline at end of file diff --git a/README.md b/README.md index 94fd9fc6..69e7e234 100644 --- a/README.md +++ b/README.md @@ -15,11 +15,21 @@ Ensure that the following are already installed: $ python3 --version Python 3.8.10 ``` -1. Docker (Install a current version from dockerco, don't use the version from any Linux distro) +2. Docker (Install a current version from dockerco, don't use the version from any Linux distro) ``` $ docker --version Docker version 20.10.17, build 100c701 ``` +3. If installed from regular package repository, be aware that the compose plugin may need to be installed, as well. + ``` + DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker} + mkdir -p $DOCKER_CONFIG/cli-plugins + curl -SL https://github.com/docker/compose/releases/download/v2.11.2/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose + chmod +x ~/.docker/cli-plugins/docker-compose + + # see https://docs.docker.com/compose/install/linux/#install-the-plugin-manually for further details + # or to install for all users. + ``` #### Install 1. Clone this repository: ``` diff --git a/app/build_containers.py b/app/build_containers.py index 25e8f8dc..8ab3e77f 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -41,8 +41,13 @@ def command(ctx, include, exclude): quiet = ctx.obj.quiet verbose = ctx.obj.verbose dry_run = ctx.obj.dry_run + local_stack = ctx.obj.local_stack - dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) + if local_stack: + dev_root_path = default=os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")]) + print(f'Local stack dev_root_path (CERC_REPO_BASE_DIR) overridden to: {dev_root_path}') + else: + dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) if not quiet: print(f'Dev Root is: {dev_root_path}') diff --git a/compose/docker-compose-go-ethereum-foundry.yml b/compose/docker-compose-go-ethereum-foundry.yml index c4a496b5..20d008f9 100644 --- a/compose/docker-compose-go-ethereum-foundry.yml +++ b/compose/docker-compose-go-ethereum-foundry.yml @@ -18,7 +18,7 @@ services: DB_HOST: ipld-eth-db DB_PORT: 5432 DB_PASSWORD: password - DB_WRITE: true + DB_WRITE: "true" DB_TYPE: postgres DB_DRIVER: sqlx DB_WAIT_FOR_SYNC: "true" From 273a5c9f1de59ec919553ad5961f2fab2bc70567 Mon Sep 17 00:00:00 2001 From: Michael Shaw Date: Thu, 29 Sep 2022 14:51:29 -0400 Subject: [PATCH 0060/1010] adding local_stack option for repository setup --- app/setup_repositories.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/setup_repositories.py b/app/setup_repositories.py index f595e7dd..7861aac8 100644 --- a/app/setup_repositories.py +++ b/app/setup_repositories.py @@ -68,7 +68,13 @@ def command(ctx, check_only, pull, branches_file): if verbose: print(f"Branches are: {branches}") - dev_root_path = os.path.expanduser(config("DEV_ROOT", default="~/cerc")) + local_stack = ctx.obj.local_stack + + if local_stack: + dev_root_path = default=os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")]) + print(f'Local stack dev_root_path (CERC_REPO_BASE_DIR) overridden to: {dev_root_path}') + else: + dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) if not quiet: print(f'Dev Root is: {dev_root_path}') From b1ee021115a563b0c8a54f02bfc065ab59693b7d Mon Sep 17 00:00:00 2001 From: Michael Shaw Date: Thu, 29 Sep 2022 15:05:28 -0400 Subject: [PATCH 0061/1010] incomplete local_stack option --- cli.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/cli.py b/cli.py index 057ce1a3..04cde0ce 100644 --- a/cli.py +++ b/cli.py @@ -22,20 +22,23 @@ from app import deploy_system CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) class Options(object): - def __init__(self, quiet, verbose, dry_run): + def __init__(self, quiet, verbose, dry_run, local_stack): self.quiet = quiet self.verbose = verbose self.dry_run = dry_run + self.local_stack = local_stack @click.group(context_settings=CONTEXT_SETTINGS) @click.option('--quiet', is_flag=True, default=False) @click.option('--verbose', is_flag=True, default=False) @click.option('--dry-run', is_flag=True, default=False) +@click.option('--local_stack', is_flag=True, default=False) + # See: https://click.palletsprojects.com/en/8.1.x/complex/#building-a-git-clone @click.pass_context -def cli(ctx, quiet, verbose, dry_run): +def cli(ctx, quiet, verbose, dry_run, local_stack): """Laconic Stack Orchestrator""" - ctx.obj = Options(quiet, verbose, dry_run) + ctx.obj = Options(quiet, verbose, dry_run, local_stack) cli.add_command(setup_repositories.command,"setup-repositories") cli.add_command(build_containers.command,"build-containers") From 27009ba16f43789bcdc9bb547ade8d0ec7288509 Mon Sep 17 00:00:00 2001 From: Michael Shaw Date: Thu, 29 Sep 2022 15:43:43 -0400 Subject: [PATCH 0062/1010] fixes and inclusion of naive first time setup script --- .gitignore | 3 ++- app/build_containers.py | 2 +- app/setup_repositories.py | 2 +- first_time_setup.sh | 8 ++++++++ 4 files changed, 12 insertions(+), 3 deletions(-) create mode 100755 first_time_setup.sh diff --git a/.gitignore b/.gitignore index 6137a646..33e988a5 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ venv .vscode laconic-so laconic_stack_orchestrator.egg-info -__pycache__ \ No newline at end of file +__pycache__ +*~ \ No newline at end of file diff --git a/app/build_containers.py b/app/build_containers.py index 8ab3e77f..abe909ac 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -44,7 +44,7 @@ def command(ctx, include, exclude): local_stack = ctx.obj.local_stack if local_stack: - dev_root_path = default=os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")]) + dev_root_path = default=os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] print(f'Local stack dev_root_path (CERC_REPO_BASE_DIR) overridden to: {dev_root_path}') else: dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) diff --git a/app/setup_repositories.py b/app/setup_repositories.py index 7861aac8..ead3631d 100644 --- a/app/setup_repositories.py +++ b/app/setup_repositories.py @@ -71,7 +71,7 @@ def command(ctx, check_only, pull, branches_file): local_stack = ctx.obj.local_stack if local_stack: - dev_root_path = default=os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")]) + dev_root_path = default=os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] print(f'Local stack dev_root_path (CERC_REPO_BASE_DIR) overridden to: {dev_root_path}') else: dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) diff --git a/first_time_setup.sh b/first_time_setup.sh new file mode 100755 index 00000000..74ebee0d --- /dev/null +++ b/first_time_setup.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +python3 -m venv venv +source ./venv/bin/activate +pip install --editable . +pip install shiv +shiv -c laconic-so -o laconic-so +./laconic-so --verbose --local_stack setup-repositories From 16793ad43a950ad3a2411740b25baf6e900a51fd Mon Sep 17 00:00:00 2001 From: Michael Shaw Date: Thu, 29 Sep 2022 15:47:08 -0400 Subject: [PATCH 0063/1010] missing period --- first_time_setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/first_time_setup.sh b/first_time_setup.sh index 74ebee0d..2f7d46ab 100755 --- a/first_time_setup.sh +++ b/first_time_setup.sh @@ -4,5 +4,5 @@ python3 -m venv venv source ./venv/bin/activate pip install --editable . pip install shiv -shiv -c laconic-so -o laconic-so +shiv -c laconic-so -o laconic-so . ./laconic-so --verbose --local_stack setup-repositories From fda5ceaf139e11fbccf9e2609aefcf49e3b1a3fa Mon Sep 17 00:00:00 2001 From: Michael Shaw Date: Thu, 29 Sep 2022 15:56:55 -0400 Subject: [PATCH 0064/1010] README updates for compose plugin, running local build of ./laconic-so, and first_time_setup.sh --- README.md | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 69e7e234..96dcccfb 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Ensure that the following are already installed: $ docker --version Docker version 20.10.17, build 100c701 ``` -3. If installed from regular package repository, be aware that the compose plugin may need to be installed, as well. +3. If installed from regular package repository, BE AWARE that the compose plugin may need to be installed, as well. ``` DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker} mkdir -p $DOCKER_CONFIG/cli-plugins @@ -35,21 +35,29 @@ Ensure that the following are already installed: ``` $ git clone (https://github.com/cerc-io/stack-orchestrator.git ``` -1. Enter the project directory: +2. Optional first time setup for empty dev root and fresh SO checkout: + ``` + ./first_time_setup.sh + # e.g. /home/USER/workspace1/ + # only contains the stack-orchestrator repo cloned in step 1. + # this will naively attempt to setup and activate the venv, shiv, generate a LOCAL standalone laconic-so + # and then setup-repositories in workspace1/ + ``` +4. Enter the project directory: ``` $ cd stack-orchestrator ``` -1. Create and activate a venv: +5. Create and activate a venv: ``` $ python3 -m venv venv $ source ./venv/bin/activate (venv) $ ``` -1. Install the cli in edit mode: +6. Install the cli in edit mode: ``` $ pip install --editable . ``` -1. Verify installation: +7. Verify installation: ``` (venv) $ laconic-so Usage: laconic-so [OPTIONS] COMMAND [ARGS]... @@ -102,17 +110,23 @@ _write-me_ ## Usage There are three sub-commands: `setup-repositories`, `build-containers` and `deploy-system` that are generally run in order: + +Note: $ laconic-so will run the version installed to ~/bin, while ./laconic-so can be invoked to run locally built +version in a checkout ### Setup Repositories Clones the set of git repositories necessary to build a system. Note: the use of `ssh-agent` is recommended in order to avoid entering your ssh key passphrase for each repository. ``` -$ laconic-so --verbose setup-repositories +$ laconic-so --verbose setup-repositories #this will default to ~/cerc or CERC_REPO_BASE_DIR from an env file +#$ ./laconic-so --verbose --local_stack setup-repositories #this will use cwd ../ as dev_root_path ``` ### Build Containers Builds the set of docker container images required to run a system. It takes around 10 minutes to build all the containers from cold. ``` -$ laconic-so --verbose build-containers +$ laconic-so --verbose build-containers #this will default to ~/cerc or CERC_REPO_BASE_DIR from an env file +#$ ./laconic-so --verbose --local_stack build-containers #this will use cwd ../ as dev_root_path + ``` ### Deploy System Uses `docker compose` to deploy a system. @@ -124,6 +138,8 @@ $ laconic-so --verbose deploy-system --include db-sharding,contract,ipld-eth-ser ``` $ laconic-so --verbose deploy-system --include db-sharding,contract,ipld-eth-server,go-ethereum-foundry down ``` +Note: deploy-system command interacts with most recently built container images. + ## Platform Support Native aarm64 is _not_ currently supported. x64 emulation on ARM64 macos should work (not yet tested). ## Implementation From deb40663961b645d00b9783b67830425d73ca5d6 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 29 Sep 2022 15:21:50 -0600 Subject: [PATCH 0065/1010] trailing newline --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 33e988a5..a1dcd886 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ venv laconic-so laconic_stack_orchestrator.egg-info __pycache__ -*~ \ No newline at end of file +*~ + From c3acdf9d5f06e645efc3c8ab8d7a97ac4a48e643 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 29 Sep 2022 15:28:23 -0600 Subject: [PATCH 0066/1010] Clarify non-Docker Desktop install --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 96dcccfb..ead98ee4 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Ensure that the following are already installed: $ docker --version Docker version 20.10.17, build 100c701 ``` -3. If installed from regular package repository, BE AWARE that the compose plugin may need to be installed, as well. +3. If installed from regular package repository (not Docker Desktop), BE AWARE that the compose plugin may need to be installed, as well. ``` DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker} mkdir -p $DOCKER_CONFIG/cli-plugins From 1050e256070d96e5f86a245fa4b6ae258a64724e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 3 Oct 2022 19:37:18 -0600 Subject: [PATCH 0067/1010] Some lint goodness --- app/build_containers.py | 10 +++++----- app/deploy_system.py | 12 ++++++------ app/setup_repositories.py | 26 ++++++++++++++------------ app/util.py | 6 +++--- cli.py | 9 +++++---- setup.py | 26 +++++++++++++------------- tox.ini | 6 ++++++ 7 files changed, 52 insertions(+), 43 deletions(-) create mode 100644 tox.ini diff --git a/app/build_containers.py b/app/build_containers.py index abe909ac..90b0515b 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -22,7 +22,6 @@ import os import sys -import argparse from decouple import config import subprocess import click @@ -31,6 +30,7 @@ from .util import include_exclude_check # TODO: find a place for this # epilog="Config provided either in .env or settings.ini or env vars: CERC_REPO_BASE_DIR (defaults to ~/cerc)" + @click.command() @click.option('--include', help="only build these containers") @click.option('--exclude', help="don\'t build these containers") @@ -44,7 +44,7 @@ def command(ctx, include, exclude): local_stack = ctx.obj.local_stack if local_stack: - dev_root_path = default=os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] + dev_root_path = default = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] print(f'Local stack dev_root_path (CERC_REPO_BASE_DIR) overridden to: {dev_root_path}') else: dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) @@ -53,7 +53,7 @@ def command(ctx, include, exclude): print(f'Dev Root is: {dev_root_path}') if not os.path.isdir(dev_root_path): - print(f'Dev root directory doesn\'t exist, creating') + print('Dev root directory doesn\'t exist, creating') with open("container-image-list.txt") as container_list_file: containers = container_list_file.read().splitlines() @@ -64,7 +64,7 @@ def command(ctx, include, exclude): def process_container(container): if not quiet: print(f"Building: {container}") - build_script_filename = os.path.join("container-build",container.replace("/","-"),"build.sh") + build_script_filename = os.path.join("container-build", container.replace("/", "-"), "build.sh") if verbose: print(f"Script: {build_script_filename}") if not os.path.exists(build_script_filename): @@ -72,7 +72,7 @@ def command(ctx, include, exclude): sys.exit(1) if not dry_run: # We need to export CERC_REPO_BASE_DIR - build_result = subprocess.run(build_script_filename, shell=True, env={'CERC_REPO_BASE_DIR':dev_root_path}) + build_result = subprocess.run(build_script_filename, shell=True, env={'CERC_REPO_BASE_DIR': dev_root_path}) # TODO: check result in build_result.returncode print(f"Result is: {build_result}") else: diff --git a/app/deploy_system.py b/app/deploy_system.py index d779bef9..ace747ca 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -16,18 +16,18 @@ # Deploys the system components using docker-compose import os -import argparse -from decouple import config from python_on_whales import DockerClient import click from .util import include_exclude_check + @click.command() -@click.option('--include', help="only start these components") -@click.option('--exclude', help="don\'t start these components") -@click.argument('command') # help: command: up|down|ps +@click.option("--include", help="only start these components") +@click.option("--exclude", help="don\'t start these components") +@click.option("--score", help="read list of components from file") +@click.argument('command') # help: command: up|down|ps @click.pass_context -def command(ctx, include, exclude, command): +def command(ctx, include, exclude, score, command): '''deploy a stack''' # TODO: implement option exclusion and command value constraint lost with the move from argparse to click diff --git a/app/setup_repositories.py b/app/setup_repositories.py index ead3631d..634fff33 100644 --- a/app/setup_repositories.py +++ b/app/setup_repositories.py @@ -18,22 +18,23 @@ import os import sys -import argparse from decouple import config import git from tqdm import tqdm import click + class GitProgress(git.RemoteProgress): def __init__(self): super().__init__() - self.pbar = tqdm(unit = 'B', ascii = True, unit_scale = True) + self.pbar = tqdm(unit='B', ascii=True, unit_scale=True) def update(self, op_code, cur_count, max_count=None, message=''): self.pbar.total = max_count self.pbar.n = cur_count self.pbar.refresh() + def is_git_repo(path): try: _ = git.Repo(path).git_dir @@ -42,10 +43,11 @@ def is_git_repo(path): return False # TODO: find a place for this in the context of click -#parser = argparse.ArgumentParser( +# parser = argparse.ArgumentParser( # epilog="Config provided either in .env or settings.ini or env vars: CERC_REPO_BASE_DIR (defaults to ~/cerc)" # ) + @click.command() @click.option('--check-only', is_flag=True, default=False) @click.option('--pull', is_flag=True, default=False) @@ -71,7 +73,7 @@ def command(ctx, check_only, pull, branches_file): local_stack = ctx.obj.local_stack if local_stack: - dev_root_path = default=os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] + dev_root_path = default = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] print(f'Local stack dev_root_path (CERC_REPO_BASE_DIR) overridden to: {dev_root_path}') else: dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) @@ -81,14 +83,14 @@ def command(ctx, check_only, pull, branches_file): if not os.path.isdir(dev_root_path): if not quiet: - print(f'Dev root directory doesn\'t exist, creating') + print('Dev root directory doesn\'t exist, creating') os.makedirs(dev_root_path) with open("repository-list.txt") as repository_list_file: repos = repository_list_file.read().splitlines() if verbose: - print (f'Repos: {repos}') + print(f'Repos: {repos}') def process_repo(repo): full_github_repo_path = f'git@github.com:{repo}' @@ -96,7 +98,8 @@ def command(ctx, check_only, pull, branches_file): full_filesystem_repo_path = os.path.join(dev_root_path, repoName) is_present = os.path.isdir(full_filesystem_repo_path) if not quiet: - present_text = f'already exists active branch: {git.Repo(full_filesystem_repo_path).active_branch}' if is_present else 'Needs to be fetched' + present_text = f'already exists active branch: {git.Repo(full_filesystem_repo_path).active_branch}' if is_present \ + else 'Needs to be fetched' print(f'Checking: {full_filesystem_repo_path}: {present_text}') # Quick check that it's actually a repo if is_present: @@ -110,7 +113,7 @@ def command(ctx, check_only, pull, branches_file): if not check_only: git_repo = git.Repo(full_filesystem_repo_path) origin = git_repo.remotes.origin - origin.pull(progress = None if quiet else GitProgress()) + origin.pull(progress=None if quiet else GitProgress()) else: print("(git pull skipped)") if not is_present: @@ -118,8 +121,9 @@ def command(ctx, check_only, pull, branches_file): if verbose: print(f'Running git clone for {full_github_repo_path} into {full_filesystem_repo_path}') if not dry_run: - git.Repo.clone_from(full_github_repo_path, full_filesystem_repo_path, - progress = None if quiet else GitProgress()) + git.Repo.clone_from(full_github_repo_path, + full_filesystem_repo_path, + progress=None if quiet else GitProgress()) else: print("(git clone skipped)") # Checkout the requested branch, if one was specified @@ -134,8 +138,6 @@ def command(ctx, check_only, pull, branches_file): print(f"checking out branch {branch_to_checkout} in repo {repo}") git_repo = git.Repo(full_filesystem_repo_path) git_repo.git.checkout(branch_to_checkout) - - for repo in repos: process_repo(repo) diff --git a/app/util.py b/app/util.py index 48381bf0..bbf84398 100644 --- a/app/util.py +++ b/app/util.py @@ -14,11 +14,11 @@ # along with this program. If not, see . def include_exclude_check(s, include, exclude): - if include == None and exclude == None: + if include is None and exclude is None: return True - if include != None: + if include is not None: include_list = include.split(",") return s in include_list - if exclude != None: + if exclude is not None: exclude_list = exclude.split(",") return s not in exclude_list diff --git a/cli.py b/cli.py index 04cde0ce..06c4aa7e 100644 --- a/cli.py +++ b/cli.py @@ -21,6 +21,7 @@ from app import deploy_system CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) + class Options(object): def __init__(self, quiet, verbose, dry_run, local_stack): self.quiet = quiet @@ -33,13 +34,13 @@ class Options(object): @click.option('--verbose', is_flag=True, default=False) @click.option('--dry-run', is_flag=True, default=False) @click.option('--local_stack', is_flag=True, default=False) - # See: https://click.palletsprojects.com/en/8.1.x/complex/#building-a-git-clone @click.pass_context def cli(ctx, quiet, verbose, dry_run, local_stack): """Laconic Stack Orchestrator""" ctx.obj = Options(quiet, verbose, dry_run, local_stack) -cli.add_command(setup_repositories.command,"setup-repositories") -cli.add_command(build_containers.command,"build-containers") -cli.add_command(deploy_system.command,"deploy-system") + +cli.add_command(setup_repositories.command, "setup-repositories") +cli.add_command(build_containers.command, "build-containers") +cli.add_command(deploy_system.command, "deploy-system") diff --git a/setup.py b/setup.py index d302ee4f..88e10155 100644 --- a/setup.py +++ b/setup.py @@ -5,24 +5,24 @@ with open("README.md", "r", encoding="utf-8") as fh: with open("requirements.txt", "r", encoding="utf-8") as fh: requirements = fh.read() setup( - name = 'laconic-stack-orchestrator', - version = '0.0.5', - author = 'Cerc', - author_email = 'info@cerc.io', - license = 'GNU Affero General Public License', - description = 'Orchestrates deployment of the Laconic stack', - long_description = long_description, - long_description_content_type = "text/markdown", - url = 'https://github.com/cerc-io/stack-orchestrator', - py_modules = ['cli', 'app'], - packages = find_packages(), - install_requires = [requirements], + name='laconic-stack-orchestrator', + version='0.0.5', + author='Cerc', + author_email='info@cerc.io', + license='GNU Affero General Public License', + description='Orchestrates deployment of the Laconic stack', + long_description=long_description, + long_description_content_type="text/markdown", + url='https://github.com/cerc-io/stack-orchestrator', + py_modules=['cli', 'app'], + packages=find_packages(), + install_requires=[requirements], python_requires='>=3.7', classifiers=[ "Programming Language :: Python :: 3.8", "Operating System :: OS Independent", ], - entry_points = { + entry_points={ 'console_scripts': ['laconic-so=cli:cli'], } ) diff --git a/tox.ini b/tox.ini new file mode 100644 index 00000000..342e57b0 --- /dev/null +++ b/tox.ini @@ -0,0 +1,6 @@ +[flake8] +extend-ignore = E203 +exclude = .git,__pycache__,docs/source/conf.py,old,build,dist,venv +max-complexity = 10 +max-line-length = 132 + From ddbefd34a3f0cb1b8d520c548d1b233466ab2ad3 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 3 Oct 2022 19:43:43 -0600 Subject: [PATCH 0068/1010] Moar complex --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 342e57b0..e261061b 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,6 @@ [flake8] extend-ignore = E203 exclude = .git,__pycache__,docs/source/conf.py,old,build,dist,venv -max-complexity = 10 +max-complexity = 25 max-line-length = 132 From 80362f11fc38300f90c75c526d8780f88292e0e8 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 3 Oct 2022 19:44:17 -0600 Subject: [PATCH 0069/1010] Revert unrealted change --- app/deploy_system.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/deploy_system.py b/app/deploy_system.py index ace747ca..48aef089 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -24,10 +24,9 @@ from .util import include_exclude_check @click.command() @click.option("--include", help="only start these components") @click.option("--exclude", help="don\'t start these components") -@click.option("--score", help="read list of components from file") @click.argument('command') # help: command: up|down|ps @click.pass_context -def command(ctx, include, exclude, score, command): +def command(ctx, include, exclude, command): '''deploy a stack''' # TODO: implement option exclusion and command value constraint lost with the move from argparse to click From 1a7e3854d2506376ca2f8638d58258912d075758 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 6 Oct 2022 06:50:42 -0600 Subject: [PATCH 0070/1010] Remove unused variables --- app/build_containers.py | 2 +- app/setup_repositories.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build_containers.py b/app/build_containers.py index 90b0515b..817dc0e3 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -44,7 +44,7 @@ def command(ctx, include, exclude): local_stack = ctx.obj.local_stack if local_stack: - dev_root_path = default = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] + dev_root_path = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] print(f'Local stack dev_root_path (CERC_REPO_BASE_DIR) overridden to: {dev_root_path}') else: dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) diff --git a/app/setup_repositories.py b/app/setup_repositories.py index 634fff33..db7fafb3 100644 --- a/app/setup_repositories.py +++ b/app/setup_repositories.py @@ -73,7 +73,7 @@ def command(ctx, check_only, pull, branches_file): local_stack = ctx.obj.local_stack if local_stack: - dev_root_path = default = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] + dev_root_path = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] print(f'Local stack dev_root_path (CERC_REPO_BASE_DIR) overridden to: {dev_root_path}') else: dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) From 914dde3effdd922dea573ab98931a45abe21082a Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 6 Oct 2022 06:51:55 -0600 Subject: [PATCH 0071/1010] Extra line --- cli.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cli.py b/cli.py index 06c4aa7e..ab1d21f8 100644 --- a/cli.py +++ b/cli.py @@ -29,6 +29,7 @@ class Options(object): self.dry_run = dry_run self.local_stack = local_stack + @click.group(context_settings=CONTEXT_SETTINGS) @click.option('--quiet', is_flag=True, default=False) @click.option('--verbose', is_flag=True, default=False) From 6f882ffa2f98372a1725e8c2590a5e045c3471e2 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 6 Oct 2022 07:05:15 -0600 Subject: [PATCH 0072/1010] Specify bash for script using bash features --- first_time_setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/first_time_setup.sh b/first_time_setup.sh index 2f7d46ab..e1adaff4 100755 --- a/first_time_setup.sh +++ b/first_time_setup.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash python3 -m venv venv source ./venv/bin/activate From 467b2c4e0d327eb265bb55674df20d3443b375e1 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 6 Oct 2022 07:18:29 -0600 Subject: [PATCH 0073/1010] Make all options use dash word delimiter --- README.md | 4 ++-- cli.py | 2 +- first_time_setup.sh | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ead98ee4..df9bc966 100644 --- a/README.md +++ b/README.md @@ -119,13 +119,13 @@ Clones the set of git repositories necessary to build a system. Note: the use of `ssh-agent` is recommended in order to avoid entering your ssh key passphrase for each repository. ``` $ laconic-so --verbose setup-repositories #this will default to ~/cerc or CERC_REPO_BASE_DIR from an env file -#$ ./laconic-so --verbose --local_stack setup-repositories #this will use cwd ../ as dev_root_path +#$ ./laconic-so --verbose --local-stack setup-repositories #this will use cwd ../ as dev_root_path ``` ### Build Containers Builds the set of docker container images required to run a system. It takes around 10 minutes to build all the containers from cold. ``` $ laconic-so --verbose build-containers #this will default to ~/cerc or CERC_REPO_BASE_DIR from an env file -#$ ./laconic-so --verbose --local_stack build-containers #this will use cwd ../ as dev_root_path +#$ ./laconic-so --verbose --local-stack build-containers #this will use cwd ../ as dev_root_path ``` ### Deploy System diff --git a/cli.py b/cli.py index ab1d21f8..87de406d 100644 --- a/cli.py +++ b/cli.py @@ -34,7 +34,7 @@ class Options(object): @click.option('--quiet', is_flag=True, default=False) @click.option('--verbose', is_flag=True, default=False) @click.option('--dry-run', is_flag=True, default=False) -@click.option('--local_stack', is_flag=True, default=False) +@click.option('--local-stack', is_flag=True, default=False) # See: https://click.palletsprojects.com/en/8.1.x/complex/#building-a-git-clone @click.pass_context def cli(ctx, quiet, verbose, dry_run, local_stack): diff --git a/first_time_setup.sh b/first_time_setup.sh index 2f7d46ab..87fdd505 100755 --- a/first_time_setup.sh +++ b/first_time_setup.sh @@ -5,4 +5,4 @@ source ./venv/bin/activate pip install --editable . pip install shiv shiv -c laconic-so -o laconic-so . -./laconic-so --verbose --local_stack setup-repositories +./laconic-so --verbose --local-stack setup-repositories From c5329233235cdab56bc0ec514928964d8820eb16 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 6 Oct 2022 07:40:36 -0600 Subject: [PATCH 0074/1010] Add eth-statediff-service --- container-build/cerc-eth-statediff-service/build.sh | 3 +++ container-image-list.txt | 1 + repository-list.txt | 1 + 3 files changed, 5 insertions(+) create mode 100755 container-build/cerc-eth-statediff-service/build.sh diff --git a/container-build/cerc-eth-statediff-service/build.sh b/container-build/cerc-eth-statediff-service/build.sh new file mode 100755 index 00000000..6091e8ec --- /dev/null +++ b/container-build/cerc-eth-statediff-service/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +# Build cerc/eth-statediff-service +docker build -t cerc/eth-statediff-service:local ${CERC_REPO_BASE_DIR}/eth-statediff-service diff --git a/container-image-list.txt b/container-image-list.txt index 7db5b94c..ff225f60 100644 --- a/container-image-list.txt +++ b/container-image-list.txt @@ -1,5 +1,6 @@ cerc/test-contract cerc/eth-statediff-fill-service +cerc/eth-statediff-service cerc/go-ethereum cerc/go-ethereum-foundry cerc/lighthouse diff --git a/repository-list.txt b/repository-list.txt index 42fcc347..a471b567 100644 --- a/repository-list.txt +++ b/repository-list.txt @@ -2,6 +2,7 @@ vulcanize/ops cerc-io/ipld-eth-db cerc-io/go-ethereum cerc-io/ipld-eth-server +cerc-io/eth-statediff-service vulcanize/eth-statediff-fill-service vulcanize/ipld-eth-db-validator vulcanize/ipld-eth-beacon-indexer From 3ab192d7fe0097bf4f2a3dd49d10db0fdbb60be1 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 7 Oct 2022 06:48:30 -0600 Subject: [PATCH 0075/1010] Rename cluster -> pod --- README.md | 2 +- app/deploy_system.py | 11 ++++++----- cluster-list.txt => pod-list.txt | 0 3 files changed, 7 insertions(+), 6 deletions(-) rename cluster-list.txt => pod-list.txt (100%) diff --git a/README.md b/README.md index df9bc966..4c6adaf8 100644 --- a/README.md +++ b/README.md @@ -148,7 +148,7 @@ the list of container image names, while `clister-list.txt` specifies the set of Files required to build each container image are stored under `./container-build/` Files required at deploy-time are stored under `./config/` ``` -├── cluster-list.txt +├── pod-list.txt ├── compose │   ├── docker-compose-contract.yml │   ├── docker-compose-db-sharding.yml diff --git a/app/deploy_system.py b/app/deploy_system.py index 48aef089..f79595ff 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -24,9 +24,10 @@ from .util import include_exclude_check @click.command() @click.option("--include", help="only start these components") @click.option("--exclude", help="don\'t start these components") +@click.option("--cluster", help="specify a non-default cluster name") @click.argument('command') # help: command: up|down|ps @click.pass_context -def command(ctx, include, exclude, command): +def command(ctx, include, exclude, cluster, command): '''deploy a stack''' # TODO: implement option exclusion and command value constraint lost with the move from argparse to click @@ -35,16 +36,16 @@ def command(ctx, include, exclude, command): verbose = ctx.obj.verbose dry_run = ctx.obj.dry_run - with open("cluster-list.txt") as cluster_list_file: - clusters = cluster_list_file.read().splitlines() + with open("pod-list.txt") as pod_list_file: + pods = pod_list_file.read().splitlines() if verbose: - print(f'Cluster components: {clusters}') + print(f'Cluster components: {pods}') # Construct a docker compose command suitable for our purpose compose_files = [] - for cluster in clusters: + for pod in pods: if include_exclude_check(cluster, include, exclude): compose_file_name = os.path.join("compose", f"docker-compose-{cluster}.yml") compose_files.append(compose_file_name) diff --git a/cluster-list.txt b/pod-list.txt similarity index 100% rename from cluster-list.txt rename to pod-list.txt From 367de932f9e987a019126e0850b7b66d4a2c2f76 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 7 Oct 2022 07:12:43 -0600 Subject: [PATCH 0076/1010] Clusters --- app/deploy_system.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/app/deploy_system.py b/app/deploy_system.py index f79595ff..7a5a417e 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -15,7 +15,9 @@ # Deploys the system components using docker-compose +import hashlib import os +import sys from python_on_whales import DockerClient import click from .util import include_exclude_check @@ -36,28 +38,37 @@ def command(ctx, include, exclude, cluster, command): verbose = ctx.obj.verbose dry_run = ctx.obj.dry_run + if cluster is None: + # Create default unique, stable cluster name from confile file path + # TODO: change this to the config file path + path = os.path.realpath(sys.argv[0]) + hash = hashlib.md5(path.encode()).hexdigest() + cluster = f"laconic-{hash}" + if verbose: + print(f"Using cluster name: {cluster}") + with open("pod-list.txt") as pod_list_file: pods = pod_list_file.read().splitlines() if verbose: - print(f'Cluster components: {pods}') + print(f'Pods: {pods}') # Construct a docker compose command suitable for our purpose compose_files = [] for pod in pods: - if include_exclude_check(cluster, include, exclude): - compose_file_name = os.path.join("compose", f"docker-compose-{cluster}.yml") + if include_exclude_check(pod, include, exclude): + compose_file_name = os.path.join("compose", f"docker-compose-{pod}.yml") compose_files.append(compose_file_name) else: if not quiet: - print(f"Excluding: {cluster}") + print(f"Excluding: {pod}") if verbose: print(f"files: {compose_files}") # See: https://gabrieldemarmiesse.github.io/python-on-whales/sub-commands/compose/ - docker = DockerClient(compose_files=compose_files) + docker = DockerClient(compose_files=compose_files, compose_project_name=cluster) if not dry_run: if command == "up": From d38a74e23381515a72e65a3f667b83f9b194a03c Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 12 Oct 2022 15:28:45 -0600 Subject: [PATCH 0077/1010] Initial rename --- compose/docker-compose-laconicd.yml | 3 ++- container-build/cerc-laconic-client/build.sh | 5 ++--- container-image-list.txt | 2 +- repository-list.txt | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/compose/docker-compose-laconicd.yml b/compose/docker-compose-laconicd.yml index d5c95d48..38376f77 100644 --- a/compose/docker-compose-laconicd.yml +++ b/compose/docker-compose-laconicd.yml @@ -3,4 +3,5 @@ services: laconicd: restart: unless-stopped image: cerc/laconicd:local - + volume: + - ./create-testingnet.sh:/laconicd-entrypoint-init.d/create-testingnet.sh diff --git a/container-build/cerc-laconic-client/build.sh b/container-build/cerc-laconic-client/build.sh index 97c646fc..a4a8de41 100755 --- a/container-build/cerc-laconic-client/build.sh +++ b/container-build/cerc-laconic-client/build.sh @@ -1,8 +1,7 @@ #!/usr/bin/env bash -# Build cerc/laconic-client +# Build cerc/laconic-cns-cli # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -# TODO: change the repo name to laconic-client, if it becomes re-named (laconic-client currently is just the TS protocol client library, not the CLI tool) -docker build -t cerc/laconic-client:local -f ${SCRIPT_DIR}/Dockerfile --build-arg NPM_AUTH_TOKEN=$(NPM_AUTH_TOKEN) ${CERC_REPO_BASE_DIR}/laconic-sdk +docker build -t cerc/laconic-cns-cli:local -f ${SCRIPT_DIR}/Dockerfile --build-arg NPM_AUTH_TOKEN=$(NPM_AUTH_TOKEN) ${CERC_REPO_BASE_DIR}/laconic-cns-cli diff --git a/container-image-list.txt b/container-image-list.txt index ff225f60..660e7e66 100644 --- a/container-image-list.txt +++ b/container-image-list.txt @@ -9,4 +9,4 @@ cerc/ipld-eth-beacon-db cerc/ipld-eth-beacon-indexer cerc/ipld-eth-server cerc/laconicd -cerc/laconic-client +cerc/laconic-cns-cli diff --git a/repository-list.txt b/repository-list.txt index a471b567..01e178ac 100644 --- a/repository-list.txt +++ b/repository-list.txt @@ -8,4 +8,4 @@ vulcanize/ipld-eth-db-validator vulcanize/ipld-eth-beacon-indexer vulcanize/ipld-eth-beacon-db cerc-io/laconicd -cerc-io/laconic-sdk +cerc-io/laconic-cns-cli From c11213de52e04f32fc9cee345f6595820784a86b Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 12 Oct 2022 16:30:37 -0600 Subject: [PATCH 0078/1010] Enable fixturenet for laconicd --- compose/docker-compose-laconicd.yml | 16 +++- config/laconicd/create-fixturenet.sh | 118 +++++++++++++++++++++++++++ 2 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 config/laconicd/create-fixturenet.sh diff --git a/compose/docker-compose-laconicd.yml b/compose/docker-compose-laconicd.yml index d5c95d48..fab8c066 100644 --- a/compose/docker-compose-laconicd.yml +++ b/compose/docker-compose-laconicd.yml @@ -3,4 +3,18 @@ services: laconicd: restart: unless-stopped image: cerc/laconicd:local - + command: ["sh", "/docker-entrypoint-scripts.d/create-fixturenet.sh"] + volumes: + # TODO: look at folding this script into the container + - ../config/laconicd/create-fixturenet.sh:/docker-entrypoint-scripts.d/create-fixturenet.sh + # TODO: determine which of the ports below is really needed + ports: + - "6060" + - "26657" + - "26656" + - "9473" + - "8545" + - "8546" + - "9090" + - "9091" + - "1317" diff --git a/config/laconicd/create-fixturenet.sh b/config/laconicd/create-fixturenet.sh new file mode 100644 index 00000000..8d5115be --- /dev/null +++ b/config/laconicd/create-fixturenet.sh @@ -0,0 +1,118 @@ +#!/bin/sh + +# Originally from: https://github.com/cerc-io/laconicd/blob/main/init.sh +# TODO: fold this back into the laconicd repo + + +KEY="mykey" +CHAINID="laconic_9000-1" +MONIKER="localtestnet" +KEYRING="test" +KEYALGO="eth_secp256k1" +LOGLEVEL="info" +# to trace evm +TRACE="--trace" +# TRACE="" + +# 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* + +make install + +laconicd config keyring-backend $KEYRING +laconicd config chain-id $CHAINID + +# if $KEY exists it should be deleted +laconicd keys add $KEY --keyring-backend $KEYRING --algo $KEYALGO + +# Set moniker and chain-id for laconic (Moniker can be anything, chain-id must be an integer) +laconicd init $MONIKER --chain-id $CHAINID + +# Change parameter token denominations to aphoton +cat $HOME/.laconicd/config/genesis.json | jq '.app_state["staking"]["params"]["bond_denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json +cat $HOME/.laconicd/config/genesis.json | jq '.app_state["crisis"]["constant_fee"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json +cat $HOME/.laconicd/config/genesis.json | jq '.app_state["gov"]["deposit_params"]["min_deposit"][0]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json +cat $HOME/.laconicd/config/genesis.json | jq '.app_state["mint"]["params"]["mint_denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json +# Custom modules +cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["record_rent"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json +cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_rent"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json +cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_auction_commit_fee"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json +cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_auction_reveal_fee"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json +cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_auction_minimum_bid"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + +if [[ "$TEST_NAMESERVICE_EXPIRY" == "true" ]]; then + echo "Setting timers for expiry tests." + + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["record_rent_duration"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_grace_period"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_rent_duration"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json +fi + +if [[ "$TEST_AUCTION_ENABLED" == "true" ]]; then + echo "Enabling auction and setting timers." + + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_auction_enabled"]=true' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_rent_duration"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_grace_period"]="300s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_auction_commits_duration"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_auction_reveals_duration"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json +fi + +# increase block time (?) +cat $HOME/.laconicd/config/genesis.json | jq '.consensus_params["block"]["time_iota_ms"]="1000"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + +# Set gas limit in genesis +cat $HOME/.laconicd/config/genesis.json | jq '.consensus_params["block"]["max_gas"]="10000000"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + +# disable produce empty block +if [[ "$OSTYPE" == "darwin"* ]]; then + sed -i '' 's/create_empty_blocks = true/create_empty_blocks = false/g' $HOME/.laconicd/config/config.toml + else + sed -i 's/create_empty_blocks = true/create_empty_blocks = false/g' $HOME/.laconicd/config/config.toml +fi + +if [[ $1 == "pending" ]]; then + if [[ "$OSTYPE" == "darwin"* ]]; then + sed -i '' 's/create_empty_blocks_interval = "0s"/create_empty_blocks_interval = "30s"/g' $HOME/.laconicd/config/config.toml + sed -i '' 's/timeout_propose = "3s"/timeout_propose = "30s"/g' $HOME/.laconicd/config/config.toml + sed -i '' 's/timeout_propose_delta = "500ms"/timeout_propose_delta = "5s"/g' $HOME/.laconicd/config/config.toml + sed -i '' 's/timeout_prevote = "1s"/timeout_prevote = "10s"/g' $HOME/.laconicd/config/config.toml + sed -i '' 's/timeout_prevote_delta = "500ms"/timeout_prevote_delta = "5s"/g' $HOME/.laconicd/config/config.toml + sed -i '' 's/timeout_precommit = "1s"/timeout_precommit = "10s"/g' $HOME/.laconicd/config/config.toml + sed -i '' 's/timeout_precommit_delta = "500ms"/timeout_precommit_delta = "5s"/g' $HOME/.laconicd/config/config.toml + sed -i '' 's/timeout_commit = "5s"/timeout_commit = "150s"/g' $HOME/.laconicd/config/config.toml + sed -i '' 's/timeout_broadcast_tx_commit = "10s"/timeout_broadcast_tx_commit = "150s"/g' $HOME/.laconicd/config/config.toml + else + sed -i 's/create_empty_blocks_interval = "0s"/create_empty_blocks_interval = "30s"/g' $HOME/.laconicd/config/config.toml + sed -i 's/timeout_propose = "3s"/timeout_propose = "30s"/g' $HOME/.laconicd/config/config.toml + sed -i 's/timeout_propose_delta = "500ms"/timeout_propose_delta = "5s"/g' $HOME/.laconicd/config/config.toml + sed -i 's/timeout_prevote = "1s"/timeout_prevote = "10s"/g' $HOME/.laconicd/config/config.toml + sed -i 's/timeout_prevote_delta = "500ms"/timeout_prevote_delta = "5s"/g' $HOME/.laconicd/config/config.toml + sed -i 's/timeout_precommit = "1s"/timeout_precommit = "10s"/g' $HOME/.laconicd/config/config.toml + sed -i 's/timeout_precommit_delta = "500ms"/timeout_precommit_delta = "5s"/g' $HOME/.laconicd/config/config.toml + sed -i 's/timeout_commit = "5s"/timeout_commit = "150s"/g' $HOME/.laconicd/config/config.toml + sed -i 's/timeout_broadcast_tx_commit = "10s"/timeout_broadcast_tx_commit = "150s"/g' $HOME/.laconicd/config/config.toml + fi +fi + +# Allocate genesis accounts (cosmos formatted addresses) +laconicd add-genesis-account $KEY 100000000000000000000000000aphoton --keyring-backend $KEYRING + +# Sign genesis transaction +laconicd gentx $KEY 1000000000000000000000aphoton --keyring-backend $KEYRING --chain-id $CHAINID + +# Collect genesis tx +laconicd collect-gentxs + +# Run this to ensure everything worked and that the genesis file is setup correctly +laconicd validate-genesis + +if [[ $1 == "pending" ]]; then + echo "pending mode is on, please wait for the first block committed." +fi + +# Start the node (remove the --pruning=nothing flag if historical queries are not needed) +laconicd start --mode validator --pruning=nothing --evm.tracer=json $TRACE --log_level $LOGLEVEL --minimum-gas-prices=0.0001aphoton --json-rpc.api eth,txpool,personal,net,debug,web3,miner --api.enable --gql-server --gql-playground From 079a86cf5a5e8de01549f1a7e2c0a504e3368c4d Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 12 Oct 2022 21:37:54 -0600 Subject: [PATCH 0079/1010] Rename to match container --- .../{cerc-laconic-client => cerc-laconic-cns-cli}/Dockerfile | 0 .../{cerc-laconic-client => cerc-laconic-cns-cli}/build.sh | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename container-build/{cerc-laconic-client => cerc-laconic-cns-cli}/Dockerfile (100%) rename container-build/{cerc-laconic-client => cerc-laconic-cns-cli}/build.sh (100%) diff --git a/container-build/cerc-laconic-client/Dockerfile b/container-build/cerc-laconic-cns-cli/Dockerfile similarity index 100% rename from container-build/cerc-laconic-client/Dockerfile rename to container-build/cerc-laconic-cns-cli/Dockerfile diff --git a/container-build/cerc-laconic-client/build.sh b/container-build/cerc-laconic-cns-cli/build.sh similarity index 100% rename from container-build/cerc-laconic-client/build.sh rename to container-build/cerc-laconic-cns-cli/build.sh From af967dd54423b12ac9e083dbb3b25e29edc1801a Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 13 Oct 2022 06:14:13 -0600 Subject: [PATCH 0080/1010] Remove postgraphile container --- compose/docker-compose-ipld-eth-server.yml | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/compose/docker-compose-ipld-eth-server.yml b/compose/docker-compose-ipld-eth-server.yml index 35f6685a..21dfd2b2 100644 --- a/compose/docker-compose-ipld-eth-server.yml +++ b/compose/docker-compose-ipld-eth-server.yml @@ -31,18 +31,3 @@ services: - "127.0.0.1:8081:8081" - "127.0.0.1:8082:8082" - graphql: - restart: unless-stopped - depends_on: - ipld-eth-db: - condition: service_healthy - image: vulcanize/postgraphile:v1.0.1 - environment: - PG_HOST: ipld-eth-db - PG_PORT: 5432 - PG_DATABASE: cerc_testing - PG_USER: vdbm - PG_PASSWORD: password - SCHEMA: public,eth - ports: - - "127.0.0.1:5000:5000" From d537538943cf6038ef13011137ab82808fa0bad5 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Thu, 13 Oct 2022 22:18:39 -0500 Subject: [PATCH 0081/1010] Add build and compose defintions for Merge 'fixturenet'. --- compose/docker-compose-fixturenet-eth.yml | 89 +++++++++++++++++++ .../cerc-fixturenet-eth-geth/Dockerfile | 21 +++++ .../cerc-fixturenet-eth-geth/build.sh | 6 ++ .../cerc-fixturenet-eth-geth/genesis/Makefile | 13 +++ .../genesis/accounts/accounts.csv | 6 ++ .../genesis/accounts/import_keys.sh | 18 ++++ .../genesis/el/build_el.sh | 12 +++ .../genesis/el/el-config.yaml | 21 +++++ .../cerc-fixturenet-eth-geth/run-el.sh | 33 +++++++ .../cerc-fixturenet-eth-lighthouse/Dockerfile | 30 +++++++ .../cerc-fixturenet-eth-lighthouse/build.sh | 6 ++ .../genesis/Makefile | 13 +++ .../genesis/cl/beacon_node.sh | 44 +++++++++ .../genesis/cl/bootnode.sh | 21 +++++ .../genesis/cl/build_cl.sh | 74 +++++++++++++++ .../genesis/cl/reset_genesis_time.sh | 19 ++++ .../genesis/cl/validator_client.sh | 33 +++++++ .../genesis/cl/vars.env | 52 +++++++++++ .../cerc-fixturenet-eth-lighthouse/run-cl.sh | 47 ++++++++++ container-image-list.txt | 2 + pod-list.txt | 1 + 21 files changed, 561 insertions(+) create mode 100644 compose/docker-compose-fixturenet-eth.yml create mode 100644 container-build/cerc-fixturenet-eth-geth/Dockerfile create mode 100755 container-build/cerc-fixturenet-eth-geth/build.sh create mode 100644 container-build/cerc-fixturenet-eth-geth/genesis/Makefile create mode 100644 container-build/cerc-fixturenet-eth-geth/genesis/accounts/accounts.csv create mode 100755 container-build/cerc-fixturenet-eth-geth/genesis/accounts/import_keys.sh create mode 100755 container-build/cerc-fixturenet-eth-geth/genesis/el/build_el.sh create mode 100644 container-build/cerc-fixturenet-eth-geth/genesis/el/el-config.yaml create mode 100755 container-build/cerc-fixturenet-eth-geth/run-el.sh create mode 100644 container-build/cerc-fixturenet-eth-lighthouse/Dockerfile create mode 100755 container-build/cerc-fixturenet-eth-lighthouse/build.sh create mode 100644 container-build/cerc-fixturenet-eth-lighthouse/genesis/Makefile create mode 100755 container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh create mode 100755 container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/bootnode.sh create mode 100755 container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/build_cl.sh create mode 100755 container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/reset_genesis_time.sh create mode 100755 container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/validator_client.sh create mode 100644 container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/vars.env create mode 100755 container-build/cerc-fixturenet-eth-lighthouse/run-cl.sh diff --git a/compose/docker-compose-fixturenet-eth.yml b/compose/docker-compose-fixturenet-eth.yml new file mode 100644 index 00000000..d1c957ea --- /dev/null +++ b/compose/docker-compose-fixturenet-eth.yml @@ -0,0 +1,89 @@ +version: '3.7' + +services: + fixturenet-eth-bootnode-geth: + hostname: fixturenet-eth-bootnode-geth + environment: + RUN_BOOTNODE: "true" + NETWORK_ID: "1212" + image: cerc/fixturenet-eth-geth:local + networks: + fixturenet-eth-net: + ipv4_address: 172.16.254.10 + + fixturenet-eth-geth-1: + hostname: fixturenet-eth-geth-1 + environment: + NETWORK_ID: "1212" + ACCOUNT_PASSWORD: "secret1212" + ETHERBASE: "0xe6CE22afe802CAf5fF7d3845cec8c736ecc8d61F" + ENODE: "enode://af22c29c316ad069cf48a09a4ad5cf04a251b411e45098888d114c6dd7f489a13786620d5953738762afa13711d4ffb3b19aa5de772d8af72f851f7e9c5b164a@fixturenet-eth-bootnode-geth:30303" + JWT: "0x6cdcac3501046a08e186730dd8bd136cfaf0fdc1fc955f6e15ad3068c0ff2af0" + image: cerc/fixturenet-eth-geth:local + depends_on: + - fixturenet-eth-bootnode-geth + ports: + - "8545" + networks: + fixturenet-eth-net: + + fixturenet-eth-geth-2: + hostname: fixturenet-eth-geth-2 + environment: + NETWORK_ID: "1212" + ACCOUNT_PASSWORD: "secret1212" + ETHERBASE: "0xe6CE22afe802CAf5fF7d3845cec8c736ecc8d61F" + ENODE: "enode://af22c29c316ad069cf48a09a4ad5cf04a251b411e45098888d114c6dd7f489a13786620d5953738762afa13711d4ffb3b19aa5de772d8af72f851f7e9c5b164a@fixturenet-eth-bootnode-geth:30303" + JWT: "0x6cdcac3501046a08e186730dd8bd136cfaf0fdc1fc955f6e15ad3068c0ff2af0" + image: cerc/fixturenet-eth-geth:local + depends_on: + - fixturenet-eth-bootnode-geth + networks: + fixturenet-eth-net: + + fixturenet-eth-bootnode-lighthouse: + hostname: fixturenet-eth-bootnode-lighthouse + environment: + RUN_BOOTNODE: "true" + image: cerc/fixturenet-eth-lighthouse:local + networks: + fixturenet-eth-net: + ipv4_address: 172.16.254.11 + + fixturenet-eth-lighthouse-1: + hostname: fixturenet-eth-lighthouse-1 + environment: + NODE_NUMBER: "1" + JWT: "0x6cdcac3501046a08e186730dd8bd136cfaf0fdc1fc955f6e15ad3068c0ff2af0" + ETH1_ENDPOINT: "http://fixturenet-eth-geth-1:8545" + EXECUTION_ENDPOINT: "http://fixturenet-eth-geth-1:8551" + image: cerc/fixturenet-eth-lighthouse:local + depends_on: + - fixturenet-eth-bootnode-lighthouse + - fixturenet-eth-geth-1 + ports: + - "8001" + networks: + fixturenet-eth-net: + + fixturenet-eth-lighthouse-2: + hostname: fixturenet-eth-lighthouse-2 + environment: + NODE_NUMBER: "2" + JWT: "0x6cdcac3501046a08e186730dd8bd136cfaf0fdc1fc955f6e15ad3068c0ff2af0" + ETH1_ENDPOINT: "http://fixturenet-eth-geth-2:8545" + EXECUTION_ENDPOINT: "http://fixturenet-eth-geth-2:8551" + LIGHTHOUSE_GENESIS_STATE_URL: "http://fixturenet-eth-lighthouse-1:8001/eth/v2/debug/beacon/states/0" + image: cerc/fixturenet-eth-lighthouse:local + depends_on: + - fixturenet-eth-bootnode-lighthouse + - fixturenet-eth-geth-2 + networks: + fixturenet-eth-net: + +networks: + fixturenet-eth-net: + driver: bridge + ipam: + config: + - subnet: 172.16.254.0/28 diff --git a/container-build/cerc-fixturenet-eth-geth/Dockerfile b/container-build/cerc-fixturenet-eth-geth/Dockerfile new file mode 100644 index 00000000..ababbfad --- /dev/null +++ b/container-build/cerc-fixturenet-eth-geth/Dockerfile @@ -0,0 +1,21 @@ +FROM skylenet/ethereum-genesis-generator AS ethgen + +FROM cerc/go-ethereum:local +RUN apk add --no-cache python3 py3-pip curl wget jq build-base gettext libintl openssl bash + +COPY --from=ethgen /usr/local/bin/eth2-testnet-genesis /usr/local/bin/eth2-testnet-genesis +COPY --from=ethgen /usr/local/bin/eth2-val-tools /usr/local/bin/eth2-val-tools +COPY --from=ethgen /apps /apps + +RUN cd /apps/el-gen && pip3 install -r requirements.txt + +COPY genesis /opt/testnet +COPY run-el.sh /opt/testnet/run.sh + +RUN cd /opt/testnet && make genesis-el + +RUN chmod a+x /usr/local/bin/* +RUN ls -l /usr/local/bin +RUN geth init /opt/testnet/build/el/geth.json && rm -f ~/.ethereum/geth/nodekey + +ENTRYPOINT ["/opt/testnet/run.sh"] diff --git a/container-build/cerc-fixturenet-eth-geth/build.sh b/container-build/cerc-fixturenet-eth-geth/build.sh new file mode 100755 index 00000000..b06044c7 --- /dev/null +++ b/container-build/cerc-fixturenet-eth-geth/build.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +# Build cerc/fixturenet-eth-geth + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t cerc/fixturenet-eth-geth:local -f ${SCRIPT_DIR}/Dockerfile $SCRIPT_DIR diff --git a/container-build/cerc-fixturenet-eth-geth/genesis/Makefile b/container-build/cerc-fixturenet-eth-geth/genesis/Makefile new file mode 100644 index 00000000..a1eef575 --- /dev/null +++ b/container-build/cerc-fixturenet-eth-geth/genesis/Makefile @@ -0,0 +1,13 @@ +.PHONY: build +build: genesis + +.PHONY: genesis +genesis: genesis-el + +.PHONY: genesis-el +genesis-el: + cd el; ./build_el.sh + +.PHONY: clean +clean: + rm -rf build diff --git a/container-build/cerc-fixturenet-eth-geth/genesis/accounts/accounts.csv b/container-build/cerc-fixturenet-eth-geth/genesis/accounts/accounts.csv new file mode 100644 index 00000000..9f027f71 --- /dev/null +++ b/container-build/cerc-fixturenet-eth-geth/genesis/accounts/accounts.csv @@ -0,0 +1,6 @@ +m/44'/60'/0'/0/0,0xe6CE22afe802CAf5fF7d3845cec8c736ecc8d61F,0x02cfc16a6212d7bb9dff89b603afbd856157c367de3ef6b626f205d9b150630ea0,0x888814df89c4358d7ddb3fa4b0213e7331239a80e1f013eaa7b2deca2a41a218 +m/44'/60'/0'/0/1,0xe22AD83A0dE117bA0d03d5E94Eb4E0d80a69C62a,0x03481404e1b0541b51468cec6b46baf400a56b3f5c6aeee4a2cc75c8175233fc35,0x570b909da9669b2f35a0b1ac70b8358516d55ae1b5b3710e95e9a94395090597 +m/44'/60'/0'/0/2,0xf1ac8Dd1f6D6F5c0dA99097c57ebF50CD99Ce293,0x02c3ba9ca4321c7ed9dbe9ead24a6b00a79c0e62c1b560e31108ece7ac55f886e5,0x111b7500bdce494d6f4bcfe8c2a0dde2ef92f751d9070fac6475dbd6d8021b3f +m/44'/60'/0'/0/3,0x9d2edB2B30Bce41375179571944A3f92636ce1Cd,0x02b1ff366ff445fe36bc45a37c37c160552442486832036ae95e186b19692999c9,0xfb1e9af328c283ca3e2486e7c24d13582b7912057d8b9542ff41503c85bc05c0 +m/44'/60'/0'/0/4,0x5D81E609c15E292Bb8255bd9b1B2494DC0386062,0x035edb8877dc2c467e5cd5c8d6020d8af8348ad3106a227132bb0843d95628ec09,0xbe4aa664815ea3bc3d63118649a733f6c96b243744310806ecb6d96359ab62cf +m/44'/60'/0'/0/5,0x5929AD4A1d6B899065AcF2a66d5EB086a2863bEe,0x02f8e160837d711d47664264d3ac67be996f71886ded509496172584268c4d3a15,0x6177345b77c4069ac4d553f8b43cf68a799ca4bb63eac93d6cf796d63694ebf0 diff --git a/container-build/cerc-fixturenet-eth-geth/genesis/accounts/import_keys.sh b/container-build/cerc-fixturenet-eth-geth/genesis/accounts/import_keys.sh new file mode 100755 index 00000000..4261338e --- /dev/null +++ b/container-build/cerc-fixturenet-eth-geth/genesis/accounts/import_keys.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +ACCOUNT_PASSWORD=${ACCOUNT_PASSWORD:-secret1212} + +for line in `cat accounts.csv`; do + BIP44_PATH="`echo "$line" | cut -d',' -f1`" + ADDRESS="`echo "$line" | cut -d',' -f2`" + PUBLIC_KEY="`echo "$line" | cut -d',' -f3`" + PRIVATE_KEY="`echo "$line" | cut -d',' -f4`" + + echo "$ACCOUNT_PASSWORD" > .pw.$$ + echo "$PRIVATE_KEY" | sed 's/0x//' > .key.$$ + + echo "" + echo "$ADDRESS" + geth account import --password .pw.$$ .key.$$ + rm -f .pw.$$ .key.$$ +done diff --git a/container-build/cerc-fixturenet-eth-geth/genesis/el/build_el.sh b/container-build/cerc-fixturenet-eth-geth/genesis/el/build_el.sh new file mode 100755 index 00000000..caea1b76 --- /dev/null +++ b/container-build/cerc-fixturenet-eth-geth/genesis/el/build_el.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +# See: https://github.com/skylenet/ethereum-genesis-generator/blob/master/entrypoint.sh + +rm -rf ../build/el +mkdir -p ../build/el + +tmp_dir=$(mktemp -d -t ci-XXXXXXXXXX) +envsubst < el-config.yaml > $tmp_dir/genesis-config.yaml +python3 /apps/el-gen/genesis_geth.py $tmp_dir/genesis-config.yaml > ../build/el/geth.json +python3 /apps/el-gen/genesis_chainspec.py $tmp_dir/genesis-config.yaml > ../build/el/chainspec.json +python3 /apps/el-gen/genesis_besu.py $tmp_dir/genesis-config.yaml > ../build/el/besu.json diff --git a/container-build/cerc-fixturenet-eth-geth/genesis/el/el-config.yaml b/container-build/cerc-fixturenet-eth-geth/genesis/el/el-config.yaml new file mode 100644 index 00000000..7beb9c80 --- /dev/null +++ b/container-build/cerc-fixturenet-eth-geth/genesis/el/el-config.yaml @@ -0,0 +1,21 @@ +mnemonic: "viable ketchup woman library opinion copy rhythm attend rose knock penalty practice photo bundle budget dentist enter round bind holiday useful arch danger lobster" +eth1_premine: + "m/44'/60'/0'/0/0": 10000000ETH + "m/44'/60'/0'/0/1": 10000000ETH + "m/44'/60'/0'/0/2": 10000000ETH + "m/44'/60'/0'/0/3": 10000000ETH + "m/44'/60'/0'/0/4": 10000000ETH + "m/44'/60'/0'/0/5": 10000000ETH +eth1_premine_addrs: {} +chain_id: 1212 +deposit_contract_address: "0x1212121212121212121212121212121212121212" +eth1_genesis_timestamp: 0 +terminal_total_difficulty: 10000000 +mergeForkBlock: 100 + +clique: + enabled: false + signers: + - 36d56343bc308d4ffaac2f793d121aba905fa6cc + - 5e762d4a3847cadaf40a4b0c39574b0ff6698c78 + - 15d7acc1019fdf8ab4f0f7bd31ec1487ecb5a2bd diff --git a/container-build/cerc-fixturenet-eth-geth/run-el.sh b/container-build/cerc-fixturenet-eth-geth/run-el.sh new file mode 100755 index 00000000..857ca2e0 --- /dev/null +++ b/container-build/cerc-fixturenet-eth-geth/run-el.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +if [ "true" == "$RUN_BOOTNODE" ]; then + geth \ + --nodekeyhex="b0ac22adcad37213c7c565810a50f1772291e7b0ce53fb73e7ec2a3c75bc13b5" \ + --nodiscover \ + --ipcdisable \ + --networkid=${NETWORK_ID} \ + --netrestrict="172.16.254.0/28" 2>&1 | tee /var/log/geth_bootnode.log +else + cd /opt/testnet/accounts + ./import_keys.sh + + echo -n "$JWT" > /opt/testnet/build/el/jwtsecret + + geth \ + --bootnodes="${ENODE}" \ + --allow-insecure-unlock \ + --http \ + --http.addr="0.0.0.0" \ + --http.vhosts="*" \ + --http.api="eth,web3,net,admin,personal" \ + --http.corsdomain="*" \ + --authrpc.addr="0.0.0.0" \ + --authrpc.vhosts="*" \ + --authrpc.jwtsecret="/opt/testnet/build/el/jwtsecret" \ + --networkid=${NETWORK_ID} \ + --netrestrict="172.16.254.0/28" \ + --syncmode=full \ + --mine \ + --miner.threads=1 \ + --miner.etherbase=${ETHERBASE} 2>&1 | tee /var/log/geth.log +fi diff --git a/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile b/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile new file mode 100644 index 00000000..7b53397c --- /dev/null +++ b/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile @@ -0,0 +1,30 @@ +FROM sigp/lcli AS lcli +FROM skylenet/ethereum-genesis-generator AS ethgen +FROM cerc/fixturenet-eth-geth:local AS fnetgeth + +FROM cerc/lighthouse:local + +# cerc/lighthouse is based on Ubuntu +RUN apt-get update && apt-get -y upgrade && apt-get install -y --no-install-recommends \ + libssl-dev ca-certificates \ + curl socat iproute2 telnet wget jq \ + build-essential python3 python3-dev python3-pip gettext-base \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +COPY genesis /opt/testnet +COPY run-cl.sh /opt/testnet/run.sh + +COPY --from=lcli /usr/local/bin/lcli /usr/local/bin/lcli +COPY --from=ethgen /usr/local/bin/eth2-testnet-genesis /usr/local/bin/eth2-testnet-genesis +COPY --from=ethgen /usr/local/bin/eth2-val-tools /usr/local/bin/eth2-val-tools +COPY --from=ethgen /apps /apps +COPY --from=fnetgeth /opt/testnet/el /opt/testnet/el +COPY --from=fnetgeth /opt/testnet/accounts /opt/testnet/accounts + +RUN cd /opt/testnet && make genesis-cl + +# Work around some bugs in lcli where the default path is always used. +RUN mkdir -p /root/.lighthouse && cd /root/.lighthouse && ln -s /opt/testnet/build/cl/testnet + +ENTRYPOINT ["/opt/testnet/run.sh"] diff --git a/container-build/cerc-fixturenet-eth-lighthouse/build.sh b/container-build/cerc-fixturenet-eth-lighthouse/build.sh new file mode 100755 index 00000000..bc48fde0 --- /dev/null +++ b/container-build/cerc-fixturenet-eth-lighthouse/build.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +# Build cerc/fixturenet-eth-lighthouse + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t cerc/fixturenet-eth-lighthouse:local -f ${SCRIPT_DIR}/Dockerfile $SCRIPT_DIR diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/Makefile b/container-build/cerc-fixturenet-eth-lighthouse/genesis/Makefile new file mode 100644 index 00000000..5a91fbb1 --- /dev/null +++ b/container-build/cerc-fixturenet-eth-lighthouse/genesis/Makefile @@ -0,0 +1,13 @@ +.PHONY: build +build: genesis + +.PHONY: genesis +genesis: genesis-cl + +.PHONY: genesis-cl +genesis-cl: + cd cl; ./build_cl.sh + +.PHONY: clean +clean: + rm -rf build diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh new file mode 100755 index 00000000..026d40e1 --- /dev/null +++ b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash + +# See: https://github.com/sigp/lighthouse/blob/stable/scripts/local_testnet/beacon_node.sh +# +# Starts a beacon node based upon a genesis state created by `./setup.sh`. +# + +set -Eeuo pipefail + +source ./vars.env + +SUBSCRIBE_ALL_SUBNETS= +DEBUG_LEVEL=${DEBUG_LEVEL:-info} + +# Get positional arguments +data_dir=$DATADIR/node_${NODE_NUMBER} +network_port=9001 +http_port=8001 +authrpc_port=8551 + +ENR=`cat $DATADIR/bootnode/enr.dat` +ENR_IP=`ip addr | grep 172 | awk '{print $2}' | cut -d '/' -f1` + +exec lighthouse \ + --debug-level $DEBUG_LEVEL \ + bn \ + $SUBSCRIBE_ALL_SUBNETS \ + --boot-nodes "$ENR" \ + --datadir $data_dir \ + --testnet-dir $TESTNET_DIR \ + --enable-private-discovery \ + --staking \ + --enr-address $ENR_IP \ + --enr-udp-port $network_port \ + --enr-tcp-port $network_port \ + --port $network_port \ + --http-address 0.0.0.0 \ + --http-port $http_port \ + --disable-packet-filter \ + --execution-endpoint $EXECUTION_ENDPOINT \ + --execution-jwt $JWTSECRET \ + --terminal-total-difficulty-override $ETH1_TTD \ + --suggested-fee-recipient $SUGGESTED_FEE_RECIPIENT \ + --target-peers $((BN_COUNT - 1)) diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/bootnode.sh b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/bootnode.sh new file mode 100755 index 00000000..50d460fc --- /dev/null +++ b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/bootnode.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +# See: https://github.com/sigp/lighthouse/blob/stable/scripts/local_testnet/bootnode.sh +# +# Starts a bootnode from the generated enr. +# + +set -Eeuo pipefail + +source ./vars.env + +DEBUG_LEVEL=${1:-info} + +echo "Starting bootnode" + +exec lighthouse boot_node \ + --testnet-dir $TESTNET_DIR \ + --port $BOOTNODE_PORT \ + --listen-address 0.0.0.0 \ + --disable-packet-filter \ + --network-dir $DATADIR/bootnode \ diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/build_cl.sh b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/build_cl.sh new file mode 100755 index 00000000..32b3e6f4 --- /dev/null +++ b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/build_cl.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash + +# +# Deploys the deposit contract and makes deposits for $VALIDATOR_COUNT insecure deterministic validators. +# Produces a testnet specification and a genesis state where the genesis time +# is now + $GENESIS_DELAY. +# +# Generates datadirs for multiple validator keys according to the +# $VALIDATOR_COUNT and $BN_COUNT variables. +# + +set -o nounset -o errexit -o pipefail + +source ./vars.env + +rm -rf $DATADIR +mkdir -p $DATADIR + +NOW=`date +%s` +GENESIS_TIME=`expr $NOW + $GENESIS_DELAY` + +echo "Creating testnet ..." +lcli \ + new-testnet \ + --spec $SPEC_PRESET \ + --deposit-contract-address $ETH1_DEPOSIT_CONTRACT_ADDRESS \ + --testnet-dir $TESTNET_DIR \ + --min-genesis-active-validator-count $GENESIS_VALIDATOR_COUNT \ + --min-genesis-time $GENESIS_TIME \ + --genesis-delay $GENESIS_DELAY \ + --genesis-fork-version $GENESIS_FORK_VERSION \ + --altair-fork-epoch $ALTAIR_FORK_EPOCH \ + --merge-fork-epoch $MERGE_FORK_EPOCH \ + --eth1-id $ETH1_CHAIN_ID \ + --eth1-follow-distance 1 \ + --seconds-per-slot $SECONDS_PER_SLOT \ + --seconds-per-eth1-block $SECONDS_PER_ETH1_BLOCK \ + --force + +echo Specification generated at $TESTNET_DIR. +echo "Generating $VALIDATOR_COUNT validators concurrently... (this may take a while)" + +lcli \ + insecure-validators \ + --count $VALIDATOR_COUNT \ + --base-dir $DATADIR \ + --node-count $BN_COUNT + +echo Validators generated with keystore passwords at $DATADIR. +echo "Building genesis state... (this might take a while)" + +lcli \ + interop-genesis \ + --spec $SPEC_PRESET \ + --genesis-time $GENESIS_TIME \ + --testnet-dir $TESTNET_DIR \ + $GENESIS_VALIDATOR_COUNT + +echo Created genesis state in $TESTNET_DIR + +echo "Generating bootnode enr" + +lcli \ + generate-bootnode-enr \ + --ip $BOOTNODE_IP \ + --udp-port $BOOTNODE_PORT \ + --tcp-port $BOOTNODE_PORT \ + --genesis-fork-version $GENESIS_FORK_VERSION \ + --output-dir $DATADIR/bootnode + +bootnode_enr=`cat $DATADIR/bootnode/enr.dat` +echo "- $bootnode_enr" > $TESTNET_DIR/boot_enr.yaml + +echo "Generated bootnode enr and written to $TESTNET_DIR/boot_enr.yaml" diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/reset_genesis_time.sh b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/reset_genesis_time.sh new file mode 100755 index 00000000..a8cc2e2b --- /dev/null +++ b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/reset_genesis_time.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# See: https://github.com/sigp/lighthouse/blob/stable/scripts/local_testnet/reset_genesis_time.sh +# +# Resets the beacon state genesis time to now. +# + +set -Eeuo pipefail + +source ./vars.env + +NOW=${1:-`date +%s`} + +lcli \ + change-genesis-time \ + $TESTNET_DIR/genesis.ssz \ + $NOW + +echo "Reset genesis time to now ($NOW)" diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/validator_client.sh b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/validator_client.sh new file mode 100755 index 00000000..c7f0dba4 --- /dev/null +++ b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/validator_client.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +# See: https://github.com/sigp/lighthouse/blob/stable/scripts/local_testnet/validator_client.sh +# +# Usage: ./validator_client.sh + +set -Eeuo pipefail + +source ./vars.env + +DEBUG_LEVEL=info + +BUILDER_PROPOSALS= + +# Get options +while getopts "pd:" flag; do + case "${flag}" in + p) BUILDER_PROPOSALS="--builder-proposals";; + d) DEBUG_LEVEL=${OPTARG};; + esac +done + +exec lighthouse \ + --debug-level $DEBUG_LEVEL \ + vc \ + $BUILDER_PROPOSALS \ + --validators-dir $DATADIR/node_$NODE_NUMBER/validators \ + --secrets-dir $DATADIR/node_$NODE_NUMBER/secrets \ + --testnet-dir $TESTNET_DIR \ + --init-slashing-protection \ + --beacon-nodes http://localhost:8001 \ + --suggested-fee-recipient $SUGGESTED_FEE_RECIPIENT \ + $VC_ARGS diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/vars.env b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/vars.env new file mode 100644 index 00000000..ccc82028 --- /dev/null +++ b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/vars.env @@ -0,0 +1,52 @@ +# Base directories for the validator keys and secrets +DATADIR=${DATADIR:-../build/cl} + +# Directory for the eth2 config +TESTNET_DIR=${TESTNET_DIR:-$DATADIR/testnet} +JWTSECRET=${JWTSECRET:-$DATADIR/jwtsecret} + +GENESIS_FORK_VERSION=${GENESIS_FORK_VERSION:-0x12121212} + +VALIDATOR_COUNT=${VALIDATOR_COUNT:-80} +GENESIS_VALIDATOR_COUNT=${GENESIS_VALIDATOR_COUNT:-80} + +# Number of beacon_node instances that you intend to run +BN_COUNT=${BN_COUNT:-2} + +# Number of validator clients +VC_COUNT=${VC_COUNT:-$BN_COUNT} + +# Number of seconds to delay to start genesis block. +# If started by a script this can be 0, if starting by hand +# use something like 180. +GENESIS_DELAY=${GENESIS_DELAY:-0} + +# Port for P2P communication with bootnode +BOOTNODE_IP=${BOOTNODE_IP:-172.16.254.11} +BOOTNODE_PORT=${BOOTNODE_PORT:-4242} + +# Hard fork configuration +ALTAIR_FORK_EPOCH=${ALTAIR_FORK_EPOCH:-1} +MERGE_FORK_EPOCH=${MERGE_FORK_EPOCH:-2} + +# Spec version (mainnet or minimal) +SPEC_PRESET=${SPEC_PRESET:-mainnet} + +# Seconds per Eth2 slot +SECONDS_PER_SLOT=${SECONDS_PER_SLOT:-3} + +# Seconds per Eth1 block +SECONDS_PER_ETH1_BLOCK=${SECONDS_PER_ETH1_BLOCK:-1} + +# Command line arguments for validator client +VC_ARGS=${VC_ARGS:-""} + +EXECUTION_ENDPOINT=${EXECUTION_ENDPOINT:-http://localhost:8551} + +ETH1_CONFIG_YAML=${ETH1_CONFIG_YAML:-"../el/el-config.yaml"} + +ETH1_CHAIN_ID=${ETH1_CHAIN_ID:-`cat $ETH1_CONFIG_YAML | grep 'chain_id' | awk '{ print $2 }'`} +ETH1_TTD=${ETH1_TTD:-`cat $ETH1_CONFIG_YAML | grep 'terminal_total_difficulty' | awk '{ print $2 }'`} +ETH1_DEPOSIT_CONTRACT_ADDRESS=${ETH1_DEPOSIT_CONTRACT_ADDRESS:-`cat $ETH1_CONFIG_YAML | grep 'deposit_contract_address' | awk '{ print $2 }' | sed 's/"//g'`} +ETH1_DEPOSIT_CONTRACT_BLOCK=${ETH1_DEPOSIT_CONTRACT_BLOCK:-0x0} +SUGGESTED_FEE_RECIPIENT=`cat ../accounts/accounts.csv | head -1 | cut -d',' -f2` diff --git a/container-build/cerc-fixturenet-eth-lighthouse/run-cl.sh b/container-build/cerc-fixturenet-eth-lighthouse/run-cl.sh new file mode 100755 index 00000000..9e7c653e --- /dev/null +++ b/container-build/cerc-fixturenet-eth-lighthouse/run-cl.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +if [ "true" == "$RUN_BOOTNODE" ]; then + cd /opt/testnet/cl + ./bootnode.sh 2>&1 | tee /var/log/lighthouse_bootnode.log +else + while [ 1 -eq 1 ]; do + echo "Waiting on DAG ..." + sleep 5 + result=`wget --no-check-certificate --quiet \ + -O - \ + --method POST \ + --timeout=0 \ + --header 'Content-Type: application/json' \ + --body-data '{ "jsonrpc": "2.0", "id": 1, "method": "eth_getBlockByNumber", "params": ["0x3", false] }' "${ETH1_ENDPOINT:-localhost:8545}" | jq -r '.result'` + if [ ! -z "$result" ] && [ "null" != "$result" ]; then + break + fi + done + + cd /opt/testnet/cl + + if [ -z "$LIGHTHOUSE_GENESIS_STATE_URL" ]; then + ./reset_genesis_time.sh + else + while [ 1 -eq 1 ]; do + echo "Waiting on Genesis time ..." + sleep 5 + result=`wget --no-check-certificate --quiet -O - --timeout=0 $LIGHTHOUSE_GENESIS_STATE_URL | jq -r '.data.genesis_time'` + if [ ! -z "$result" ]; then + ./reset_genesis_time.sh $result + break; + fi + done + fi + + export JWTSECRET="/opt/testnet/build/cl/jwtsecret" + echo -n "$JWT" > $JWTSECRET + + ./beacon_node.sh 2>&1 | tee /var/log/lighthouse_bn.log & + lpid=$! + ./validator_client.sh 2>&1 | tee /var/log/lighthouse_vc.log & + vpid=$! + + wait $lpid $vpid +fi + diff --git a/container-image-list.txt b/container-image-list.txt index ff225f60..c2e6f6d8 100644 --- a/container-image-list.txt +++ b/container-image-list.txt @@ -10,3 +10,5 @@ cerc/ipld-eth-beacon-indexer cerc/ipld-eth-server cerc/laconicd cerc/laconic-client +cerc/fixturenet-eth-geth +cerc/fixturenet-eth-lighthouse diff --git a/pod-list.txt b/pod-list.txt index a09aa826..09a7baa5 100644 --- a/pod-list.txt +++ b/pod-list.txt @@ -8,3 +8,4 @@ ipld-eth-server lighthouse prometheus-grafana laconicd +fixturenet-eth From 2bd5c729dceb6535801f5feca643ccdbbfef1dd8 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Fri, 14 Oct 2022 13:48:54 -0500 Subject: [PATCH 0082/1010] Use config/ --- compose/docker-compose-fixturenet-eth.yml | 25 ++++++++----------- config/fixturenet-eth/fixturenet-eth.env | 11 ++++++++ .../cerc-fixturenet-eth-geth/run-el.sh | 7 ++++-- 3 files changed, 26 insertions(+), 17 deletions(-) create mode 100644 config/fixturenet-eth/fixturenet-eth.env diff --git a/compose/docker-compose-fixturenet-eth.yml b/compose/docker-compose-fixturenet-eth.yml index d1c957ea..94c573de 100644 --- a/compose/docker-compose-fixturenet-eth.yml +++ b/compose/docker-compose-fixturenet-eth.yml @@ -3,9 +3,10 @@ version: '3.7' services: fixturenet-eth-bootnode-geth: hostname: fixturenet-eth-bootnode-geth + env_file: + - ../config/fixturenet-eth/fixturenet-eth.env environment: RUN_BOOTNODE: "true" - NETWORK_ID: "1212" image: cerc/fixturenet-eth-geth:local networks: fixturenet-eth-net: @@ -13,12 +14,8 @@ services: fixturenet-eth-geth-1: hostname: fixturenet-eth-geth-1 - environment: - NETWORK_ID: "1212" - ACCOUNT_PASSWORD: "secret1212" - ETHERBASE: "0xe6CE22afe802CAf5fF7d3845cec8c736ecc8d61F" - ENODE: "enode://af22c29c316ad069cf48a09a4ad5cf04a251b411e45098888d114c6dd7f489a13786620d5953738762afa13711d4ffb3b19aa5de772d8af72f851f7e9c5b164a@fixturenet-eth-bootnode-geth:30303" - JWT: "0x6cdcac3501046a08e186730dd8bd136cfaf0fdc1fc955f6e15ad3068c0ff2af0" + env_file: + - ../config/fixturenet-eth/fixturenet-eth.env image: cerc/fixturenet-eth-geth:local depends_on: - fixturenet-eth-bootnode-geth @@ -29,12 +26,8 @@ services: fixturenet-eth-geth-2: hostname: fixturenet-eth-geth-2 - environment: - NETWORK_ID: "1212" - ACCOUNT_PASSWORD: "secret1212" - ETHERBASE: "0xe6CE22afe802CAf5fF7d3845cec8c736ecc8d61F" - ENODE: "enode://af22c29c316ad069cf48a09a4ad5cf04a251b411e45098888d114c6dd7f489a13786620d5953738762afa13711d4ffb3b19aa5de772d8af72f851f7e9c5b164a@fixturenet-eth-bootnode-geth:30303" - JWT: "0x6cdcac3501046a08e186730dd8bd136cfaf0fdc1fc955f6e15ad3068c0ff2af0" + env_file: + - ../config/fixturenet-eth/fixturenet-eth.env image: cerc/fixturenet-eth-geth:local depends_on: - fixturenet-eth-bootnode-geth @@ -52,9 +45,10 @@ services: fixturenet-eth-lighthouse-1: hostname: fixturenet-eth-lighthouse-1 + env_file: + - ../config/fixturenet-eth/fixturenet-eth.env environment: NODE_NUMBER: "1" - JWT: "0x6cdcac3501046a08e186730dd8bd136cfaf0fdc1fc955f6e15ad3068c0ff2af0" ETH1_ENDPOINT: "http://fixturenet-eth-geth-1:8545" EXECUTION_ENDPOINT: "http://fixturenet-eth-geth-1:8551" image: cerc/fixturenet-eth-lighthouse:local @@ -68,9 +62,10 @@ services: fixturenet-eth-lighthouse-2: hostname: fixturenet-eth-lighthouse-2 + env_file: + - ../config/fixturenet-eth/fixturenet-eth.env environment: NODE_NUMBER: "2" - JWT: "0x6cdcac3501046a08e186730dd8bd136cfaf0fdc1fc955f6e15ad3068c0ff2af0" ETH1_ENDPOINT: "http://fixturenet-eth-geth-2:8545" EXECUTION_ENDPOINT: "http://fixturenet-eth-geth-2:8551" LIGHTHOUSE_GENESIS_STATE_URL: "http://fixturenet-eth-lighthouse-1:8001/eth/v2/debug/beacon/states/0" diff --git a/config/fixturenet-eth/fixturenet-eth.env b/config/fixturenet-eth/fixturenet-eth.env new file mode 100644 index 00000000..c4088e69 --- /dev/null +++ b/config/fixturenet-eth/fixturenet-eth.env @@ -0,0 +1,11 @@ +# The password used to access test accounts (eg, via personal_unlockAccount). The password is the same for all accounts. +ACCOUNT_PASSWORD=secret1212 + +# ENODE of the geth bootnode. +ENODE="enode://af22c29c316ad069cf48a09a4ad5cf04a251b411e45098888d114c6dd7f489a13786620d5953738762afa13711d4ffb3b19aa5de772d8af72f851f7e9c5b164a@fixturenet-eth-bootnode-geth:30303" + +# JWT shared by geth and lighthouse for authentication. +JWT="0x6cdcac3501046a08e186730dd8bd136cfaf0fdc1fc955f6e15ad3068c0ff2af0" + +# Should match the definition of fixturenet-eth-net. +NETRESTRICT="172.16.254.0/28" diff --git a/container-build/cerc-fixturenet-eth-geth/run-el.sh b/container-build/cerc-fixturenet-eth-geth/run-el.sh index 857ca2e0..657dd719 100755 --- a/container-build/cerc-fixturenet-eth-geth/run-el.sh +++ b/container-build/cerc-fixturenet-eth-geth/run-el.sh @@ -1,12 +1,15 @@ #!/bin/bash +ETHERBASE=`cat /opt/testnet/accounts/accounts.csv | head -1 | cut -d',' -f2` +NETWORK_ID=`cat /opt/testnet/el/el-config.yaml | grep 'chain_id' | awk '{ print $2 }'` + if [ "true" == "$RUN_BOOTNODE" ]; then geth \ --nodekeyhex="b0ac22adcad37213c7c565810a50f1772291e7b0ce53fb73e7ec2a3c75bc13b5" \ --nodiscover \ --ipcdisable \ --networkid=${NETWORK_ID} \ - --netrestrict="172.16.254.0/28" 2>&1 | tee /var/log/geth_bootnode.log + --netrestrict="${NETRESTRICT}" 2>&1 | tee /var/log/geth_bootnode.log else cd /opt/testnet/accounts ./import_keys.sh @@ -25,7 +28,7 @@ else --authrpc.vhosts="*" \ --authrpc.jwtsecret="/opt/testnet/build/el/jwtsecret" \ --networkid=${NETWORK_ID} \ - --netrestrict="172.16.254.0/28" \ + --netrestrict="${NETRESTRICT}" \ --syncmode=full \ --mine \ --miner.threads=1 \ From 6ec6fc1d75e1c79f36cb281da552e072ab6b96cb Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Fri, 14 Oct 2022 14:32:35 -0500 Subject: [PATCH 0083/1010] Add comment and minor fix. --- compose/docker-compose-fixturenet-eth.yml | 2 ++ .../cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/compose/docker-compose-fixturenet-eth.yml b/compose/docker-compose-fixturenet-eth.yml index 94c573de..ad79814c 100644 --- a/compose/docker-compose-fixturenet-eth.yml +++ b/compose/docker-compose-fixturenet-eth.yml @@ -77,6 +77,8 @@ services: fixturenet-eth-net: networks: + # When the bootnode ENR is generated during the build, it requires a specific IP. + # The easiest way to do that is to use a private network. fixturenet-eth-net: driver: bridge ipam: diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh index 026d40e1..3bd67723 100755 --- a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh +++ b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh @@ -19,7 +19,6 @@ http_port=8001 authrpc_port=8551 ENR=`cat $DATADIR/bootnode/enr.dat` -ENR_IP=`ip addr | grep 172 | awk '{print $2}' | cut -d '/' -f1` exec lighthouse \ --debug-level $DEBUG_LEVEL \ @@ -30,7 +29,7 @@ exec lighthouse \ --testnet-dir $TESTNET_DIR \ --enable-private-discovery \ --staking \ - --enr-address $ENR_IP \ + --enr-address $BOOTNODE_IP \ --enr-udp-port $network_port \ --enr-tcp-port $network_port \ --port $network_port \ From 78c79f2653e1887f9d79585ef2d89c59234303fb Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Fri, 14 Oct 2022 14:36:49 -0500 Subject: [PATCH 0084/1010] Review comment --- container-build/cerc-fixturenet-eth-geth/Dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/container-build/cerc-fixturenet-eth-geth/Dockerfile b/container-build/cerc-fixturenet-eth-geth/Dockerfile index ababbfad..d3cf2f95 100644 --- a/container-build/cerc-fixturenet-eth-geth/Dockerfile +++ b/container-build/cerc-fixturenet-eth-geth/Dockerfile @@ -14,8 +14,6 @@ COPY run-el.sh /opt/testnet/run.sh RUN cd /opt/testnet && make genesis-el -RUN chmod a+x /usr/local/bin/* -RUN ls -l /usr/local/bin RUN geth init /opt/testnet/build/el/geth.json && rm -f ~/.ethereum/geth/nodekey ENTRYPOINT ["/opt/testnet/run.sh"] From 9e9bb34aee9c1190ea3147d1c17e1d59e1864809 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Fri, 14 Oct 2022 16:58:46 -0500 Subject: [PATCH 0085/1010] Auto-generate accounts.csv (#25) * Auto-generate accounts.csv --- .../genesis/accounts/accounts.csv | 6 ------ .../genesis/accounts/import_keys.sh | 5 ++--- .../genesis/accounts/mnemonic_to_csv.py | 17 +++++++++++++++++ .../genesis/el/build_el.sh | 4 ++-- .../cerc-fixturenet-eth-geth/run-el.sh | 2 +- .../cerc-fixturenet-eth-lighthouse/Dockerfile | 2 +- .../genesis/cl/vars.env | 2 +- 7 files changed, 24 insertions(+), 14 deletions(-) delete mode 100644 container-build/cerc-fixturenet-eth-geth/genesis/accounts/accounts.csv create mode 100644 container-build/cerc-fixturenet-eth-geth/genesis/accounts/mnemonic_to_csv.py diff --git a/container-build/cerc-fixturenet-eth-geth/genesis/accounts/accounts.csv b/container-build/cerc-fixturenet-eth-geth/genesis/accounts/accounts.csv deleted file mode 100644 index 9f027f71..00000000 --- a/container-build/cerc-fixturenet-eth-geth/genesis/accounts/accounts.csv +++ /dev/null @@ -1,6 +0,0 @@ -m/44'/60'/0'/0/0,0xe6CE22afe802CAf5fF7d3845cec8c736ecc8d61F,0x02cfc16a6212d7bb9dff89b603afbd856157c367de3ef6b626f205d9b150630ea0,0x888814df89c4358d7ddb3fa4b0213e7331239a80e1f013eaa7b2deca2a41a218 -m/44'/60'/0'/0/1,0xe22AD83A0dE117bA0d03d5E94Eb4E0d80a69C62a,0x03481404e1b0541b51468cec6b46baf400a56b3f5c6aeee4a2cc75c8175233fc35,0x570b909da9669b2f35a0b1ac70b8358516d55ae1b5b3710e95e9a94395090597 -m/44'/60'/0'/0/2,0xf1ac8Dd1f6D6F5c0dA99097c57ebF50CD99Ce293,0x02c3ba9ca4321c7ed9dbe9ead24a6b00a79c0e62c1b560e31108ece7ac55f886e5,0x111b7500bdce494d6f4bcfe8c2a0dde2ef92f751d9070fac6475dbd6d8021b3f -m/44'/60'/0'/0/3,0x9d2edB2B30Bce41375179571944A3f92636ce1Cd,0x02b1ff366ff445fe36bc45a37c37c160552442486832036ae95e186b19692999c9,0xfb1e9af328c283ca3e2486e7c24d13582b7912057d8b9542ff41503c85bc05c0 -m/44'/60'/0'/0/4,0x5D81E609c15E292Bb8255bd9b1B2494DC0386062,0x035edb8877dc2c467e5cd5c8d6020d8af8348ad3106a227132bb0843d95628ec09,0xbe4aa664815ea3bc3d63118649a733f6c96b243744310806ecb6d96359ab62cf -m/44'/60'/0'/0/5,0x5929AD4A1d6B899065AcF2a66d5EB086a2863bEe,0x02f8e160837d711d47664264d3ac67be996f71886ded509496172584268c4d3a15,0x6177345b77c4069ac4d553f8b43cf68a799ca4bb63eac93d6cf796d63694ebf0 diff --git a/container-build/cerc-fixturenet-eth-geth/genesis/accounts/import_keys.sh b/container-build/cerc-fixturenet-eth-geth/genesis/accounts/import_keys.sh index 4261338e..719b9f59 100755 --- a/container-build/cerc-fixturenet-eth-geth/genesis/accounts/import_keys.sh +++ b/container-build/cerc-fixturenet-eth-geth/genesis/accounts/import_keys.sh @@ -2,11 +2,10 @@ ACCOUNT_PASSWORD=${ACCOUNT_PASSWORD:-secret1212} -for line in `cat accounts.csv`; do +for line in `cat ../build/el/accounts.csv`; do BIP44_PATH="`echo "$line" | cut -d',' -f1`" ADDRESS="`echo "$line" | cut -d',' -f2`" - PUBLIC_KEY="`echo "$line" | cut -d',' -f3`" - PRIVATE_KEY="`echo "$line" | cut -d',' -f4`" + PRIVATE_KEY="`echo "$line" | cut -d',' -f3`" echo "$ACCOUNT_PASSWORD" > .pw.$$ echo "$PRIVATE_KEY" | sed 's/0x//' > .key.$$ diff --git a/container-build/cerc-fixturenet-eth-geth/genesis/accounts/mnemonic_to_csv.py b/container-build/cerc-fixturenet-eth-geth/genesis/accounts/mnemonic_to_csv.py new file mode 100644 index 00000000..730426bd --- /dev/null +++ b/container-build/cerc-fixturenet-eth-geth/genesis/accounts/mnemonic_to_csv.py @@ -0,0 +1,17 @@ +from web3.auto import w3 +import json +import ruamel.yaml as yaml +import sys + +w3.eth.account.enable_unaudited_hdwallet_features() + +testnet_config_path = "genesis-config.yaml" +if len(sys.argv) > 1: + testnet_config_path = sys.argv[1] + +with open(testnet_config_path) as stream: + data = yaml.safe_load(stream) + +for key, value in data['eth1_premine'].items(): + acct = w3.eth.account.from_mnemonic(data['mnemonic'], account_path=key, passphrase='') + print("%s,%s,%s" % (key, acct.address, acct.key.hex())) diff --git a/container-build/cerc-fixturenet-eth-geth/genesis/el/build_el.sh b/container-build/cerc-fixturenet-eth-geth/genesis/el/build_el.sh index caea1b76..5eeeba51 100755 --- a/container-build/cerc-fixturenet-eth-geth/genesis/el/build_el.sh +++ b/container-build/cerc-fixturenet-eth-geth/genesis/el/build_el.sh @@ -7,6 +7,6 @@ mkdir -p ../build/el tmp_dir=$(mktemp -d -t ci-XXXXXXXXXX) envsubst < el-config.yaml > $tmp_dir/genesis-config.yaml + python3 /apps/el-gen/genesis_geth.py $tmp_dir/genesis-config.yaml > ../build/el/geth.json -python3 /apps/el-gen/genesis_chainspec.py $tmp_dir/genesis-config.yaml > ../build/el/chainspec.json -python3 /apps/el-gen/genesis_besu.py $tmp_dir/genesis-config.yaml > ../build/el/besu.json +python3 ../accounts/mnemonic_to_csv.py $tmp_dir/genesis-config.yaml > ../build/el/accounts.csv diff --git a/container-build/cerc-fixturenet-eth-geth/run-el.sh b/container-build/cerc-fixturenet-eth-geth/run-el.sh index 657dd719..84ff72f4 100755 --- a/container-build/cerc-fixturenet-eth-geth/run-el.sh +++ b/container-build/cerc-fixturenet-eth-geth/run-el.sh @@ -1,6 +1,6 @@ #!/bin/bash -ETHERBASE=`cat /opt/testnet/accounts/accounts.csv | head -1 | cut -d',' -f2` +ETHERBASE=`cat /opt/testnet/build/el/accounts.csv | head -1 | cut -d',' -f2` NETWORK_ID=`cat /opt/testnet/el/el-config.yaml | grep 'chain_id' | awk '{ print $2 }'` if [ "true" == "$RUN_BOOTNODE" ]; then diff --git a/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile b/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile index 7b53397c..08de5537 100644 --- a/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile +++ b/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile @@ -20,7 +20,7 @@ COPY --from=ethgen /usr/local/bin/eth2-testnet-genesis /usr/local/bin/eth2-testn COPY --from=ethgen /usr/local/bin/eth2-val-tools /usr/local/bin/eth2-val-tools COPY --from=ethgen /apps /apps COPY --from=fnetgeth /opt/testnet/el /opt/testnet/el -COPY --from=fnetgeth /opt/testnet/accounts /opt/testnet/accounts +COPY --from=fnetgeth /opt/testnet/build/el /opt/testnet/build/el RUN cd /opt/testnet && make genesis-cl diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/vars.env b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/vars.env index ccc82028..b7e2a939 100644 --- a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/vars.env +++ b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/vars.env @@ -49,4 +49,4 @@ ETH1_CHAIN_ID=${ETH1_CHAIN_ID:-`cat $ETH1_CONFIG_YAML | grep 'chain_id' | awk '{ ETH1_TTD=${ETH1_TTD:-`cat $ETH1_CONFIG_YAML | grep 'terminal_total_difficulty' | awk '{ print $2 }'`} ETH1_DEPOSIT_CONTRACT_ADDRESS=${ETH1_DEPOSIT_CONTRACT_ADDRESS:-`cat $ETH1_CONFIG_YAML | grep 'deposit_contract_address' | awk '{ print $2 }' | sed 's/"//g'`} ETH1_DEPOSIT_CONTRACT_BLOCK=${ETH1_DEPOSIT_CONTRACT_BLOCK:-0x0} -SUGGESTED_FEE_RECIPIENT=`cat ../accounts/accounts.csv | head -1 | cut -d',' -f2` +SUGGESTED_FEE_RECIPIENT=`cat ../build/el/accounts.csv | head -1 | cut -d',' -f2` From efd40052cb1ca84cb60eebe56199a1828db62606 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Fri, 14 Oct 2022 17:25:00 -0500 Subject: [PATCH 0086/1010] Restore ENR_IP. --- .../cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh index 3bd67723..026d40e1 100755 --- a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh +++ b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh @@ -19,6 +19,7 @@ http_port=8001 authrpc_port=8551 ENR=`cat $DATADIR/bootnode/enr.dat` +ENR_IP=`ip addr | grep 172 | awk '{print $2}' | cut -d '/' -f1` exec lighthouse \ --debug-level $DEBUG_LEVEL \ @@ -29,7 +30,7 @@ exec lighthouse \ --testnet-dir $TESTNET_DIR \ --enable-private-discovery \ --staking \ - --enr-address $BOOTNODE_IP \ + --enr-address $ENR_IP \ --enr-udp-port $network_port \ --enr-tcp-port $network_port \ --port $network_port \ From 5fffecaea16e457bb16a0c8cf600b4c19a5cd4eb Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sat, 22 Oct 2022 18:28:31 -0600 Subject: [PATCH 0087/1010] Add missing python-dev package, previously present in an older revision of the golang-alpine base image --- container-build/cerc-fixturenet-eth-geth/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/container-build/cerc-fixturenet-eth-geth/Dockerfile b/container-build/cerc-fixturenet-eth-geth/Dockerfile index d3cf2f95..068291a2 100644 --- a/container-build/cerc-fixturenet-eth-geth/Dockerfile +++ b/container-build/cerc-fixturenet-eth-geth/Dockerfile @@ -1,7 +1,7 @@ FROM skylenet/ethereum-genesis-generator AS ethgen FROM cerc/go-ethereum:local -RUN apk add --no-cache python3 py3-pip curl wget jq build-base gettext libintl openssl bash +RUN apk add --no-cache python3 python3-dev py3-pip curl wget jq build-base gettext libintl openssl bash COPY --from=ethgen /usr/local/bin/eth2-testnet-genesis /usr/local/bin/eth2-testnet-genesis COPY --from=ethgen /usr/local/bin/eth2-val-tools /usr/local/bin/eth2-val-tools From 302ff755935aeae571fa6a609a88dcaf7ad9c305 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 24 Oct 2022 12:39:51 -0600 Subject: [PATCH 0088/1010] Output docker compose ps results --- app/deploy_system.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/deploy_system.py b/app/deploy_system.py index 7a5a417e..ae32d22e 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -82,7 +82,9 @@ def command(ctx, include, exclude, cluster, command): elif command == "ps": if verbose: print("Running compose ps") - docker.compose.ps() + container_list = docker.compose.ps() + for container in container_list: + print(f"id: {container.id}, name: {container.name}") elif command == "logs": if verbose: print("Running compose logs") From 548e4a8957ecc7425f464964bd566b5eca62ea1b Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 24 Oct 2022 16:02:11 -0600 Subject: [PATCH 0089/1010] Tidy up --- app/deploy_system.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/deploy_system.py b/app/deploy_system.py index ae32d22e..5534415c 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -79,12 +79,16 @@ def command(ctx, include, exclude, cluster, command): if verbose: print("Running compose down") docker.compose.down() - elif command == "ps": + elif command == "status": if verbose: print("Running compose ps") container_list = docker.compose.ps() - for container in container_list: - print(f"id: {container.id}, name: {container.name}") + if len(container_list) > 0: + print("Running containers:") + for container in container_list: + print(f"id: {container.id}, name: {container.name}") + else: + print("No containers running") elif command == "logs": if verbose: print("Running compose logs") From bb4288cc60f830a94c61c717caf072dd6286b19a Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 28 Oct 2022 14:21:02 -0600 Subject: [PATCH 0090/1010] Fixturenet for laconicd --- .../docker-compose-fixturenet-laconicd.yml | 21 +++++++++++++++++++ compose/docker-compose-laconicd.yml | 4 ---- .../create-fixturenet.sh | 2 +- pod-list.txt | 1 + 4 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 compose/docker-compose-fixturenet-laconicd.yml rename config/{laconicd => fixturenet-laconicd}/create-fixturenet.sh (97%) diff --git a/compose/docker-compose-fixturenet-laconicd.yml b/compose/docker-compose-fixturenet-laconicd.yml new file mode 100644 index 00000000..997063db --- /dev/null +++ b/compose/docker-compose-fixturenet-laconicd.yml @@ -0,0 +1,21 @@ +version: "3.2" +services: + laconicd: + restart: unless-stopped + image: cerc/laconicd:local + command: ["sh", "/docker-entrypoint-scripts.d/create-fixturenet.sh"] + volumes: + # TODO: look at folding this script into the container + - ../config/fixturenet-laconicd/create-fixturenet.sh:/docker-entrypoint-scripts.d/create-fixturenet.sh + # TODO: determine which of the ports below is really needed + ports: + - "6060" + - "26657" + - "26656" + - "9473" + - "8545" + - "8546" + - "9090" + - "9091" + - "1317" + diff --git a/compose/docker-compose-laconicd.yml b/compose/docker-compose-laconicd.yml index 4d021ed6..753283bd 100644 --- a/compose/docker-compose-laconicd.yml +++ b/compose/docker-compose-laconicd.yml @@ -3,10 +3,6 @@ services: laconicd: restart: unless-stopped image: cerc/laconicd:local - command: ["sh", "/docker-entrypoint-scripts.d/create-fixturenet.sh"] - volumes: - # TODO: look at folding this script into the container - - ../config/laconicd/create-fixturenet.sh:/docker-entrypoint-scripts.d/create-fixturenet.sh # TODO: determine which of the ports below is really needed ports: - "6060" diff --git a/config/laconicd/create-fixturenet.sh b/config/fixturenet-laconicd/create-fixturenet.sh similarity index 97% rename from config/laconicd/create-fixturenet.sh rename to config/fixturenet-laconicd/create-fixturenet.sh index 8d5115be..1bc22cef 100644 --- a/config/laconicd/create-fixturenet.sh +++ b/config/fixturenet-laconicd/create-fixturenet.sh @@ -115,4 +115,4 @@ if [[ $1 == "pending" ]]; then fi # Start the node (remove the --pruning=nothing flag if historical queries are not needed) -laconicd start --mode validator --pruning=nothing --evm.tracer=json $TRACE --log_level $LOGLEVEL --minimum-gas-prices=0.0001aphoton --json-rpc.api eth,txpool,personal,net,debug,web3,miner --api.enable --gql-server --gql-playground +laconicd start --pruning=nothing --evm.tracer=json $TRACE --log_level $LOGLEVEL --minimum-gas-prices=0.0001aphoton --json-rpc.api eth,txpool,personal,net,debug,web3,miner --api.enable diff --git a/pod-list.txt b/pod-list.txt index 09a7baa5..614a3476 100644 --- a/pod-list.txt +++ b/pod-list.txt @@ -8,4 +8,5 @@ ipld-eth-server lighthouse prometheus-grafana laconicd +fixturenet-laconicd fixturenet-eth From 88d38c780102444174d04a0ec8acf16853fb9743 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 28 Oct 2022 16:05:20 -0600 Subject: [PATCH 0091/1010] Enable GraphQL --- config/fixturenet-laconicd/create-fixturenet.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/fixturenet-laconicd/create-fixturenet.sh b/config/fixturenet-laconicd/create-fixturenet.sh index 1bc22cef..a4c8b73c 100644 --- a/config/fixturenet-laconicd/create-fixturenet.sh +++ b/config/fixturenet-laconicd/create-fixturenet.sh @@ -115,4 +115,4 @@ if [[ $1 == "pending" ]]; then fi # Start the node (remove the --pruning=nothing flag if historical queries are not needed) -laconicd start --pruning=nothing --evm.tracer=json $TRACE --log_level $LOGLEVEL --minimum-gas-prices=0.0001aphoton --json-rpc.api eth,txpool,personal,net,debug,web3,miner --api.enable +laconicd start --pruning=nothing --evm.tracer=json $TRACE --log_level $LOGLEVEL --minimum-gas-prices=0.0001aphoton --json-rpc.api eth,txpool,personal,net,debug,web3,miner --api.enable --gql-server --gql-playground From 2aae7dd59fee37c2e1560d36ff184bdaa3a26c4c Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 30 Oct 2022 20:41:05 -0600 Subject: [PATCH 0092/1010] Simple container for testing stack orchestrator --- compose/docker-compose-test.yml | 5 +++++ container-build/cerc-test-container/Dockerfile | 5 +++++ container-build/cerc-test-container/build.sh | 4 ++++ container-build/cerc-test-container/run.sh | 16 ++++++++++++++++ container-image-list.txt | 3 ++- pod-list.txt | 1 + 6 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 compose/docker-compose-test.yml create mode 100644 container-build/cerc-test-container/Dockerfile create mode 100755 container-build/cerc-test-container/build.sh create mode 100755 container-build/cerc-test-container/run.sh diff --git a/compose/docker-compose-test.yml b/compose/docker-compose-test.yml new file mode 100644 index 00000000..058b2b3b --- /dev/null +++ b/compose/docker-compose-test.yml @@ -0,0 +1,5 @@ +version: "3.2" +services: + test: + image: cerc/test-container:local + restart: always diff --git a/container-build/cerc-test-container/Dockerfile b/container-build/cerc-test-container/Dockerfile new file mode 100644 index 00000000..29b42a84 --- /dev/null +++ b/container-build/cerc-test-container/Dockerfile @@ -0,0 +1,5 @@ +FROM alpine:latest + +COPY run.sh /app/run.sh + +ENTRYPOINT ["/app/run.sh"] diff --git a/container-build/cerc-test-container/build.sh b/container-build/cerc-test-container/build.sh new file mode 100755 index 00000000..1595645c --- /dev/null +++ b/container-build/cerc-test-container/build.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +# Build cerc/test-container +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +docker build -t cerc/test-container:local -f ${SCRIPT_DIR}/Dockerfile $SCRIPT_DIR \ No newline at end of file diff --git a/container-build/cerc-test-container/run.sh b/container-build/cerc-test-container/run.sh new file mode 100755 index 00000000..5f59acab --- /dev/null +++ b/container-build/cerc-test-container/run.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +# Test if the container's filesystem is old (run previously) or new +EXISTSFILENAME=/var/exists +echo "Test container starting" +if [[ -f "$EXISTSFILENAME" ]]; +then + TIMESTAMP = `cat $EXISTSFILENAME` + echo "Filesystem is old, created: $TIMESTAMP" +else + echo "Filesystem is fresh" + echo `date` > $EXISTSFILENAME +fi + +# Sleep forever to keep docker happy +while true; do sleep 10; done \ No newline at end of file diff --git a/container-image-list.txt b/container-image-list.txt index fd2fe645..80cef725 100644 --- a/container-image-list.txt +++ b/container-image-list.txt @@ -11,4 +11,5 @@ cerc/ipld-eth-server cerc/laconicd cerc/laconic-cns-cli cerc/fixturenet-eth-geth -cerc/fixturenet-eth-lighthouse \ No newline at end of file +cerc/fixturenet-eth-lighthouse +cerc/test-container diff --git a/pod-list.txt b/pod-list.txt index 09a7baa5..d07d3d08 100644 --- a/pod-list.txt +++ b/pod-list.txt @@ -9,3 +9,4 @@ lighthouse prometheus-grafana laconicd fixturenet-eth +test From 01fd7e251a44cb0d802c717fa9175b200f2da3ab Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Mon, 31 Oct 2022 12:43:49 -0500 Subject: [PATCH 0093/1010] Remove fixed IPs and separate network for fixturenet. (#30) * Remove fixed IPs and separate network for fixturenet. * Remove static port mapping. * Add helper script for checking your fxiturenet status * Sleep 1 second * Fix spacing * Fix for latest genesis generator. * run as archive node --- compose/docker-compose-fixturenet-eth.yml | 23 ------- config/fixturenet-eth/fixturenet-eth.env | 3 +- .../genesis/accounts/mnemonic_to_csv.py | 2 +- .../genesis/el/build_el.sh | 5 +- .../genesis/el/el-config.yaml | 9 ++- .../cerc-fixturenet-eth-geth/run-el.sh | 4 ++ .../genesis/cl/beacon_node.sh | 5 +- .../genesis/cl/bootnode.sh | 16 +++++ .../genesis/cl/build_cl.sh | 15 ----- .../genesis/cl/vars.env | 12 ++-- .../cerc-fixturenet-eth-lighthouse/run-cl.sh | 20 +++++- .../scripts/status.sh | 65 +++++++++++++++++++ 12 files changed, 121 insertions(+), 58 deletions(-) create mode 100755 container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh diff --git a/compose/docker-compose-fixturenet-eth.yml b/compose/docker-compose-fixturenet-eth.yml index ad79814c..00377d21 100644 --- a/compose/docker-compose-fixturenet-eth.yml +++ b/compose/docker-compose-fixturenet-eth.yml @@ -8,9 +8,6 @@ services: environment: RUN_BOOTNODE: "true" image: cerc/fixturenet-eth-geth:local - networks: - fixturenet-eth-net: - ipv4_address: 172.16.254.10 fixturenet-eth-geth-1: hostname: fixturenet-eth-geth-1 @@ -21,8 +18,6 @@ services: - fixturenet-eth-bootnode-geth ports: - "8545" - networks: - fixturenet-eth-net: fixturenet-eth-geth-2: hostname: fixturenet-eth-geth-2 @@ -31,17 +26,12 @@ services: image: cerc/fixturenet-eth-geth:local depends_on: - fixturenet-eth-bootnode-geth - networks: - fixturenet-eth-net: fixturenet-eth-bootnode-lighthouse: hostname: fixturenet-eth-bootnode-lighthouse environment: RUN_BOOTNODE: "true" image: cerc/fixturenet-eth-lighthouse:local - networks: - fixturenet-eth-net: - ipv4_address: 172.16.254.11 fixturenet-eth-lighthouse-1: hostname: fixturenet-eth-lighthouse-1 @@ -57,8 +47,6 @@ services: - fixturenet-eth-geth-1 ports: - "8001" - networks: - fixturenet-eth-net: fixturenet-eth-lighthouse-2: hostname: fixturenet-eth-lighthouse-2 @@ -73,14 +61,3 @@ services: depends_on: - fixturenet-eth-bootnode-lighthouse - fixturenet-eth-geth-2 - networks: - fixturenet-eth-net: - -networks: - # When the bootnode ENR is generated during the build, it requires a specific IP. - # The easiest way to do that is to use a private network. - fixturenet-eth-net: - driver: bridge - ipam: - config: - - subnet: 172.16.254.0/28 diff --git a/config/fixturenet-eth/fixturenet-eth.env b/config/fixturenet-eth/fixturenet-eth.env index c4088e69..8cb2bf4b 100644 --- a/config/fixturenet-eth/fixturenet-eth.env +++ b/config/fixturenet-eth/fixturenet-eth.env @@ -7,5 +7,4 @@ ENODE="enode://af22c29c316ad069cf48a09a4ad5cf04a251b411e45098888d114c6dd7f489a13 # JWT shared by geth and lighthouse for authentication. JWT="0x6cdcac3501046a08e186730dd8bd136cfaf0fdc1fc955f6e15ad3068c0ff2af0" -# Should match the definition of fixturenet-eth-net. -NETRESTRICT="172.16.254.0/28" +ENR_URL="http://fixturenet-eth-bootnode-lighthouse:3000/bootnode/enr.dat" diff --git a/container-build/cerc-fixturenet-eth-geth/genesis/accounts/mnemonic_to_csv.py b/container-build/cerc-fixturenet-eth-geth/genesis/accounts/mnemonic_to_csv.py index 730426bd..365c3775 100644 --- a/container-build/cerc-fixturenet-eth-geth/genesis/accounts/mnemonic_to_csv.py +++ b/container-build/cerc-fixturenet-eth-geth/genesis/accounts/mnemonic_to_csv.py @@ -12,6 +12,6 @@ if len(sys.argv) > 1: with open(testnet_config_path) as stream: data = yaml.safe_load(stream) -for key, value in data['eth1_premine'].items(): +for key, value in data['el_premine'].items(): acct = w3.eth.account.from_mnemonic(data['mnemonic'], account_path=key, passphrase='') print("%s,%s,%s" % (key, acct.address, acct.key.hex())) diff --git a/container-build/cerc-fixturenet-eth-geth/genesis/el/build_el.sh b/container-build/cerc-fixturenet-eth-geth/genesis/el/build_el.sh index 5eeeba51..0070707d 100755 --- a/container-build/cerc-fixturenet-eth-geth/genesis/el/build_el.sh +++ b/container-build/cerc-fixturenet-eth-geth/genesis/el/build_el.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash +set -e # See: https://github.com/skylenet/ethereum-genesis-generator/blob/master/entrypoint.sh @@ -8,5 +9,7 @@ mkdir -p ../build/el tmp_dir=$(mktemp -d -t ci-XXXXXXXXXX) envsubst < el-config.yaml > $tmp_dir/genesis-config.yaml -python3 /apps/el-gen/genesis_geth.py $tmp_dir/genesis-config.yaml > ../build/el/geth.json +ttd=`cat $tmp_dir/genesis-config.yaml | grep terminal_total_difficulty | awk '{ print $2 }'` + +python3 /apps/el-gen/genesis_geth.py $tmp_dir/genesis-config.yaml | jq ".config.terminalTotalDifficulty=$ttd" > ../build/el/geth.json python3 ../accounts/mnemonic_to_csv.py $tmp_dir/genesis-config.yaml > ../build/el/accounts.csv diff --git a/container-build/cerc-fixturenet-eth-geth/genesis/el/el-config.yaml b/container-build/cerc-fixturenet-eth-geth/genesis/el/el-config.yaml index 7beb9c80..ed8d4885 100644 --- a/container-build/cerc-fixturenet-eth-geth/genesis/el/el-config.yaml +++ b/container-build/cerc-fixturenet-eth-geth/genesis/el/el-config.yaml @@ -1,17 +1,16 @@ mnemonic: "viable ketchup woman library opinion copy rhythm attend rose knock penalty practice photo bundle budget dentist enter round bind holiday useful arch danger lobster" -eth1_premine: +el_premine: "m/44'/60'/0'/0/0": 10000000ETH "m/44'/60'/0'/0/1": 10000000ETH "m/44'/60'/0'/0/2": 10000000ETH "m/44'/60'/0'/0/3": 10000000ETH "m/44'/60'/0'/0/4": 10000000ETH "m/44'/60'/0'/0/5": 10000000ETH -eth1_premine_addrs: {} +el_premine_addrs: {} chain_id: 1212 deposit_contract_address: "0x1212121212121212121212121212121212121212" -eth1_genesis_timestamp: 0 -terminal_total_difficulty: 10000000 -mergeForkBlock: 100 +genesis_timestamp: 0 +terminal_total_difficulty: 1000 clique: enabled: false diff --git a/container-build/cerc-fixturenet-eth-geth/run-el.sh b/container-build/cerc-fixturenet-eth-geth/run-el.sh index 84ff72f4..b6d0ce83 100755 --- a/container-build/cerc-fixturenet-eth-geth/run-el.sh +++ b/container-build/cerc-fixturenet-eth-geth/run-el.sh @@ -2,6 +2,7 @@ ETHERBASE=`cat /opt/testnet/build/el/accounts.csv | head -1 | cut -d',' -f2` NETWORK_ID=`cat /opt/testnet/el/el-config.yaml | grep 'chain_id' | awk '{ print $2 }'` +NETRESTRICT=`ip addr | grep inet | grep -v '127.0' | awk '{print $2}'` if [ "true" == "$RUN_BOOTNODE" ]; then geth \ @@ -29,6 +30,9 @@ else --authrpc.jwtsecret="/opt/testnet/build/el/jwtsecret" \ --networkid=${NETWORK_ID} \ --netrestrict="${NETRESTRICT}" \ + --gcmode archive \ + --txlookuplimit=0 \ + --cache.preimages \ --syncmode=full \ --mine \ --miner.threads=1 \ diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh index 026d40e1..6fa1d8d4 100755 --- a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh +++ b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh @@ -10,7 +10,7 @@ set -Eeuo pipefail source ./vars.env SUBSCRIBE_ALL_SUBNETS= -DEBUG_LEVEL=${DEBUG_LEVEL:-info} +DEBUG_LEVEL=${DEBUG_LEVEL:-debug} # Get positional arguments data_dir=$DATADIR/node_${NODE_NUMBER} @@ -18,9 +18,6 @@ network_port=9001 http_port=8001 authrpc_port=8551 -ENR=`cat $DATADIR/bootnode/enr.dat` -ENR_IP=`ip addr | grep 172 | awk '{print $2}' | cut -d '/' -f1` - exec lighthouse \ --debug-level $DEBUG_LEVEL \ bn \ diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/bootnode.sh b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/bootnode.sh index 50d460fc..f6f5cc73 100755 --- a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/bootnode.sh +++ b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/bootnode.sh @@ -13,6 +13,22 @@ DEBUG_LEVEL=${1:-info} echo "Starting bootnode" +if [ ! -f "$DATADIR/bootnode/enr.dat" ]; then + echo "Generating bootnode enr" + lcli \ + generate-bootnode-enr \ + --ip $ENR_IP \ + --udp-port $BOOTNODE_PORT \ + --tcp-port $BOOTNODE_PORT \ + --genesis-fork-version $GENESIS_FORK_VERSION \ + --output-dir $DATADIR/bootnode + + bootnode_enr=`cat $DATADIR/bootnode/enr.dat` + echo "- $bootnode_enr" > $TESTNET_DIR/boot_enr.yaml + + echo "Generated bootnode enr and written to $TESTNET_DIR/boot_enr.yaml" +fi + exec lighthouse boot_node \ --testnet-dir $TESTNET_DIR \ --port $BOOTNODE_PORT \ diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/build_cl.sh b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/build_cl.sh index 32b3e6f4..92018d7a 100755 --- a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/build_cl.sh +++ b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/build_cl.sh @@ -57,18 +57,3 @@ lcli \ $GENESIS_VALIDATOR_COUNT echo Created genesis state in $TESTNET_DIR - -echo "Generating bootnode enr" - -lcli \ - generate-bootnode-enr \ - --ip $BOOTNODE_IP \ - --udp-port $BOOTNODE_PORT \ - --tcp-port $BOOTNODE_PORT \ - --genesis-fork-version $GENESIS_FORK_VERSION \ - --output-dir $DATADIR/bootnode - -bootnode_enr=`cat $DATADIR/bootnode/enr.dat` -echo "- $bootnode_enr" > $TESTNET_DIR/boot_enr.yaml - -echo "Generated bootnode enr and written to $TESTNET_DIR/boot_enr.yaml" diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/vars.env b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/vars.env index b7e2a939..d68cbdcc 100644 --- a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/vars.env +++ b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/vars.env @@ -4,6 +4,8 @@ DATADIR=${DATADIR:-../build/cl} # Directory for the eth2 config TESTNET_DIR=${TESTNET_DIR:-$DATADIR/testnet} JWTSECRET=${JWTSECRET:-$DATADIR/jwtsecret} +ENR=${ENR:="SET_AT_RUNTIME"} +ENR_IP=`ip addr | grep inet | grep -v '127.0.0.1' | sort | head -1 | awk '{print $2}' | cut -d '/' -f1` GENESIS_FORK_VERSION=${GENESIS_FORK_VERSION:-0x12121212} @@ -22,12 +24,11 @@ VC_COUNT=${VC_COUNT:-$BN_COUNT} GENESIS_DELAY=${GENESIS_DELAY:-0} # Port for P2P communication with bootnode -BOOTNODE_IP=${BOOTNODE_IP:-172.16.254.11} BOOTNODE_PORT=${BOOTNODE_PORT:-4242} # Hard fork configuration -ALTAIR_FORK_EPOCH=${ALTAIR_FORK_EPOCH:-1} -MERGE_FORK_EPOCH=${MERGE_FORK_EPOCH:-2} +ALTAIR_FORK_EPOCH=${ALTAIR_FORK_EPOCH:-0} +MERGE_FORK_EPOCH=${MERGE_FORK_EPOCH:-0} # Spec version (mainnet or minimal) SPEC_PRESET=${SPEC_PRESET:-mainnet} @@ -43,10 +44,11 @@ VC_ARGS=${VC_ARGS:-""} EXECUTION_ENDPOINT=${EXECUTION_ENDPOINT:-http://localhost:8551} +ETH1_GENESIS_JSON=${ETH1_GENESIS_JSON:-"../build/el/geth.json"} ETH1_CONFIG_YAML=${ETH1_CONFIG_YAML:-"../el/el-config.yaml"} -ETH1_CHAIN_ID=${ETH1_CHAIN_ID:-`cat $ETH1_CONFIG_YAML | grep 'chain_id' | awk '{ print $2 }'`} -ETH1_TTD=${ETH1_TTD:-`cat $ETH1_CONFIG_YAML | grep 'terminal_total_difficulty' | awk '{ print $2 }'`} +ETH1_CHAIN_ID=${ETH1_CHAIN_ID:-`cat $ETH1_GENESIS_JSON | jq -r '.config.chainId'`} +ETH1_TTD=${ETH1_TTD:-`cat $ETH1_GENESIS_JSON | jq -r '.config.terminalTotalDifficulty'`} ETH1_DEPOSIT_CONTRACT_ADDRESS=${ETH1_DEPOSIT_CONTRACT_ADDRESS:-`cat $ETH1_CONFIG_YAML | grep 'deposit_contract_address' | awk '{ print $2 }' | sed 's/"//g'`} ETH1_DEPOSIT_CONTRACT_BLOCK=${ETH1_DEPOSIT_CONTRACT_BLOCK:-0x0} SUGGESTED_FEE_RECIPIENT=`cat ../build/el/accounts.csv | head -1 | cut -d',' -f2` diff --git a/container-build/cerc-fixturenet-eth-lighthouse/run-cl.sh b/container-build/cerc-fixturenet-eth-lighthouse/run-cl.sh index 9e7c653e..07346e58 100755 --- a/container-build/cerc-fixturenet-eth-lighthouse/run-cl.sh +++ b/container-build/cerc-fixturenet-eth-lighthouse/run-cl.sh @@ -1,18 +1,22 @@ #!/bin/bash if [ "true" == "$RUN_BOOTNODE" ]; then + cd /opt/testnet/build/cl + python3 -m http.server 3000 & + + cd /opt/testnet/cl ./bootnode.sh 2>&1 | tee /var/log/lighthouse_bootnode.log else while [ 1 -eq 1 ]; do - echo "Waiting on DAG ..." + echo "Waiting on geth ..." sleep 5 result=`wget --no-check-certificate --quiet \ -O - \ --method POST \ --timeout=0 \ --header 'Content-Type: application/json' \ - --body-data '{ "jsonrpc": "2.0", "id": 1, "method": "eth_getBlockByNumber", "params": ["0x3", false] }' "${ETH1_ENDPOINT:-localhost:8545}" | jq -r '.result'` + --body-data '{ "jsonrpc": "2.0", "id": 1, "method": "eth_blockNumber", "params": [] }' "${ETH1_ENDPOINT:-localhost:8545}" | jq -r '.result'` if [ ! -z "$result" ] && [ "null" != "$result" ]; then break fi @@ -34,6 +38,18 @@ else done fi + if [ ! -z "$ENR_URL" ]; then + while [ 1 -eq 1 ]; do + echo "Waiting on ENR for boot node..." + sleep 5 + result=`wget --no-check-certificate --quiet -O - --timeout=0 $ENR_URL` + if [ ! -z "$result" ]; then + export ENR="$result" + break; + fi + done + fi + export JWTSECRET="/opt/testnet/build/cl/jwtsecret" echo -n "$JWT" > $JWTSECRET diff --git a/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh b/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh new file mode 100755 index 00000000..e02fc14b --- /dev/null +++ b/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh @@ -0,0 +1,65 @@ +#!/bin/bash + +STATUSES=("geth to generate DAG" "beacon phase0" "beacon altair" "beacon bellatrix pre-merge" "beacon bellatrix merge") +STATUS=0 + + +LIGHTHOUSE_BASE_URL=${LIGHTHOUSE_BASE_URL} +GETH_BASE_URL=${GETH_BASE_URL} + +if [ -z "$LIGHTHOUSE_BASE_URL" ]; then + LIGHTHOUSE_PORT=`docker ps -f "name=fixturenet-eth-lighthouse-1-1" --format "{{.Ports}}" | head -1 | cut -d':' -f2 | cut -d'-' -f1` + LIGHTHOUSE_BASE_URL="http://localhost:${LIGHTHOUSE_PORT}" +fi + +if [ -z "$GETH_BASE_URL" ]; then + GETH_PORT=`docker ps -f "name=fixturenet-eth-geth-1-1" --format "{{.Ports}}" | head -1 | cut -d':' -f2 | cut -d'-' -f1` + GETH_BASE_URL="http://localhost:${GETH_PORT}" +fi + +function inc_status() { + echo " DONE!" + STATUS=$((STATUS + 1)) + if [ $STATUS -lt ${#STATUSES[@]} ]; then + echo -n "Waiting for ${STATUSES[$STATUS]}..." + fi +} + +echo -n "Waiting for ${STATUSES[$STATUS]}..." +while [ $STATUS -lt ${#STATUSES[@]} ]; do + sleep 1 + echo -n "." + case $STATUS in + 0) + result=`wget --no-check-certificate --quiet -O - --method POST --header 'Content-Type: application/json' \ + --body-data '{ "jsonrpc": "2.0", "id": 1, "method": "eth_getBlockByNumber", "params": ["0x3", false] }' $GETH_BASE_URL | jq -r '.result'` + if [ ! -z "$result" ] && [ "null" != "$result" ]; then + inc_status + fi + ;; + 1) + result=`wget --no-check-certificate --quiet -O - "$LIGHTHOUSE_BASE_URL/eth/v2/beacon/blocks/head" | jq -r '.data.message.slot'` + if [ ! -z "$result" ] && [ $result -gt 0 ]; then + inc_status + fi + ;; + 2) + result=`wget --no-check-certificate --quiet -O - "$LIGHTHOUSE_BASE_URL/eth/v2/beacon/blocks/head" | jq -r '.version'` + if [ ! -z "$result" ] && ([ "$result" == "altair" ] || [ "$result" == "bellatrix" ]); then + inc_status + fi + ;; + 3) + result=`wget --no-check-certificate --quiet -O - "$LIGHTHOUSE_BASE_URL/eth/v2/beacon/blocks/head" | jq -r '.version'` + if [ ! -z "$result" ] && [ "$result" == "bellatrix" ]; then + inc_status + fi + ;; + 4) + result=`wget --no-check-certificate --quiet -O - "$LIGHTHOUSE_BASE_URL/eth/v2/beacon/blocks/head" | jq -r '.data.message.body.execution_payload.block_number'` + if [ ! -z "$result" ] && [ $result -gt 0 ]; then + inc_status + fi + ;; + esac +done From f2c9af4ec6f1d7618b473b00757a9d1cd17371ac Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Tue, 1 Nov 2022 12:44:33 -0500 Subject: [PATCH 0094/1010] Add option to enable statediffing for the fixturenet geth. (#32) * Add option to enable statediffing for the fixturenet geth. * eol * Review comments --- compose/docker-compose-db-sharding.yml | 32 ------------------- compose/docker-compose-db.yml | 29 +++++++++++------ compose/docker-compose-fixturenet-eth.yml | 4 +++ config/fixturenet-eth/fixturenet-eth.env | 8 +++++ .../cerc-fixturenet-eth-geth/run-el.sh | 17 ++++++++-- pod-list.txt | 2 +- 6 files changed, 48 insertions(+), 44 deletions(-) delete mode 100644 compose/docker-compose-db-sharding.yml diff --git a/compose/docker-compose-db-sharding.yml b/compose/docker-compose-db-sharding.yml deleted file mode 100644 index b6117661..00000000 --- a/compose/docker-compose-db-sharding.yml +++ /dev/null @@ -1,32 +0,0 @@ -version: "3.2" - -services: - migrations: - restart: on-failure - depends_on: - ipld-eth-db: - condition: service_healthy - image: cerc/ipld-eth-db:local - environment: - DATABASE_USER: "vdbm" - DATABASE_NAME: "cerc_testing" - DATABASE_PASSWORD: "password" - DATABASE_HOSTNAME: "ipld-eth-db" - DATABASE_PORT: 5432 - - ipld-eth-db: - image: timescale/timescaledb:latest-pg14 - restart: always - command: ["postgres", "-c", "log_statement=all"] - environment: - POSTGRES_USER: "vdbm" - POSTGRES_DB: "cerc_testing" - POSTGRES_PASSWORD: "password" - healthcheck: - test: ["CMD", "nc", "-v", "localhost", "5432"] - interval: 30s - timeout: 10s - retries: 10 - start_period: 3s - ports: - - "127.0.0.1:8077:5432" diff --git a/compose/docker-compose-db.yml b/compose/docker-compose-db.yml index a984f7f0..fe7f4741 100644 --- a/compose/docker-compose-db.yml +++ b/compose/docker-compose-db.yml @@ -1,20 +1,31 @@ -# TODO: figure out if this is needed -- it doesn't seem to make sense in the context of the -# current version of cerc/ipld-eth-db/Dockerfile, which is only the migrations code, not the DB itself -# The sibling component docker-compose-db-sharding.yml looks more plausible version: "3.2" + services: - ipld-eth-db: - restart: always + migrations: + restart: on-failure + depends_on: + ipld-eth-db: + condition: service_healthy image: cerc/ipld-eth-db:local + environment: + DATABASE_USER: "vdbm" + DATABASE_NAME: "cerc_testing" + DATABASE_PASSWORD: "password" + DATABASE_HOSTNAME: "ipld-eth-db" + DATABASE_PORT: 5432 + + ipld-eth-db: + image: timescale/timescaledb:latest-pg14 + restart: always environment: POSTGRES_USER: "vdbm" POSTGRES_DB: "cerc_testing" POSTGRES_PASSWORD: "password" healthcheck: test: ["CMD", "nc", "-v", "localhost", "5432"] - interval: 5s - timeout: 3s - retries: 5 + interval: 30s + timeout: 10s + retries: 10 + start_period: 3s ports: - "127.0.0.1:8077:5432" - command: ["postgres", "-c", "log_statement=all"] \ No newline at end of file diff --git a/compose/docker-compose-fixturenet-eth.yml b/compose/docker-compose-fixturenet-eth.yml index 00377d21..459fb2ee 100644 --- a/compose/docker-compose-fixturenet-eth.yml +++ b/compose/docker-compose-fixturenet-eth.yml @@ -21,10 +21,14 @@ services: fixturenet-eth-geth-2: hostname: fixturenet-eth-geth-2 + environment: + CERC_RUN_STATEDIFF: "true" + CERC_STATEDIFF_DB_NODE_ID: 2 env_file: - ../config/fixturenet-eth/fixturenet-eth.env image: cerc/fixturenet-eth-geth:local depends_on: + - migrations - fixturenet-eth-bootnode-geth fixturenet-eth-bootnode-lighthouse: diff --git a/config/fixturenet-eth/fixturenet-eth.env b/config/fixturenet-eth/fixturenet-eth.env index 8cb2bf4b..4467c543 100644 --- a/config/fixturenet-eth/fixturenet-eth.env +++ b/config/fixturenet-eth/fixturenet-eth.env @@ -7,4 +7,12 @@ ENODE="enode://af22c29c316ad069cf48a09a4ad5cf04a251b411e45098888d114c6dd7f489a13 # JWT shared by geth and lighthouse for authentication. JWT="0x6cdcac3501046a08e186730dd8bd136cfaf0fdc1fc955f6e15ad3068c0ff2af0" +# URL to download the ENR of the lighthouse bootnode (generated at first start). ENR_URL="http://fixturenet-eth-bootnode-lighthouse:3000/bootnode/enr.dat" + +# DB connection settings for statediffing (see docker-compose-db.yml) +CERC_STATEDIFF_DB_HOST="ipld-eth-db" +CERC_STATEDIFF_DB_PORT=5432 +CERC_STATEDIFF_DB_NAME="cerc_testing" +CERC_STATEDIFF_DB_USER="vdbm" +CERC_STATEDIFF_DB_PASSWORD="password" diff --git a/container-build/cerc-fixturenet-eth-geth/run-el.sh b/container-build/cerc-fixturenet-eth-geth/run-el.sh index b6d0ce83..0d0a866b 100755 --- a/container-build/cerc-fixturenet-eth-geth/run-el.sh +++ b/container-build/cerc-fixturenet-eth-geth/run-el.sh @@ -17,6 +17,19 @@ else echo -n "$JWT" > /opt/testnet/build/el/jwtsecret + STATEDIFF_OPTS="" + if [ "$CERC_RUN_STATEDIFF" == "true" ]; then + STATEDIFF_OPTS="--statediff=true \ + --statediff.db.host=$CERC_STATEDIFF_DB_HOST \ + --statediff.db.name=$CERC_STATEDIFF_DB_NAME \ + --statediff.db.nodeid=$CERC_STATEDIFF_DB_NODE_ID \ + --statediff.db.password=$CERC_STATEDIFF_DB_PASSWORD \ + --statediff.db.port=$CERC_STATEDIFF_DB_PORT \ + --statediff.db.user=$CERC_STATEDIFF_DB_USER \ + --statediff.waitforsync=true \ + --statediff.writing=true" + fi + geth \ --bootnodes="${ENODE}" \ --allow-insecure-unlock \ @@ -28,7 +41,7 @@ else --authrpc.addr="0.0.0.0" \ --authrpc.vhosts="*" \ --authrpc.jwtsecret="/opt/testnet/build/el/jwtsecret" \ - --networkid=${NETWORK_ID} \ + --networkid="${NETWORK_ID}" \ --netrestrict="${NETRESTRICT}" \ --gcmode archive \ --txlookuplimit=0 \ @@ -36,5 +49,5 @@ else --syncmode=full \ --mine \ --miner.threads=1 \ - --miner.etherbase=${ETHERBASE} 2>&1 | tee /var/log/geth.log + --miner.etherbase="${ETHERBASE}" ${STATEDIFF_OPTS} 2>&1 | tee /var/log/geth.log fi diff --git a/pod-list.txt b/pod-list.txt index d07d3d08..6a363325 100644 --- a/pod-list.txt +++ b/pod-list.txt @@ -1,5 +1,5 @@ contract -db-sharding +db eth-statediff-fill-service go-ethereum-foundry ipld-eth-beacon-db From 99fa08ed67b9dc63b2e395631394ec68fd48c3f5 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Tue, 1 Nov 2022 17:53:32 -0500 Subject: [PATCH 0095/1010] Use explicit image hash, not latest tag. (#33) * Use explicit image hash, not latest tag. * Better syntax * No latest --- container-build/cerc-fixturenet-eth-geth/Dockerfile | 2 +- container-build/cerc-fixturenet-eth-lighthouse/Dockerfile | 4 ++-- container-build/cerc-lighthouse/Dockerfile | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/container-build/cerc-fixturenet-eth-geth/Dockerfile b/container-build/cerc-fixturenet-eth-geth/Dockerfile index 068291a2..72c03039 100644 --- a/container-build/cerc-fixturenet-eth-geth/Dockerfile +++ b/container-build/cerc-fixturenet-eth-geth/Dockerfile @@ -1,4 +1,4 @@ -FROM skylenet/ethereum-genesis-generator AS ethgen +FROM skylenet/ethereum-genesis-generator@sha256:210353ce7c898686bc5092f16c61220a76d357f51eff9c451e9ad1b9ad03d4d3 AS ethgen FROM cerc/go-ethereum:local RUN apk add --no-cache python3 python3-dev py3-pip curl wget jq build-base gettext libintl openssl bash diff --git a/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile b/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile index 08de5537..6e8add4a 100644 --- a/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile +++ b/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile @@ -1,5 +1,5 @@ -FROM sigp/lcli AS lcli -FROM skylenet/ethereum-genesis-generator AS ethgen +FROM sigp/lcli:v3.2.1 AS lcli +FROM skylenet/ethereum-genesis-generator@sha256:210353ce7c898686bc5092f16c61220a76d357f51eff9c451e9ad1b9ad03d4d3 AS ethgen FROM cerc/fixturenet-eth-geth:local AS fnetgeth FROM cerc/lighthouse:local diff --git a/container-build/cerc-lighthouse/Dockerfile b/container-build/cerc-lighthouse/Dockerfile index 9acefb48..14f0a2ae 100644 --- a/container-build/cerc-lighthouse/Dockerfile +++ b/container-build/cerc-lighthouse/Dockerfile @@ -1,4 +1,4 @@ -FROM sigp/lighthouse:latest-modern +FROM sigp/lighthouse:v3.2.1-modern RUN apt-get update; apt-get install bash netcat curl less jq -y; From 8e0f1f7e35d14c2aa3b7293709d0ad3c5c0ba542 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 1 Nov 2022 18:45:21 -0600 Subject: [PATCH 0096/1010] Add note on benign container build warning messages --- .../cerc-fixturenet-eth-lighthouse/genesis/cl/build_cl.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/build_cl.sh b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/build_cl.sh index 92018d7a..ab3ad2af 100755 --- a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/build_cl.sh +++ b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/build_cl.sh @@ -20,6 +20,7 @@ NOW=`date +%s` GENESIS_TIME=`expr $NOW + $GENESIS_DELAY` echo "Creating testnet ..." +echo "(Note: errors of the form 'WARN: Scrypt parameters are too weak...' below can be safely ignored)" lcli \ new-testnet \ --spec $SPEC_PRESET \ From 863548530ac0a14e000e29a4babac41d74f97d31 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Thu, 3 Nov 2022 17:31:14 -0500 Subject: [PATCH 0097/1010] Integrate ipld-eth-beacon-indexer working with the fixturenet. (#36) * Use explicit image hash, not latest tag. * Better syntax * No latest * Add fixturenet setup for beacon indexer. * Don't wait for merge. * Don't wait for merge. --- compose/docker-compose-fixturenet-eth.yml | 36 ++++++++++++++++--- compose/docker-compose-ipld-eth-beacon-db.yml | 12 +++---- ...docker-compose-ipld-eth-beacon-indexer.yml | 14 ++++---- compose/docker-compose-lighthouse.yml | 17 --------- config/ipld-eth-beacon-indexer/indexer.env | 31 ++++++++++++++++ .../genesis/cl/ready.sh | 10 ++++++ .../cerc-fixturenet-eth-lighthouse/run-cl.sh | 8 ++--- 7 files changed, 89 insertions(+), 39 deletions(-) delete mode 100644 compose/docker-compose-lighthouse.yml create mode 100644 config/ipld-eth-beacon-indexer/indexer.env create mode 100755 container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/ready.sh diff --git a/compose/docker-compose-fixturenet-eth.yml b/compose/docker-compose-fixturenet-eth.yml index 459fb2ee..d105221f 100644 --- a/compose/docker-compose-fixturenet-eth.yml +++ b/compose/docker-compose-fixturenet-eth.yml @@ -14,6 +14,12 @@ services: env_file: - ../config/fixturenet-eth/fixturenet-eth.env image: cerc/fixturenet-eth-geth:local + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "8545"] + interval: 30s + timeout: 10s + retries: 10 + start_period: 3s depends_on: - fixturenet-eth-bootnode-geth ports: @@ -24,6 +30,12 @@ services: environment: CERC_RUN_STATEDIFF: "true" CERC_STATEDIFF_DB_NODE_ID: 2 + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "8545"] + interval: 30s + timeout: 10s + retries: 10 + start_period: 3s env_file: - ../config/fixturenet-eth/fixturenet-eth.env image: cerc/fixturenet-eth-geth:local @@ -39,6 +51,12 @@ services: fixturenet-eth-lighthouse-1: hostname: fixturenet-eth-lighthouse-1 + healthcheck: + test: ["CMD", "wget", "--tries=1", "--connect-timeout=1", "--quiet", "-O", "-", "http://localhost:8001/eth/v2/beacon/blocks/head"] + interval: 30s + timeout: 10s + retries: 10 + start_period: 30s env_file: - ../config/fixturenet-eth/fixturenet-eth.env environment: @@ -47,13 +65,21 @@ services: EXECUTION_ENDPOINT: "http://fixturenet-eth-geth-1:8551" image: cerc/fixturenet-eth-lighthouse:local depends_on: - - fixturenet-eth-bootnode-lighthouse - - fixturenet-eth-geth-1 + fixturenet-eth-bootnode-lighthouse: + condition: service_started + fixturenet-eth-geth-1: + condition: service_healthy ports: - "8001" fixturenet-eth-lighthouse-2: hostname: fixturenet-eth-lighthouse-2 + healthcheck: + test: ["CMD", "wget", "--tries=1", "--connect-timeout=1", "--quiet", "-O", "-", "http://localhost:8001/eth/v2/beacon/blocks/head"] + interval: 30s + timeout: 10s + retries: 10 + start_period: 30s env_file: - ../config/fixturenet-eth/fixturenet-eth.env environment: @@ -63,5 +89,7 @@ services: LIGHTHOUSE_GENESIS_STATE_URL: "http://fixturenet-eth-lighthouse-1:8001/eth/v2/debug/beacon/states/0" image: cerc/fixturenet-eth-lighthouse:local depends_on: - - fixturenet-eth-bootnode-lighthouse - - fixturenet-eth-geth-2 + fixturenet-eth-bootnode-lighthouse: + condition: service_started + fixturenet-eth-geth-2: + condition: service_healthy diff --git a/compose/docker-compose-ipld-eth-beacon-db.yml b/compose/docker-compose-ipld-eth-beacon-db.yml index 957b0b28..bb54cd1f 100644 --- a/compose/docker-compose-ipld-eth-beacon-db.yml +++ b/compose/docker-compose-ipld-eth-beacon-db.yml @@ -7,11 +7,11 @@ services: POSTGRES_USER: vdbm POSTGRES_DB: cerc_testing POSTGRES_PASSWORD: password - volumes: - - vdb_db_eth-beacon_db:/var/lib/postgresql/data + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "5432"] + interval: 30s + timeout: 10s + retries: 10 + start_period: 3s ports: - "127.0.0.1:8076:5432" - command: ["postgres", "-c", "log_statement=all"] - -volumes: - vdb_db_eth-beacon_db: diff --git a/compose/docker-compose-ipld-eth-beacon-indexer.yml b/compose/docker-compose-ipld-eth-beacon-indexer.yml index 69b4c17e..533edf3c 100644 --- a/compose/docker-compose-ipld-eth-beacon-indexer.yml +++ b/compose/docker-compose-ipld-eth-beacon-indexer.yml @@ -3,12 +3,10 @@ services: ipld-eth-beacon-indexer: restart: unless-stopped depends_on: - - ipld-eth-beacon-db - - lighthouse + ipld-eth-beacon-db: + condition: service_healthy + fixturenet-eth-lighthouse-1: + condition: service_healthy image: cerc/ipld-eth-beacon-indexer:local - volumes: - - type: bind - source: ${eth_beacon_config_file} - target: /root/ipld-eth-beacon-config.json - environment: - CAPTURE_MODE: ${eth_beacon_capture_mode} + env_file: + - ../config/ipld-eth-beacon-indexer/indexer.env diff --git a/compose/docker-compose-lighthouse.yml b/compose/docker-compose-lighthouse.yml deleted file mode 100644 index 73d90797..00000000 --- a/compose/docker-compose-lighthouse.yml +++ /dev/null @@ -1,17 +0,0 @@ -version: "3.2" -services: - lighthouse: - restart: always - image: cerc/lighthouse:local - environment: - - NETWORK=mainnet - volumes: - - lighthouse_db:/root/.lighthouse - ports: - - 127.0.0.1:5052:5052 - - 9000:9000/udp - - 9000:9000/tcp - command: ["tail", "-f", "/dev/null"] - -volumes: - lighthouse_db: \ No newline at end of file diff --git a/config/ipld-eth-beacon-indexer/indexer.env b/config/ipld-eth-beacon-indexer/indexer.env new file mode 100644 index 00000000..b19800aa --- /dev/null +++ b/config/ipld-eth-beacon-indexer/indexer.env @@ -0,0 +1,31 @@ +# Match compose/docker-compose-ipld-eth-beacon-db.yml +POSTGRES_HOST=ipld-eth-beacon-db +POSTGRES_PORT=5432 +POSTGRES_DB=cerc_testing +POSTGRES_USER=vdbm +POSTGRES_PASSWORD=password + +# Match compose/docker-compose-fixturenet-eth.yml +LIGHTHOUSE_HOST=fixturenet-eth-lighthouse-1 +LIGHTHOUSE_PORT=8001 +LIGHTHOUSE_PROTOCOL=http + +CAPTURE_MODE=head +LOG_LEVEL=debug + +BC_MAX_HISTORIC_PROCESS_WORKER=2 +BC_UNIQUE_NODE_IDENTIFIER=1001 +BC_CHECK_DB=true +BC_BEACON_STATE_PROCESSING_ENABLED=false +BC_BEACON_BLOCK_PROCESSING_ENABLED=true +BC_MINIMUM_SLOT=0 + +KG_INCREMENT=10000 +KG_PROCESS_KNOWN_GAPS_ENABLED=true +KG_MAX_KNOWN_GAPS_WORKER=2 +KG_MINIMUM_SLOT=0 + +# Match compose/docker-compose-prometheus-grafana.yml +PROM_HOST=prometheus +PROM_PORT=9000 +PROM_METRICS_ENABLED=false diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/ready.sh b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/ready.sh new file mode 100755 index 00000000..ef0a184d --- /dev/null +++ b/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/ready.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +LIGHTHOUSE_BASE_URL=http://localhost:8001 + +result=`wget --no-check-certificate --quiet -O - "$LIGHTHOUSE_BASE_URL/eth/v2/beacon/blocks/head" | jq -r '.data.message.body.execution_payload.block_number'` +if [ ! -z "$result" ] && [ $result -gt 0 ]; then + exit 0 +fi + +exit 1 diff --git a/container-build/cerc-fixturenet-eth-lighthouse/run-cl.sh b/container-build/cerc-fixturenet-eth-lighthouse/run-cl.sh index 07346e58..ee5fc55c 100755 --- a/container-build/cerc-fixturenet-eth-lighthouse/run-cl.sh +++ b/container-build/cerc-fixturenet-eth-lighthouse/run-cl.sh @@ -32,8 +32,8 @@ else sleep 5 result=`wget --no-check-certificate --quiet -O - --timeout=0 $LIGHTHOUSE_GENESIS_STATE_URL | jq -r '.data.genesis_time'` if [ ! -z "$result" ]; then - ./reset_genesis_time.sh $result - break; + ./reset_genesis_time.sh $result + break; fi done fi @@ -44,8 +44,8 @@ else sleep 5 result=`wget --no-check-certificate --quiet -O - --timeout=0 $ENR_URL` if [ ! -z "$result" ]; then - export ENR="$result" - break; + export ENR="$result" + break; fi done fi From 8054597d2de336fb477a37f4c3ad073fce64ef92 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 4 Nov 2022 14:02:27 -0600 Subject: [PATCH 0098/1010] Placeholder landing page --- stacks/mobymask/README.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 stacks/mobymask/README.md diff --git a/stacks/mobymask/README.md b/stacks/mobymask/README.md new file mode 100644 index 00000000..542064d6 --- /dev/null +++ b/stacks/mobymask/README.md @@ -0,0 +1,4 @@ +# Mobymask + +## Set up a Mobymask Watcher + From 7625939f13156fba13757402c9da26598cac19f6 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 6 Nov 2022 09:40:10 -0700 Subject: [PATCH 0099/1010] Initial commit --- container-build/cerc-watcher-mobymask/build.sh | 0 container-image-list.txt | 1 + 2 files changed, 1 insertion(+) create mode 100755 container-build/cerc-watcher-mobymask/build.sh diff --git a/container-build/cerc-watcher-mobymask/build.sh b/container-build/cerc-watcher-mobymask/build.sh new file mode 100755 index 00000000..e69de29b diff --git a/container-image-list.txt b/container-image-list.txt index 80cef725..65c1c54f 100644 --- a/container-image-list.txt +++ b/container-image-list.txt @@ -12,4 +12,5 @@ cerc/laconicd cerc/laconic-cns-cli cerc/fixturenet-eth-geth cerc/fixturenet-eth-lighthouse +cerc/watcher-mobymask cerc/test-container From 90a2dc755ec5b78864619171d2253437041f082e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 6 Nov 2022 09:41:38 -0700 Subject: [PATCH 0100/1010] Delete unused file --- docker-compose-test.yaml | 36 ------------------------------------ 1 file changed, 36 deletions(-) delete mode 100644 docker-compose-test.yaml diff --git a/docker-compose-test.yaml b/docker-compose-test.yaml deleted file mode 100644 index 10153ef9..00000000 --- a/docker-compose-test.yaml +++ /dev/null @@ -1,36 +0,0 @@ -version: '3' - -services: - - # Postgresql DB - db: - image: timescale/timescaledb:latest-pg14 - command: -c work_mem=256MB - restart: unless-stopped - environment: - POSTGRES_PASSWORD: db - POSTGRES_USER: db - POSTGRES_DB: db - POSTGRES_HOST_AUTH_METHOD: trust - ports: - # Postgresql - - "5432" - - # Elastic - es: - restart: unless-stopped - image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0 - environment: - - xpack.security.enabled=false - - discovery.type=single-node - ulimits: - memlock: - soft: -1 - hard: -1 - nofile: - soft: 65536 - hard: 65536 - cap_add: - - IPC_LOCK - ports: - - 9200 From f5f262cea3ecf6b41d3b34d3999012d68e97e22b Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 6 Nov 2022 09:49:05 -0700 Subject: [PATCH 0101/1010] Add repo and compose from repo --- compose/docker-compose-watcher-mobymask.yml | 63 +++++++++++++++++++++ repository-list.txt | 1 + stacks/mobymask/stack.yml | 7 +++ 3 files changed, 71 insertions(+) create mode 100644 compose/docker-compose-watcher-mobymask.yml create mode 100644 stacks/mobymask/stack.yml diff --git a/compose/docker-compose-watcher-mobymask.yml b/compose/docker-compose-watcher-mobymask.yml new file mode 100644 index 00000000..89892b33 --- /dev/null +++ b/compose/docker-compose-watcher-mobymask.yml @@ -0,0 +1,63 @@ +version: '3.2' + +services: + + watcher-db: + restart: unless-stopped + image: postgres:14-alpine + environment: + - POSTGRES_USER=vdbm + - POSTGRES_MULTIPLE_DATABASES=mobymask-watcher,mobymask-watcher-job-queue + - POSTGRES_EXTENSION=mobymask-watcher-job-queue:pgcrypto + - POSTGRES_PASSWORD=password + volumes: + - ../common/initdb.d/multiple-postgressql-databases.sh:/docker-entrypoint-initdb.d/multiple-postgressql-databases.sh + - watcher_db_data:/var/lib/postgresql/data + ports: + - "0.0.0.0:15432:5432" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "5432"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 10s + + mobymask-watcher-server: + restart: unless-stopped + depends_on: + watcher-db: + condition: service_healthy + build: + context: ../common/watcher-ts + command: ["sh", "-c", "yarn server"] + volumes: + - ../common/watcher-ts/mobymask-watcher.toml:/app/packages/mobymask-watcher/environments/local.toml + ports: + - "0.0.0.0:3001:3001" + - "0.0.0.0:9001:9001" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "3001"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s + + mobymask-watcher-job-runner: + restart: unless-stopped + depends_on: + mobymask-watcher-server: + condition: service_healthy + watcher-db: + condition: service_healthy + build: + context: ../common/watcher-ts + command: ["sh", "-c", "yarn job-runner"] + volumes: + - ../common/watcher-ts/mobymask-watcher.toml:/app/packages/mobymask-watcher/environments/local.toml + ports: + - "0.0.0.0:9000:9000" + +volumes: + indexer_db_data: + watcher_db_data: + \ No newline at end of file diff --git a/repository-list.txt b/repository-list.txt index 01e178ac..97dfb413 100644 --- a/repository-list.txt +++ b/repository-list.txt @@ -9,3 +9,4 @@ vulcanize/ipld-eth-beacon-indexer vulcanize/ipld-eth-beacon-db cerc-io/laconicd cerc-io/laconic-cns-cli +cerc-io/mobymask-watcher diff --git a/stacks/mobymask/stack.yml b/stacks/mobymask/stack.yml new file mode 100644 index 00000000..3dd4e798 --- /dev/null +++ b/stacks/mobymask/stack.yml @@ -0,0 +1,7 @@ +name: mobymask-watcher +repos: + - cerc-io/mobymask-watcher +containers: + - cerc/watcher-mobymask +pods: + - watcher-mobymask \ No newline at end of file From 81066905d455534b41f36fe4124e901ac6d6e3a6 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 6 Nov 2022 10:11:42 -0700 Subject: [PATCH 0102/1010] Add container build --- container-build/cerc-watcher-mobymask/Dockerfile | 8 ++++++++ container-build/cerc-watcher-mobymask/build.sh | 7 +++++++ 2 files changed, 15 insertions(+) create mode 100644 container-build/cerc-watcher-mobymask/Dockerfile diff --git a/container-build/cerc-watcher-mobymask/Dockerfile b/container-build/cerc-watcher-mobymask/Dockerfile new file mode 100644 index 00000000..fd3e66de --- /dev/null +++ b/container-build/cerc-watcher-mobymask/Dockerfile @@ -0,0 +1,8 @@ +# TODO: move this into the cerc-io/mobymask-watcher repo +FROM node:16.17.1-alpine3.16 + +WORKDIR /app + +COPY . . + +RUN apk --update --no-cache add git && yarn && yarn build diff --git a/container-build/cerc-watcher-mobymask/build.sh b/container-build/cerc-watcher-mobymask/build.sh index e69de29b..74782c99 100755 --- a/container-build/cerc-watcher-mobymask/build.sh +++ b/container-build/cerc-watcher-mobymask/build.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# Build cerc/watcher-mobymask + +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t cerc/watcher-mobymask:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/mobymask-watcher From acf3877caa617e233f6c0ffb5537fb0bfe6016a1 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 6 Nov 2022 17:17:48 -0700 Subject: [PATCH 0103/1010] Working container build --- .../cerc-watcher-mobymask/Dockerfile | 19 +++++++++++++++++-- .../cerc-watcher-mobymask/build.sh | 3 ++- repository-list.txt | 2 ++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/container-build/cerc-watcher-mobymask/Dockerfile b/container-build/cerc-watcher-mobymask/Dockerfile index fd3e66de..48cf1245 100644 --- a/container-build/cerc-watcher-mobymask/Dockerfile +++ b/container-build/cerc-watcher-mobymask/Dockerfile @@ -1,8 +1,23 @@ # TODO: move this into the cerc-io/mobymask-watcher repo FROM node:16.17.1-alpine3.16 +RUN apk --update --no-cache add git python3 alpine-sdk + WORKDIR /app -COPY . . +COPY assemblyscript assemblyscript +COPY watcher-ts watcher-ts -RUN apk --update --no-cache add git && yarn && yarn build +# TODO: needs branch ng-integrate-asyncify +# TODO: why are we mixing npm and yarn below? +RUN echo "Building assemblyscript" && \ + cd assemblyscript && \ + npm install && npm run build && yarn link + +# TODO: needs branch v0.2.13 +RUN echo "Building watcher-ts" && \ + cd watcher-ts/packages/graph-node && yarn remove @vulcanize/assemblyscript && \ + yarn add https://github.com/vulcanize/assemblyscript.git#ng-integrate-asyncify && \ + cd ../../../watcher-ts && yarn && yarn link "@vulcanize/assemblyscript" && yarn build + +WORKDIR /app/watcher-ts/packages/mobymask-watcher diff --git a/container-build/cerc-watcher-mobymask/build.sh b/container-build/cerc-watcher-mobymask/build.sh index 74782c99..a4a97cdd 100755 --- a/container-build/cerc-watcher-mobymask/build.sh +++ b/container-build/cerc-watcher-mobymask/build.sh @@ -4,4 +4,5 @@ # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/watcher-mobymask:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/mobymask-watcher +# TODO: add a mechanism to pass two repos into a container rather than the parent directory as below +docker build -t cerc/watcher-mobymask:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR} diff --git a/repository-list.txt b/repository-list.txt index 97dfb413..6bc5970d 100644 --- a/repository-list.txt +++ b/repository-list.txt @@ -10,3 +10,5 @@ vulcanize/ipld-eth-beacon-db cerc-io/laconicd cerc-io/laconic-cns-cli cerc-io/mobymask-watcher +cerc-io/watcher-ts +vulcanize/assemblyscript From c5895bed0ddd5cda413f6cd0ace8c91666e1ac4e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 6 Nov 2022 17:45:32 -0700 Subject: [PATCH 0104/1010] Fix up compose file --- compose/docker-compose-watcher-mobymask.yml | 6 ++---- stacks/mobymask/stack.yml | 3 ++- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/compose/docker-compose-watcher-mobymask.yml b/compose/docker-compose-watcher-mobymask.yml index 89892b33..38ea0cc4 100644 --- a/compose/docker-compose-watcher-mobymask.yml +++ b/compose/docker-compose-watcher-mobymask.yml @@ -27,8 +27,7 @@ services: depends_on: watcher-db: condition: service_healthy - build: - context: ../common/watcher-ts + image: cerc/watcher-mobymask:local command: ["sh", "-c", "yarn server"] volumes: - ../common/watcher-ts/mobymask-watcher.toml:/app/packages/mobymask-watcher/environments/local.toml @@ -49,8 +48,7 @@ services: condition: service_healthy watcher-db: condition: service_healthy - build: - context: ../common/watcher-ts + image: cerc/watcher-mobymask:local command: ["sh", "-c", "yarn job-runner"] volumes: - ../common/watcher-ts/mobymask-watcher.toml:/app/packages/mobymask-watcher/environments/local.toml diff --git a/stacks/mobymask/stack.yml b/stacks/mobymask/stack.yml index 3dd4e798..c7b4eea6 100644 --- a/stacks/mobymask/stack.yml +++ b/stacks/mobymask/stack.yml @@ -1,6 +1,7 @@ name: mobymask-watcher repos: - - cerc-io/mobymask-watcher + - cerc-io/watcher-ts/v0.2.13 + - vulcanize/assemblyscript/ng-integrate-asyncify containers: - cerc/watcher-mobymask pods: From b268d76a275a85009d686c90da668c32551ef37e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 7 Nov 2022 08:35:41 -0700 Subject: [PATCH 0105/1010] Target a specific TimescaleDB image version --- compose/docker-compose-db.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compose/docker-compose-db.yml b/compose/docker-compose-db.yml index fe7f4741..f437c66d 100644 --- a/compose/docker-compose-db.yml +++ b/compose/docker-compose-db.yml @@ -15,7 +15,7 @@ services: DATABASE_PORT: 5432 ipld-eth-db: - image: timescale/timescaledb:latest-pg14 + image: timescale/timescaledb:2.8.1-pg14 restart: always environment: POSTGRES_USER: "vdbm" From e6859c03ad8514c891e60dde4e0049ff0dda954e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 7 Nov 2022 20:23:52 -0700 Subject: [PATCH 0106/1010] Fix build for yarn insanity --- .../cerc-watcher-mobymask/Dockerfile | 12 ++++++++---- stacks/mobymask/README.md | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/container-build/cerc-watcher-mobymask/Dockerfile b/container-build/cerc-watcher-mobymask/Dockerfile index 48cf1245..b27c6f96 100644 --- a/container-build/cerc-watcher-mobymask/Dockerfile +++ b/container-build/cerc-watcher-mobymask/Dockerfile @@ -9,15 +9,19 @@ COPY assemblyscript assemblyscript COPY watcher-ts watcher-ts # TODO: needs branch ng-integrate-asyncify -# TODO: why are we mixing npm and yarn below? +# We use a mixture of npm and yarn below because the upstream +# project checked in an npm package-log.json file RUN echo "Building assemblyscript" && \ cd assemblyscript && \ npm install && npm run build && yarn link # TODO: needs branch v0.2.13 -RUN echo "Building watcher-ts" && \ +# The shenanigans below is due to yarn and lerna being a dumpster-fire +RUN echo "Linking watcher-ts to local assemblyscript" && \ cd watcher-ts/packages/graph-node && yarn remove @vulcanize/assemblyscript && \ - yarn add https://github.com/vulcanize/assemblyscript.git#ng-integrate-asyncify && \ - cd ../../../watcher-ts && yarn && yarn link "@vulcanize/assemblyscript" && yarn build + yarn add https://github.com/vulcanize/assemblyscript.git#ng-integrate-asyncify + +RUN echo "Building watcher-tst" && \ + cd watcher-ts && yarn && yarn link "@vulcanize/assemblyscript" && yarn build WORKDIR /app/watcher-ts/packages/mobymask-watcher diff --git a/stacks/mobymask/README.md b/stacks/mobymask/README.md index 542064d6..b3263d88 100644 --- a/stacks/mobymask/README.md +++ b/stacks/mobymask/README.md @@ -2,3 +2,22 @@ ## Set up a Mobymask Watcher +## Clone required repositories +``` +$ laconic-so setup-repositories +``` +Checkout required branches: +``` +$ cd ~/cerc/assemblyscript +$ git checkout ng-integrate-asyncify +$ cd ~/cerc/watcher-ts +$ git checkout v0.2.13 +``` +## Build the watcher container +``` +$ laconic-sh build-containers --include cerc/watcher-mobymask +``` +## Deploy the stack +``` +$ laconic-sh deploy-system --include watcher-mobymask +``` \ No newline at end of file From b7193b8715d6a658522e4b84d85f01fda752e9f3 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 7 Nov 2022 22:22:54 -0700 Subject: [PATCH 0107/1010] Deploy mobymask watcher --- app/deploy_system.py | 11 +- compose/docker-compose-watcher-mobymask.yml | 8 +- .../multiple-postgressql-databases.sh | 38 + .../watcher-mobymask/mobymask-watcher-db.sql | 1062 +++++++++++++++++ config/watcher-mobymask/mobymask-watcher.toml | 53 + pod-list.txt | 1 + stacks/mobymask/README.md | 2 + 7 files changed, 1168 insertions(+), 7 deletions(-) create mode 100755 config/postgresql/multiple-postgressql-databases.sh create mode 100644 config/watcher-mobymask/mobymask-watcher-db.sql create mode 100644 config/watcher-mobymask/mobymask-watcher.toml diff --git a/app/deploy_system.py b/app/deploy_system.py index 5534415c..ad8614ff 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -27,9 +27,10 @@ from .util import include_exclude_check @click.option("--include", help="only start these components") @click.option("--exclude", help="don\'t start these components") @click.option("--cluster", help="specify a non-default cluster name") -@click.argument('command') # help: command: up|down|ps +@click.argument('command', required=True) # help: command: up|down|ps +@click.argument('services', nargs=-1) # help: command: up|down|ps @click.pass_context -def command(ctx, include, exclude, cluster, command): +def command(ctx, include, exclude, cluster, command, services): '''deploy a stack''' # TODO: implement option exclusion and command value constraint lost with the move from argparse to click @@ -70,11 +71,13 @@ def command(ctx, include, exclude, cluster, command): # See: https://gabrieldemarmiesse.github.io/python-on-whales/sub-commands/compose/ docker = DockerClient(compose_files=compose_files, compose_project_name=cluster) + services_list = list(services) or None + if not dry_run: if command == "up": if verbose: - print("Running compose up") - docker.compose.up(detach=True) + print(f"Running compose up for services: {services_list}") + docker.compose.up(detach=True, services=services_list) elif command == "down": if verbose: print("Running compose down") diff --git a/compose/docker-compose-watcher-mobymask.yml b/compose/docker-compose-watcher-mobymask.yml index 38ea0cc4..c6967684 100644 --- a/compose/docker-compose-watcher-mobymask.yml +++ b/compose/docker-compose-watcher-mobymask.yml @@ -1,5 +1,7 @@ version: '3.2' +# TODO: remove hard-wired host ports + services: watcher-db: @@ -11,7 +13,7 @@ services: - POSTGRES_EXTENSION=mobymask-watcher-job-queue:pgcrypto - POSTGRES_PASSWORD=password volumes: - - ../common/initdb.d/multiple-postgressql-databases.sh:/docker-entrypoint-initdb.d/multiple-postgressql-databases.sh + - ../config/postgresql/multiple-postgressql-databases.sh:/docker-entrypoint-initdb.d/multiple-postgressql-databases.sh - watcher_db_data:/var/lib/postgresql/data ports: - "0.0.0.0:15432:5432" @@ -30,7 +32,7 @@ services: image: cerc/watcher-mobymask:local command: ["sh", "-c", "yarn server"] volumes: - - ../common/watcher-ts/mobymask-watcher.toml:/app/packages/mobymask-watcher/environments/local.toml + - ../config/watcher-mobymask/mobymask-watcher.toml:/app/packages/mobymask-watcher/environments/local.toml ports: - "0.0.0.0:3001:3001" - "0.0.0.0:9001:9001" @@ -51,7 +53,7 @@ services: image: cerc/watcher-mobymask:local command: ["sh", "-c", "yarn job-runner"] volumes: - - ../common/watcher-ts/mobymask-watcher.toml:/app/packages/mobymask-watcher/environments/local.toml + - ../config/watcher-mobymask/mobymask-watcher.toml:/app/packages/mobymask-watcher/environments/local.toml ports: - "0.0.0.0:9000:9000" diff --git a/config/postgresql/multiple-postgressql-databases.sh b/config/postgresql/multiple-postgressql-databases.sh new file mode 100755 index 00000000..375ff9eb --- /dev/null +++ b/config/postgresql/multiple-postgressql-databases.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +set -e +set -u + +function create_user_and_database() { + local database=$1 + echo " Creating user and database '$database'" + psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL + CREATE DATABASE "$database"; + GRANT ALL PRIVILEGES ON DATABASE "$database" TO $POSTGRES_USER; +EOSQL +} + +function create_extension() { + local database=$(echo $1 | tr ':' ' ' | awk '{print $1}') + local extension=$(echo $1 | tr ':' ' ' | awk '{print $2}') + echo " Creating database '$database' extension '$extension'" + psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" "$database" <<-EOSQL + CREATE EXTENSION "$extension"; +EOSQL +} + +if [ -n "$POSTGRES_MULTIPLE_DATABASES" ]; then + echo "Multiple database creation requested: $POSTGRES_MULTIPLE_DATABASES" + for db in $(echo $POSTGRES_MULTIPLE_DATABASES | tr ',' ' '); do + create_user_and_database $db + done + echo "Multiple databases created" +fi + +if [ -n "$POSTGRES_EXTENSION" ]; then + echo "Extension database creation requested: $POSTGRES_EXTENSION" + for db in $(echo $POSTGRES_EXTENSION | tr ',' ' '); do + create_extension $db + done + echo "Extensions created" +fi diff --git a/config/watcher-mobymask/mobymask-watcher-db.sql b/config/watcher-mobymask/mobymask-watcher-db.sql new file mode 100644 index 00000000..5b116b79 --- /dev/null +++ b/config/watcher-mobymask/mobymask-watcher-db.sql @@ -0,0 +1,1062 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 12.11 +-- Dumped by pg_dump version 14.3 (Ubuntu 14.3-0ubuntu0.22.04.1) + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +-- +-- Name: ipld_block_kind_enum; Type: TYPE; Schema: public; Owner: vdbm +-- + +CREATE TYPE public.ipld_block_kind_enum AS ENUM ( + 'diff', + 'init', + 'diff_staged', + 'checkpoint' +); + + +ALTER TYPE public.ipld_block_kind_enum OWNER TO vdbm; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: _owner; Type: TABLE; Schema: public; Owner: vdbm +-- + +CREATE TABLE public._owner ( + id integer NOT NULL, + block_hash character varying(66) NOT NULL, + block_number integer NOT NULL, + contract_address character varying(42) NOT NULL, + value character varying NOT NULL, + proof text +); + + +ALTER TABLE public._owner OWNER TO vdbm; + +-- +-- Name: _owner_id_seq; Type: SEQUENCE; Schema: public; Owner: vdbm +-- + +CREATE SEQUENCE public._owner_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public._owner_id_seq OWNER TO vdbm; + +-- +-- Name: _owner_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: vdbm +-- + +ALTER SEQUENCE public._owner_id_seq OWNED BY public._owner.id; + + +-- +-- Name: block_progress; Type: TABLE; Schema: public; Owner: vdbm +-- + +CREATE TABLE public.block_progress ( + id integer NOT NULL, + cid character varying NOT NULL, + block_hash character varying(66) NOT NULL, + parent_hash character varying(66) NOT NULL, + block_number integer NOT NULL, + block_timestamp integer NOT NULL, + num_events integer NOT NULL, + num_processed_events integer NOT NULL, + last_processed_event_index integer NOT NULL, + is_complete boolean NOT NULL, + is_pruned boolean DEFAULT false NOT NULL, + created_at timestamp without time zone DEFAULT now() NOT NULL +); + + +ALTER TABLE public.block_progress OWNER TO vdbm; + +-- +-- Name: block_progress_id_seq; Type: SEQUENCE; Schema: public; Owner: vdbm +-- + +CREATE SEQUENCE public.block_progress_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.block_progress_id_seq OWNER TO vdbm; + +-- +-- Name: block_progress_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: vdbm +-- + +ALTER SEQUENCE public.block_progress_id_seq OWNED BY public.block_progress.id; + + +-- +-- Name: contract; Type: TABLE; Schema: public; Owner: vdbm +-- + +CREATE TABLE public.contract ( + id integer NOT NULL, + address character varying(42) NOT NULL, + kind character varying NOT NULL, + checkpoint boolean NOT NULL, + starting_block integer NOT NULL +); + + +ALTER TABLE public.contract OWNER TO vdbm; + +-- +-- Name: contract_id_seq; Type: SEQUENCE; Schema: public; Owner: vdbm +-- + +CREATE SEQUENCE public.contract_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.contract_id_seq OWNER TO vdbm; + +-- +-- Name: contract_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: vdbm +-- + +ALTER SEQUENCE public.contract_id_seq OWNED BY public.contract.id; + + +-- +-- Name: domain_hash; Type: TABLE; Schema: public; Owner: vdbm +-- + +CREATE TABLE public.domain_hash ( + id integer NOT NULL, + block_hash character varying(66) NOT NULL, + block_number integer NOT NULL, + contract_address character varying(42) NOT NULL, + value character varying NOT NULL, + proof text +); + + +ALTER TABLE public.domain_hash OWNER TO vdbm; + +-- +-- Name: domain_hash_id_seq; Type: SEQUENCE; Schema: public; Owner: vdbm +-- + +CREATE SEQUENCE public.domain_hash_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.domain_hash_id_seq OWNER TO vdbm; + +-- +-- Name: domain_hash_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: vdbm +-- + +ALTER SEQUENCE public.domain_hash_id_seq OWNED BY public.domain_hash.id; + + +-- +-- Name: event; Type: TABLE; Schema: public; Owner: vdbm +-- + +CREATE TABLE public.event ( + id integer NOT NULL, + tx_hash character varying(66) NOT NULL, + index integer NOT NULL, + contract character varying(42) NOT NULL, + event_name character varying(256) NOT NULL, + event_info text NOT NULL, + extra_info text NOT NULL, + proof text NOT NULL, + block_id integer +); + + +ALTER TABLE public.event OWNER TO vdbm; + +-- +-- Name: event_id_seq; Type: SEQUENCE; Schema: public; Owner: vdbm +-- + +CREATE SEQUENCE public.event_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.event_id_seq OWNER TO vdbm; + +-- +-- Name: event_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: vdbm +-- + +ALTER SEQUENCE public.event_id_seq OWNED BY public.event.id; + + +-- +-- Name: ipld_block; Type: TABLE; Schema: public; Owner: vdbm +-- + +CREATE TABLE public.ipld_block ( + id integer NOT NULL, + contract_address character varying(42) NOT NULL, + cid character varying NOT NULL, + kind public.ipld_block_kind_enum NOT NULL, + data bytea NOT NULL, + block_id integer +); + + +ALTER TABLE public.ipld_block OWNER TO vdbm; + +-- +-- Name: ipld_block_id_seq; Type: SEQUENCE; Schema: public; Owner: vdbm +-- + +CREATE SEQUENCE public.ipld_block_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.ipld_block_id_seq OWNER TO vdbm; + +-- +-- Name: ipld_block_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: vdbm +-- + +ALTER SEQUENCE public.ipld_block_id_seq OWNED BY public.ipld_block.id; + + +-- +-- Name: ipld_status; Type: TABLE; Schema: public; Owner: vdbm +-- + +CREATE TABLE public.ipld_status ( + id integer NOT NULL, + latest_hooks_block_number integer NOT NULL, + latest_checkpoint_block_number integer NOT NULL, + latest_ipfs_block_number integer NOT NULL +); + + +ALTER TABLE public.ipld_status OWNER TO vdbm; + +-- +-- Name: ipld_status_id_seq; Type: SEQUENCE; Schema: public; Owner: vdbm +-- + +CREATE SEQUENCE public.ipld_status_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.ipld_status_id_seq OWNER TO vdbm; + +-- +-- Name: ipld_status_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: vdbm +-- + +ALTER SEQUENCE public.ipld_status_id_seq OWNED BY public.ipld_status.id; + + +-- +-- Name: is_member; Type: TABLE; Schema: public; Owner: vdbm +-- + +CREATE TABLE public.is_member ( + id integer NOT NULL, + block_hash character varying(66) NOT NULL, + block_number integer NOT NULL, + contract_address character varying(42) NOT NULL, + key0 character varying NOT NULL, + value boolean NOT NULL, + proof text +); + + +ALTER TABLE public.is_member OWNER TO vdbm; + +-- +-- Name: is_member_id_seq; Type: SEQUENCE; Schema: public; Owner: vdbm +-- + +CREATE SEQUENCE public.is_member_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.is_member_id_seq OWNER TO vdbm; + +-- +-- Name: is_member_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: vdbm +-- + +ALTER SEQUENCE public.is_member_id_seq OWNED BY public.is_member.id; + + +-- +-- Name: is_phisher; Type: TABLE; Schema: public; Owner: vdbm +-- + +CREATE TABLE public.is_phisher ( + id integer NOT NULL, + block_hash character varying(66) NOT NULL, + block_number integer NOT NULL, + contract_address character varying(42) NOT NULL, + key0 character varying NOT NULL, + value boolean NOT NULL, + proof text +); + + +ALTER TABLE public.is_phisher OWNER TO vdbm; + +-- +-- Name: is_phisher_id_seq; Type: SEQUENCE; Schema: public; Owner: vdbm +-- + +CREATE SEQUENCE public.is_phisher_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.is_phisher_id_seq OWNER TO vdbm; + +-- +-- Name: is_phisher_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: vdbm +-- + +ALTER SEQUENCE public.is_phisher_id_seq OWNED BY public.is_phisher.id; + + +-- +-- Name: is_revoked; Type: TABLE; Schema: public; Owner: vdbm +-- + +CREATE TABLE public.is_revoked ( + id integer NOT NULL, + block_hash character varying(66) NOT NULL, + block_number integer NOT NULL, + contract_address character varying(42) NOT NULL, + key0 character varying NOT NULL, + value boolean NOT NULL, + proof text +); + + +ALTER TABLE public.is_revoked OWNER TO vdbm; + +-- +-- Name: is_revoked_id_seq; Type: SEQUENCE; Schema: public; Owner: vdbm +-- + +CREATE SEQUENCE public.is_revoked_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.is_revoked_id_seq OWNER TO vdbm; + +-- +-- Name: is_revoked_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: vdbm +-- + +ALTER SEQUENCE public.is_revoked_id_seq OWNED BY public.is_revoked.id; + + +-- +-- Name: multi_nonce; Type: TABLE; Schema: public; Owner: vdbm +-- + +CREATE TABLE public.multi_nonce ( + id integer NOT NULL, + block_hash character varying(66) NOT NULL, + block_number integer NOT NULL, + contract_address character varying(42) NOT NULL, + key0 character varying(42) NOT NULL, + key1 numeric NOT NULL, + value numeric NOT NULL, + proof text +); + + +ALTER TABLE public.multi_nonce OWNER TO vdbm; + +-- +-- Name: multi_nonce_id_seq; Type: SEQUENCE; Schema: public; Owner: vdbm +-- + +CREATE SEQUENCE public.multi_nonce_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.multi_nonce_id_seq OWNER TO vdbm; + +-- +-- Name: multi_nonce_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: vdbm +-- + +ALTER SEQUENCE public.multi_nonce_id_seq OWNED BY public.multi_nonce.id; + + +-- +-- Name: sync_status; Type: TABLE; Schema: public; Owner: vdbm +-- + +CREATE TABLE public.sync_status ( + id integer NOT NULL, + chain_head_block_hash character varying(66) NOT NULL, + chain_head_block_number integer NOT NULL, + latest_indexed_block_hash character varying(66) NOT NULL, + latest_indexed_block_number integer NOT NULL, + latest_canonical_block_hash character varying(66) NOT NULL, + latest_canonical_block_number integer NOT NULL, + initial_indexed_block_hash character varying(66) NOT NULL, + initial_indexed_block_number integer NOT NULL +); + + +ALTER TABLE public.sync_status OWNER TO vdbm; + +-- +-- Name: sync_status_id_seq; Type: SEQUENCE; Schema: public; Owner: vdbm +-- + +CREATE SEQUENCE public.sync_status_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.sync_status_id_seq OWNER TO vdbm; + +-- +-- Name: sync_status_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: vdbm +-- + +ALTER SEQUENCE public.sync_status_id_seq OWNED BY public.sync_status.id; + + +-- +-- Name: _owner id; Type: DEFAULT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public._owner ALTER COLUMN id SET DEFAULT nextval('public._owner_id_seq'::regclass); + + +-- +-- Name: block_progress id; Type: DEFAULT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.block_progress ALTER COLUMN id SET DEFAULT nextval('public.block_progress_id_seq'::regclass); + + +-- +-- Name: contract id; Type: DEFAULT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.contract ALTER COLUMN id SET DEFAULT nextval('public.contract_id_seq'::regclass); + + +-- +-- Name: domain_hash id; Type: DEFAULT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.domain_hash ALTER COLUMN id SET DEFAULT nextval('public.domain_hash_id_seq'::regclass); + + +-- +-- Name: event id; Type: DEFAULT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.event ALTER COLUMN id SET DEFAULT nextval('public.event_id_seq'::regclass); + + +-- +-- Name: ipld_block id; Type: DEFAULT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.ipld_block ALTER COLUMN id SET DEFAULT nextval('public.ipld_block_id_seq'::regclass); + + +-- +-- Name: ipld_status id; Type: DEFAULT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.ipld_status ALTER COLUMN id SET DEFAULT nextval('public.ipld_status_id_seq'::regclass); + + +-- +-- Name: is_member id; Type: DEFAULT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.is_member ALTER COLUMN id SET DEFAULT nextval('public.is_member_id_seq'::regclass); + + +-- +-- Name: is_phisher id; Type: DEFAULT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.is_phisher ALTER COLUMN id SET DEFAULT nextval('public.is_phisher_id_seq'::regclass); + + +-- +-- Name: is_revoked id; Type: DEFAULT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.is_revoked ALTER COLUMN id SET DEFAULT nextval('public.is_revoked_id_seq'::regclass); + + +-- +-- Name: multi_nonce id; Type: DEFAULT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.multi_nonce ALTER COLUMN id SET DEFAULT nextval('public.multi_nonce_id_seq'::regclass); + + +-- +-- Name: sync_status id; Type: DEFAULT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.sync_status ALTER COLUMN id SET DEFAULT nextval('public.sync_status_id_seq'::regclass); + + +-- +-- Data for Name: _owner; Type: TABLE DATA; Schema: public; Owner: vdbm +-- + +COPY public._owner (id, block_hash, block_number, contract_address, value, proof) FROM stdin; +\. + + +-- +-- Data for Name: block_progress; Type: TABLE DATA; Schema: public; Owner: vdbm +-- + +COPY public.block_progress (id, cid, block_hash, parent_hash, block_number, block_timestamp, num_events, num_processed_events, last_processed_event_index, is_complete, is_pruned, created_at) FROM stdin; +1 bagiacgzahk6aqbbp75hft2xvtqnj425qaxj7ze4fspykcs745cyxg34bb3ba 0x3abc08042fff4e59eaf59c1a9e6bb005d3fc938593f0a14bfce8b1736f810ec2 0xafbdc83ac2dc79b5500c67751472eeac76594e4466c367b5f4a2895cd175ed97 14869713 1653872939 1 1 77 t f 2022-07-18 12:34:00.523 +5 bagiacgzav62hayc73buzkf24foyh5vrnt54ndxv76m6of7dprvpqpkpl5sra 0xafb470605fd86995175c2bb07ed62d9f78d1debff33ce2fc6f8d5f07a9ebeca2 0x33283f0fa7702e8c366715738c1d34c9750edd9cf74ae5dfb8d11f262ad69027 14885755 1654099778 2 2 119 t f 2022-07-18 12:34:42.361 +2 bagiacgzafdfrnz2azvox32djx3rjk7tuij4q5hlxjzxhdackm6jty7tcqa4a 0x28cb16e740cd5d7de869bee2957e7442790e9d774e6e71804a67933c7e628038 0xabd4915ed36022a05a9d95f51dc702103a2caab4c2f161321ab12a6bb77f01d1 14875233 1653950619 8 8 440 t f 2022-07-18 12:34:09.416 +3 bagiacgzan6rpxee4tm4gmzgcer3yx4enpvodtpzn2t2bjj72cblkhrng5bxa 0x6fa2fb909c9b386664c224778bf08d7d5c39bf2dd4f414a7fa1056a3c5a6e86e 0x976a8cb34b85994bce2fa5bda884f2a7c8ad68050645cb2dba5519e59cba013d 14876405 1653966919 4 4 274 t f 2022-07-18 12:34:19.014 +4 bagiacgzabrcmklsd5c3egq2hlrypg7opagtvuysqaf5r2q7nue2stozixbaa 0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840 0xe48d7477413de216d3f7f4868b472047b82c8738890d7096f6c0e8398e92e39e 14884873 1654087572 12 12 518 t f 2022-07-18 12:34:33.681 +6 bagiacgzad4pz3x2ugxppkduwmvr2ncx4gavr2q5r5limcwr3gol2c7cff24q 0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9 0xbb8016b536b4f4e8ee93c614d74485a7d7eca814b49132599a932cfd03e324a2 15234194 1659054431 12 12 236 t f 2022-07-29 10:37:48.236 +\. + + +-- +-- Data for Name: contract; Type: TABLE DATA; Schema: public; Owner: vdbm +-- + +COPY public.contract (id, address, kind, checkpoint, starting_block) FROM stdin; +1 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 PhisherRegistry t 14869713 +\. + + +-- +-- Data for Name: domain_hash; Type: TABLE DATA; Schema: public; Owner: vdbm +-- + +COPY public.domain_hash (id, block_hash, block_number, contract_address, value, proof) FROM stdin; +\. + + +-- +-- Data for Name: event; Type: TABLE DATA; Schema: public; Owner: vdbm +-- + +COPY public.event (id, tx_hash, index, contract, event_name, event_info, extra_info, proof, block_id) FROM stdin; +1 0x82f33cec81da44e94ef69924bc7d786d3f7856f06c1ef583d266dd1b7f091b82 77 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 OwnershipTransferred {"previousOwner":"0x0000000000000000000000000000000000000000","newOwner":"0xDdb18b319BE3530560eECFF962032dFAD88212d4"} {"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4"],"data":"0x","tx":{"cid":"bagjqcgzaqlztz3eb3jcostxwtesly7lynu7xqvxqnqppla6sm3orw7yjdoba","txHash":"0x82f33cec81da44e94ef69924bc7d786d3f7856f06c1ef583d266dd1b7f091b82","index":38,"src":"0xDdb18b319BE3530560eECFF962032dFAD88212d4","dst":"","__typename":"EthTransactionCid"},"eventSignature":"OwnershipTransferred(address,address)"} {"data":"{\\"blockHash\\":\\"0x3abc08042fff4e59eaf59c1a9e6bb005d3fc938593f0a14bfce8b1736f810ec2\\",\\"receiptCID\\":\\"bagkacgzappvknoiwyepymknt7dbcfh3jlejpscm3frdd66dwvkvmfwuuuota\\",\\"log\\":{\\"cid\\":\\"bagmqcgzak5xa5kdm3sjuvm3un77ll7oz2degukktjargydrj4fayhimdfo3a\\",\\"ipldBlock\\":\\"0xf882822080b87df87b94b06e6db9288324738f04fcaac910f5a60102c1f8f863a08be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0a00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d480\\"}}"} 1 +2 0x98998f7446c63178ea77d1b184cdfe781b9cbcff27100f03806f482b354f1be9 433 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 DelegationTriggered {"principal":"0xDdb18b319BE3530560eECFF962032dFAD88212d4","agent":"0xDdb18b319BE3530560eECFF962032dFAD88212d4"} {"topics":["0x185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960","0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4"],"data":"0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4","tx":{"cid":"bagjqcgzatcmy65cgyyyxr2tx2gyyjtp6panzzph7e4ia6a4an5ecwnkpdpuq","txHash":"0x98998f7446c63178ea77d1b184cdfe781b9cbcff27100f03806f482b354f1be9","index":136,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"DelegationTriggered(address,address)"} {"data":"{\\"blockHash\\":\\"0x28cb16e740cd5d7de869bee2957e7442790e9d774e6e71804a67933c7e628038\\",\\"receiptCID\\":\\"bagkacgza7njxwiac6p4vxcmw5gnyxs32bum5jeq6k3j7xxyzaqm7gcrw6hwa\\",\\"log\\":{\\"cid\\":\\"bagmqcgzaz22koutltuxcphbuc72dcdt6xuqr2e3mk4w75xksg2zzqaynbmoa\\",\\"ipldBlock\\":\\"0xf87f30b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a0185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4\\"}}"} 2 +3 0x98998f7446c63178ea77d1b184cdfe781b9cbcff27100f03806f482b354f1be9 434 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 MemberStatusUpdated {"entity":"0xdd77c46f6a736e44f19d33c56378a607fe3868a8c1a0866951beab5c9abc9aab","isMember":true} {"topics":["0x88e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2","0xdd77c46f6a736e44f19d33c56378a607fe3868a8c1a0866951beab5c9abc9aab"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","tx":{"cid":"bagjqcgzatcmy65cgyyyxr2tx2gyyjtp6panzzph7e4ia6a4an5ecwnkpdpuq","txHash":"0x98998f7446c63178ea77d1b184cdfe781b9cbcff27100f03806f482b354f1be9","index":136,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"MemberStatusUpdated(string,bool)"} {"data":"{\\"blockHash\\":\\"0x28cb16e740cd5d7de869bee2957e7442790e9d774e6e71804a67933c7e628038\\",\\"receiptCID\\":\\"bagkacgza7njxwiac6p4vxcmw5gnyxs32bum5jeq6k3j7xxyzaqm7gcrw6hwa\\",\\"log\\":{\\"cid\\":\\"bagmqcgzaflsnlinnufdz4ipp7vhrvg4gggvptx7ringzkwjfsrkw5bstou7a\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a088e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2a0dd77c46f6a736e44f19d33c56378a607fe3868a8c1a0866951beab5c9abc9aaba00000000000000000000000000000000000000000000000000000000000000001\\"}}"} 2 +4 0x98998f7446c63178ea77d1b184cdfe781b9cbcff27100f03806f482b354f1be9 435 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 DelegationTriggered {"principal":"0xDdb18b319BE3530560eECFF962032dFAD88212d4","agent":"0xDdb18b319BE3530560eECFF962032dFAD88212d4"} {"topics":["0x185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960","0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4"],"data":"0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4","tx":{"cid":"bagjqcgzatcmy65cgyyyxr2tx2gyyjtp6panzzph7e4ia6a4an5ecwnkpdpuq","txHash":"0x98998f7446c63178ea77d1b184cdfe781b9cbcff27100f03806f482b354f1be9","index":136,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"DelegationTriggered(address,address)"} {"data":"{\\"blockHash\\":\\"0x28cb16e740cd5d7de869bee2957e7442790e9d774e6e71804a67933c7e628038\\",\\"receiptCID\\":\\"bagkacgza7njxwiac6p4vxcmw5gnyxs32bum5jeq6k3j7xxyzaqm7gcrw6hwa\\",\\"log\\":{\\"cid\\":\\"bagmqcgzanj72wfbfvqby3dvz3jnh5nwstmvl3nlm6kxrkgfio7z643s2qesq\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a0185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4\\"}}"} 2 +5 0x98998f7446c63178ea77d1b184cdfe781b9cbcff27100f03806f482b354f1be9 436 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 MemberStatusUpdated {"entity":"0x501b05f326e247749a9ee05e173a4b32508afcf85ec6dbb26a6cbb2a4f2e8671","isMember":true} {"topics":["0x88e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2","0x501b05f326e247749a9ee05e173a4b32508afcf85ec6dbb26a6cbb2a4f2e8671"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","tx":{"cid":"bagjqcgzatcmy65cgyyyxr2tx2gyyjtp6panzzph7e4ia6a4an5ecwnkpdpuq","txHash":"0x98998f7446c63178ea77d1b184cdfe781b9cbcff27100f03806f482b354f1be9","index":136,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"MemberStatusUpdated(string,bool)"} {"data":"{\\"blockHash\\":\\"0x28cb16e740cd5d7de869bee2957e7442790e9d774e6e71804a67933c7e628038\\",\\"receiptCID\\":\\"bagkacgza7njxwiac6p4vxcmw5gnyxs32bum5jeq6k3j7xxyzaqm7gcrw6hwa\\",\\"log\\":{\\"cid\\":\\"bagmqcgzalcfjovtx7akikb4dhhu3i65pym47rdy3rys6d7trlfdzmr53us2a\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a088e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2a0501b05f326e247749a9ee05e173a4b32508afcf85ec6dbb26a6cbb2a4f2e8671a00000000000000000000000000000000000000000000000000000000000000001\\"}}"} 2 +6 0x98998f7446c63178ea77d1b184cdfe781b9cbcff27100f03806f482b354f1be9 437 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 DelegationTriggered {"principal":"0xDdb18b319BE3530560eECFF962032dFAD88212d4","agent":"0xDdb18b319BE3530560eECFF962032dFAD88212d4"} {"topics":["0x185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960","0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4"],"data":"0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4","tx":{"cid":"bagjqcgzatcmy65cgyyyxr2tx2gyyjtp6panzzph7e4ia6a4an5ecwnkpdpuq","txHash":"0x98998f7446c63178ea77d1b184cdfe781b9cbcff27100f03806f482b354f1be9","index":136,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"DelegationTriggered(address,address)"} {"data":"{\\"blockHash\\":\\"0x28cb16e740cd5d7de869bee2957e7442790e9d774e6e71804a67933c7e628038\\",\\"receiptCID\\":\\"bagkacgza7njxwiac6p4vxcmw5gnyxs32bum5jeq6k3j7xxyzaqm7gcrw6hwa\\",\\"log\\":{\\"cid\\":\\"bagmqcgzanj72wfbfvqby3dvz3jnh5nwstmvl3nlm6kxrkgfio7z643s2qesq\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a0185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4\\"}}"} 2 +7 0x98998f7446c63178ea77d1b184cdfe781b9cbcff27100f03806f482b354f1be9 438 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 MemberStatusUpdated {"entity":"0x0b73fffe472959ca14f2bfa56de755ad570d80daaf8eb935ac5e60578d9cdf6e","isMember":true} {"topics":["0x88e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2","0x0b73fffe472959ca14f2bfa56de755ad570d80daaf8eb935ac5e60578d9cdf6e"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","tx":{"cid":"bagjqcgzatcmy65cgyyyxr2tx2gyyjtp6panzzph7e4ia6a4an5ecwnkpdpuq","txHash":"0x98998f7446c63178ea77d1b184cdfe781b9cbcff27100f03806f482b354f1be9","index":136,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"MemberStatusUpdated(string,bool)"} {"data":"{\\"blockHash\\":\\"0x28cb16e740cd5d7de869bee2957e7442790e9d774e6e71804a67933c7e628038\\",\\"receiptCID\\":\\"bagkacgza7njxwiac6p4vxcmw5gnyxs32bum5jeq6k3j7xxyzaqm7gcrw6hwa\\",\\"log\\":{\\"cid\\":\\"bagmqcgzaehy7vjkfidari3wc72kp3baac2w5zjfcmt4wvz6bs4mgkpjrlnta\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a088e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2a00b73fffe472959ca14f2bfa56de755ad570d80daaf8eb935ac5e60578d9cdf6ea00000000000000000000000000000000000000000000000000000000000000001\\"}}"} 2 +8 0x98998f7446c63178ea77d1b184cdfe781b9cbcff27100f03806f482b354f1be9 439 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 DelegationTriggered {"principal":"0xDdb18b319BE3530560eECFF962032dFAD88212d4","agent":"0xDdb18b319BE3530560eECFF962032dFAD88212d4"} {"topics":["0x185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960","0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4"],"data":"0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4","tx":{"cid":"bagjqcgzatcmy65cgyyyxr2tx2gyyjtp6panzzph7e4ia6a4an5ecwnkpdpuq","txHash":"0x98998f7446c63178ea77d1b184cdfe781b9cbcff27100f03806f482b354f1be9","index":136,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"DelegationTriggered(address,address)"} {"data":"{\\"blockHash\\":\\"0x28cb16e740cd5d7de869bee2957e7442790e9d774e6e71804a67933c7e628038\\",\\"receiptCID\\":\\"bagkacgza7njxwiac6p4vxcmw5gnyxs32bum5jeq6k3j7xxyzaqm7gcrw6hwa\\",\\"log\\":{\\"cid\\":\\"bagmqcgzanj72wfbfvqby3dvz3jnh5nwstmvl3nlm6kxrkgfio7z643s2qesq\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a0185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4\\"}}"} 2 +9 0x98998f7446c63178ea77d1b184cdfe781b9cbcff27100f03806f482b354f1be9 440 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 MemberStatusUpdated {"entity":"0x8276afdf1db4e6957dd6e50fb3e6ddb56594c9adcff5403706515b9eab719f27","isMember":true} {"topics":["0x88e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2","0x8276afdf1db4e6957dd6e50fb3e6ddb56594c9adcff5403706515b9eab719f27"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","tx":{"cid":"bagjqcgzatcmy65cgyyyxr2tx2gyyjtp6panzzph7e4ia6a4an5ecwnkpdpuq","txHash":"0x98998f7446c63178ea77d1b184cdfe781b9cbcff27100f03806f482b354f1be9","index":136,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"MemberStatusUpdated(string,bool)"} {"data":"{\\"blockHash\\":\\"0x28cb16e740cd5d7de869bee2957e7442790e9d774e6e71804a67933c7e628038\\",\\"receiptCID\\":\\"bagkacgza7njxwiac6p4vxcmw5gnyxs32bum5jeq6k3j7xxyzaqm7gcrw6hwa\\",\\"log\\":{\\"cid\\":\\"bagmqcgzaqbsfupctztrjxngvfcntxi5c4pdee5sh46wmtlbs5sbbqbplcoiq\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a088e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2a08276afdf1db4e6957dd6e50fb3e6ddb56594c9adcff5403706515b9eab719f27a00000000000000000000000000000000000000000000000000000000000000001\\"}}"} 2 +10 0x930191eb049b1ce18e58b2c0017a1c3213bb509bd5469acd3b2b6c1ffc8859ff 271 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 DelegationTriggered {"principal":"0xDdb18b319BE3530560eECFF962032dFAD88212d4","agent":"0x50f01432A375DcDEa074957154e4F8d1aEB4177d"} {"topics":["0x185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960","0x00000000000000000000000050f01432a375dcdea074957154e4f8d1aeb4177d"],"data":"0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4","tx":{"cid":"bagjqcgzasmazd2yetmooddsywlaac6q4gij3wue32vdjvtj3fnwb77eilh7q","txHash":"0x930191eb049b1ce18e58b2c0017a1c3213bb509bd5469acd3b2b6c1ffc8859ff","index":296,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"DelegationTriggered(address,address)"} {"data":"{\\"blockHash\\":\\"0x6fa2fb909c9b386664c224778bf08d7d5c39bf2dd4f414a7fa1056a3c5a6e86e\\",\\"receiptCID\\":\\"bagkacgzaiwyyw2llnh3rwbyep42qkqyftchkkppb5qj5f4u6ltdz2cl5kcaa\\",\\"log\\":{\\"cid\\":\\"bagmqcgzadn3fcrvtf5wwsqprt4qjdxll76kn7teshumu3rmosxai55l3qysq\\",\\"ipldBlock\\":\\"0xf87f30b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a0185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960a000000000000000000000000050f01432a375dcdea074957154e4f8d1aeb4177da0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4\\"}}"} 3 +11 0x930191eb049b1ce18e58b2c0017a1c3213bb509bd5469acd3b2b6c1ffc8859ff 272 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 MemberStatusUpdated {"entity":"0x5be61e7fb5d5175135aaa6b232f13d9b22a229113638cdc0bac78221ff9c9aa0","isMember":true} {"topics":["0x88e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2","0x5be61e7fb5d5175135aaa6b232f13d9b22a229113638cdc0bac78221ff9c9aa0"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","tx":{"cid":"bagjqcgzasmazd2yetmooddsywlaac6q4gij3wue32vdjvtj3fnwb77eilh7q","txHash":"0x930191eb049b1ce18e58b2c0017a1c3213bb509bd5469acd3b2b6c1ffc8859ff","index":296,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"MemberStatusUpdated(string,bool)"} {"data":"{\\"blockHash\\":\\"0x6fa2fb909c9b386664c224778bf08d7d5c39bf2dd4f414a7fa1056a3c5a6e86e\\",\\"receiptCID\\":\\"bagkacgzaiwyyw2llnh3rwbyep42qkqyftchkkppb5qj5f4u6ltdz2cl5kcaa\\",\\"log\\":{\\"cid\\":\\"bagmqcgzaq5l7ow4vbidbo3p2djy5qy4mprqyir4dmol2uqeyvxc7fxfl4kvq\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a088e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2a05be61e7fb5d5175135aaa6b232f13d9b22a229113638cdc0bac78221ff9c9aa0a00000000000000000000000000000000000000000000000000000000000000001\\"}}"} 3 +12 0x930191eb049b1ce18e58b2c0017a1c3213bb509bd5469acd3b2b6c1ffc8859ff 273 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 DelegationTriggered {"principal":"0xDdb18b319BE3530560eECFF962032dFAD88212d4","agent":"0x50f01432A375DcDEa074957154e4F8d1aEB4177d"} {"topics":["0x185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960","0x00000000000000000000000050f01432a375dcdea074957154e4f8d1aeb4177d"],"data":"0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4","tx":{"cid":"bagjqcgzasmazd2yetmooddsywlaac6q4gij3wue32vdjvtj3fnwb77eilh7q","txHash":"0x930191eb049b1ce18e58b2c0017a1c3213bb509bd5469acd3b2b6c1ffc8859ff","index":296,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"DelegationTriggered(address,address)"} {"data":"{\\"blockHash\\":\\"0x6fa2fb909c9b386664c224778bf08d7d5c39bf2dd4f414a7fa1056a3c5a6e86e\\",\\"receiptCID\\":\\"bagkacgzaiwyyw2llnh3rwbyep42qkqyftchkkppb5qj5f4u6ltdz2cl5kcaa\\",\\"log\\":{\\"cid\\":\\"bagmqcgzaas5munc2du7d2ipgyxqsa7reeueczkcfyrh5zjjesllsxatj3mgq\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a0185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960a000000000000000000000000050f01432a375dcdea074957154e4f8d1aeb4177da0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4\\"}}"} 3 +13 0x930191eb049b1ce18e58b2c0017a1c3213bb509bd5469acd3b2b6c1ffc8859ff 274 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 MemberStatusUpdated {"entity":"0x956e5681abbafa25458057b0abaa1a3cec4108d2289954836d0c7f5b37fd6580","isMember":true} {"topics":["0x88e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2","0x956e5681abbafa25458057b0abaa1a3cec4108d2289954836d0c7f5b37fd6580"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","tx":{"cid":"bagjqcgzasmazd2yetmooddsywlaac6q4gij3wue32vdjvtj3fnwb77eilh7q","txHash":"0x930191eb049b1ce18e58b2c0017a1c3213bb509bd5469acd3b2b6c1ffc8859ff","index":296,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"MemberStatusUpdated(string,bool)"} {"data":"{\\"blockHash\\":\\"0x6fa2fb909c9b386664c224778bf08d7d5c39bf2dd4f414a7fa1056a3c5a6e86e\\",\\"receiptCID\\":\\"bagkacgzaiwyyw2llnh3rwbyep42qkqyftchkkppb5qj5f4u6ltdz2cl5kcaa\\",\\"log\\":{\\"cid\\":\\"bagmqcgzagp47k6p3tgrom3adpx6jvr45vne2edtejaenqggtxjjfqramcmea\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a088e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2a0956e5681abbafa25458057b0abaa1a3cec4108d2289954836d0c7f5b37fd6580a00000000000000000000000000000000000000000000000000000000000000001\\"}}"} 3 +14 0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed 507 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 DelegationTriggered {"principal":"0xDdb18b319BE3530560eECFF962032dFAD88212d4","agent":"0xBc89f39d47BF0f67CA1e0C7aBBE3236F454f748a"} {"topics":["0x185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960","0x000000000000000000000000bc89f39d47bf0f67ca1e0c7abbe3236f454f748a"],"data":"0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4","tx":{"cid":"bagjqcgzard4ovbngn6f46s7hqbcjmymigu2pclf3kttjywdwc62mfdi24dwq","txHash":"0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed","index":193,"src":"0x19c49117a8167296cAF5D23Ab48e355ec1c8bE8B","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"DelegationTriggered(address,address)"} {"data":"{\\"blockHash\\":\\"0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840\\",\\"receiptCID\\":\\"bagkacgza756voltxaaftxraxkdjhuh6jh57zla6mqkunpiajivf477kkoleq\\",\\"log\\":{\\"cid\\":\\"bagmqcgzagf7jx3lguaponolmnsjyxm2mhpkaroghk26roi7okwglucjtjs4q\\",\\"ipldBlock\\":\\"0xf87f30b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a0185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960a0000000000000000000000000bc89f39d47bf0f67ca1e0c7abbe3236f454f748aa0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4\\"}}"} 4 +15 0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed 508 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 MemberStatusUpdated {"entity":"0xdb00d9ee49d48ca5077597917bf50d84d2671b16a94c95fa4fa5be69bc50c03a","isMember":true} {"topics":["0x88e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2","0xdb00d9ee49d48ca5077597917bf50d84d2671b16a94c95fa4fa5be69bc50c03a"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","tx":{"cid":"bagjqcgzard4ovbngn6f46s7hqbcjmymigu2pclf3kttjywdwc62mfdi24dwq","txHash":"0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed","index":193,"src":"0x19c49117a8167296cAF5D23Ab48e355ec1c8bE8B","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"MemberStatusUpdated(string,bool)"} {"data":"{\\"blockHash\\":\\"0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840\\",\\"receiptCID\\":\\"bagkacgza756voltxaaftxraxkdjhuh6jh57zla6mqkunpiajivf477kkoleq\\",\\"log\\":{\\"cid\\":\\"bagmqcgzatttg7cjphkpc46klxy32jr4vfj6lxo7573nz3rob6dvnq7magsoa\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a088e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2a0db00d9ee49d48ca5077597917bf50d84d2671b16a94c95fa4fa5be69bc50c03aa00000000000000000000000000000000000000000000000000000000000000001\\"}}"} 4 +16 0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed 509 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 DelegationTriggered {"principal":"0xDdb18b319BE3530560eECFF962032dFAD88212d4","agent":"0xBc89f39d47BF0f67CA1e0C7aBBE3236F454f748a"} {"topics":["0x185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960","0x000000000000000000000000bc89f39d47bf0f67ca1e0c7abbe3236f454f748a"],"data":"0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4","tx":{"cid":"bagjqcgzard4ovbngn6f46s7hqbcjmymigu2pclf3kttjywdwc62mfdi24dwq","txHash":"0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed","index":193,"src":"0x19c49117a8167296cAF5D23Ab48e355ec1c8bE8B","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"DelegationTriggered(address,address)"} {"data":"{\\"blockHash\\":\\"0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840\\",\\"receiptCID\\":\\"bagkacgza756voltxaaftxraxkdjhuh6jh57zla6mqkunpiajivf477kkoleq\\",\\"log\\":{\\"cid\\":\\"bagmqcgza2g5np2s2ffmppacclx3gwmrjeumoi5c44l6lt64ekctavu5f356a\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a0185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960a0000000000000000000000000bc89f39d47bf0f67ca1e0c7abbe3236f454f748aa0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4\\"}}"} 4 +17 0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed 510 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 MemberStatusUpdated {"entity":"0x33dc7a4e6362711b3cbdc90edcb9a621ed5c2ba73eb4adbf3e90cc21764d550d","isMember":true} {"topics":["0x88e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2","0x33dc7a4e6362711b3cbdc90edcb9a621ed5c2ba73eb4adbf3e90cc21764d550d"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","tx":{"cid":"bagjqcgzard4ovbngn6f46s7hqbcjmymigu2pclf3kttjywdwc62mfdi24dwq","txHash":"0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed","index":193,"src":"0x19c49117a8167296cAF5D23Ab48e355ec1c8bE8B","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"MemberStatusUpdated(string,bool)"} {"data":"{\\"blockHash\\":\\"0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840\\",\\"receiptCID\\":\\"bagkacgza756voltxaaftxraxkdjhuh6jh57zla6mqkunpiajivf477kkoleq\\",\\"log\\":{\\"cid\\":\\"bagmqcgzamjreuppb5xkmjdelhahazmb54mzykjufxj4fvo42u26iqxuxpzdq\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a088e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2a033dc7a4e6362711b3cbdc90edcb9a621ed5c2ba73eb4adbf3e90cc21764d550da00000000000000000000000000000000000000000000000000000000000000001\\"}}"} 4 +18 0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed 511 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 DelegationTriggered {"principal":"0xDdb18b319BE3530560eECFF962032dFAD88212d4","agent":"0xBc89f39d47BF0f67CA1e0C7aBBE3236F454f748a"} {"topics":["0x185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960","0x000000000000000000000000bc89f39d47bf0f67ca1e0c7abbe3236f454f748a"],"data":"0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4","tx":{"cid":"bagjqcgzard4ovbngn6f46s7hqbcjmymigu2pclf3kttjywdwc62mfdi24dwq","txHash":"0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed","index":193,"src":"0x19c49117a8167296cAF5D23Ab48e355ec1c8bE8B","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"DelegationTriggered(address,address)"} {"data":"{\\"blockHash\\":\\"0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840\\",\\"receiptCID\\":\\"bagkacgza756voltxaaftxraxkdjhuh6jh57zla6mqkunpiajivf477kkoleq\\",\\"log\\":{\\"cid\\":\\"bagmqcgza2g5np2s2ffmppacclx3gwmrjeumoi5c44l6lt64ekctavu5f356a\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a0185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960a0000000000000000000000000bc89f39d47bf0f67ca1e0c7abbe3236f454f748aa0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4\\"}}"} 4 +19 0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed 512 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 MemberStatusUpdated {"entity":"0xdef5c249e7975deeacae0568ccd7ad10f4b482c4ef3476bf448ff9bb6167731f","isMember":true} {"topics":["0x88e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2","0xdef5c249e7975deeacae0568ccd7ad10f4b482c4ef3476bf448ff9bb6167731f"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","tx":{"cid":"bagjqcgzard4ovbngn6f46s7hqbcjmymigu2pclf3kttjywdwc62mfdi24dwq","txHash":"0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed","index":193,"src":"0x19c49117a8167296cAF5D23Ab48e355ec1c8bE8B","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"MemberStatusUpdated(string,bool)"} {"data":"{\\"blockHash\\":\\"0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840\\",\\"receiptCID\\":\\"bagkacgza756voltxaaftxraxkdjhuh6jh57zla6mqkunpiajivf477kkoleq\\",\\"log\\":{\\"cid\\":\\"bagmqcgzaeokcjndceushmyfhdkag7fwkg25knbwoxjxqlqhjlrkgmhjj27hq\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a088e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2a0def5c249e7975deeacae0568ccd7ad10f4b482c4ef3476bf448ff9bb6167731fa00000000000000000000000000000000000000000000000000000000000000001\\"}}"} 4 +20 0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed 513 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 DelegationTriggered {"principal":"0xDdb18b319BE3530560eECFF962032dFAD88212d4","agent":"0xBc89f39d47BF0f67CA1e0C7aBBE3236F454f748a"} {"topics":["0x185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960","0x000000000000000000000000bc89f39d47bf0f67ca1e0c7abbe3236f454f748a"],"data":"0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4","tx":{"cid":"bagjqcgzard4ovbngn6f46s7hqbcjmymigu2pclf3kttjywdwc62mfdi24dwq","txHash":"0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed","index":193,"src":"0x19c49117a8167296cAF5D23Ab48e355ec1c8bE8B","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"DelegationTriggered(address,address)"} {"data":"{\\"blockHash\\":\\"0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840\\",\\"receiptCID\\":\\"bagkacgza756voltxaaftxraxkdjhuh6jh57zla6mqkunpiajivf477kkoleq\\",\\"log\\":{\\"cid\\":\\"bagmqcgza2g5np2s2ffmppacclx3gwmrjeumoi5c44l6lt64ekctavu5f356a\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a0185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960a0000000000000000000000000bc89f39d47bf0f67ca1e0c7abbe3236f454f748aa0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4\\"}}"} 4 +21 0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed 514 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 MemberStatusUpdated {"entity":"0x165892f97103f95276884abea5e604985437687a8e5b35ac4428098f69c66a9f","isMember":true} {"topics":["0x88e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2","0x165892f97103f95276884abea5e604985437687a8e5b35ac4428098f69c66a9f"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","tx":{"cid":"bagjqcgzard4ovbngn6f46s7hqbcjmymigu2pclf3kttjywdwc62mfdi24dwq","txHash":"0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed","index":193,"src":"0x19c49117a8167296cAF5D23Ab48e355ec1c8bE8B","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"MemberStatusUpdated(string,bool)"} {"data":"{\\"blockHash\\":\\"0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840\\",\\"receiptCID\\":\\"bagkacgza756voltxaaftxraxkdjhuh6jh57zla6mqkunpiajivf477kkoleq\\",\\"log\\":{\\"cid\\":\\"bagmqcgzanwfms4swgcarbwfosr7uhmyxsefofusyj6m2oyoxy54zldewkeda\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a088e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2a0165892f97103f95276884abea5e604985437687a8e5b35ac4428098f69c66a9fa00000000000000000000000000000000000000000000000000000000000000001\\"}}"} 4 +22 0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed 515 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 DelegationTriggered {"principal":"0xDdb18b319BE3530560eECFF962032dFAD88212d4","agent":"0xBc89f39d47BF0f67CA1e0C7aBBE3236F454f748a"} {"topics":["0x185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960","0x000000000000000000000000bc89f39d47bf0f67ca1e0c7abbe3236f454f748a"],"data":"0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4","tx":{"cid":"bagjqcgzard4ovbngn6f46s7hqbcjmymigu2pclf3kttjywdwc62mfdi24dwq","txHash":"0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed","index":193,"src":"0x19c49117a8167296cAF5D23Ab48e355ec1c8bE8B","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"DelegationTriggered(address,address)"} {"data":"{\\"blockHash\\":\\"0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840\\",\\"receiptCID\\":\\"bagkacgza756voltxaaftxraxkdjhuh6jh57zla6mqkunpiajivf477kkoleq\\",\\"log\\":{\\"cid\\":\\"bagmqcgza2g5np2s2ffmppacclx3gwmrjeumoi5c44l6lt64ekctavu5f356a\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a0185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960a0000000000000000000000000bc89f39d47bf0f67ca1e0c7abbe3236f454f748aa0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4\\"}}"} 4 +23 0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed 516 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 MemberStatusUpdated {"entity":"0x4e47d3592c7c70485bf59f3aae389fbc82455da11000f53ac0665c5e343c8e14","isMember":true} {"topics":["0x88e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2","0x4e47d3592c7c70485bf59f3aae389fbc82455da11000f53ac0665c5e343c8e14"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","tx":{"cid":"bagjqcgzard4ovbngn6f46s7hqbcjmymigu2pclf3kttjywdwc62mfdi24dwq","txHash":"0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed","index":193,"src":"0x19c49117a8167296cAF5D23Ab48e355ec1c8bE8B","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"MemberStatusUpdated(string,bool)"} {"data":"{\\"blockHash\\":\\"0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840\\",\\"receiptCID\\":\\"bagkacgza756voltxaaftxraxkdjhuh6jh57zla6mqkunpiajivf477kkoleq\\",\\"log\\":{\\"cid\\":\\"bagmqcgza5yzqveeeqvq4wabjxyulanz6ynqe2vhjhwplkff4xjlwkjve3cta\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a088e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2a04e47d3592c7c70485bf59f3aae389fbc82455da11000f53ac0665c5e343c8e14a00000000000000000000000000000000000000000000000000000000000000001\\"}}"} 4 +24 0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed 517 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 DelegationTriggered {"principal":"0xDdb18b319BE3530560eECFF962032dFAD88212d4","agent":"0xBc89f39d47BF0f67CA1e0C7aBBE3236F454f748a"} {"topics":["0x185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960","0x000000000000000000000000bc89f39d47bf0f67ca1e0c7abbe3236f454f748a"],"data":"0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4","tx":{"cid":"bagjqcgzard4ovbngn6f46s7hqbcjmymigu2pclf3kttjywdwc62mfdi24dwq","txHash":"0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed","index":193,"src":"0x19c49117a8167296cAF5D23Ab48e355ec1c8bE8B","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"DelegationTriggered(address,address)"} {"data":"{\\"blockHash\\":\\"0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840\\",\\"receiptCID\\":\\"bagkacgza756voltxaaftxraxkdjhuh6jh57zla6mqkunpiajivf477kkoleq\\",\\"log\\":{\\"cid\\":\\"bagmqcgza2g5np2s2ffmppacclx3gwmrjeumoi5c44l6lt64ekctavu5f356a\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a0185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960a0000000000000000000000000bc89f39d47bf0f67ca1e0c7abbe3236f454f748aa0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4\\"}}"} 4 +25 0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed 518 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 MemberStatusUpdated {"entity":"0x16a1ef186d11b33d747c8c44fc8bf3445db567cd5ab29d9e2c1c81781a51647a","isMember":true} {"topics":["0x88e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2","0x16a1ef186d11b33d747c8c44fc8bf3445db567cd5ab29d9e2c1c81781a51647a"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","tx":{"cid":"bagjqcgzard4ovbngn6f46s7hqbcjmymigu2pclf3kttjywdwc62mfdi24dwq","txHash":"0x88f8ea85a66f8bcf4be780449661883534f12cbb54e69c587617b4c28d1ae0ed","index":193,"src":"0x19c49117a8167296cAF5D23Ab48e355ec1c8bE8B","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"MemberStatusUpdated(string,bool)"} {"data":"{\\"blockHash\\":\\"0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840\\",\\"receiptCID\\":\\"bagkacgza756voltxaaftxraxkdjhuh6jh57zla6mqkunpiajivf477kkoleq\\",\\"log\\":{\\"cid\\":\\"bagmqcgzagwxahowqxuwrld5k2yr5vzhkoelh7hu46dpvctllikaodxbn5yyq\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a088e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2a016a1ef186d11b33d747c8c44fc8bf3445db567cd5ab29d9e2c1c81781a51647aa00000000000000000000000000000000000000000000000000000000000000001\\"}}"} 4 +26 0x6e2401fdf1301a0700ab604be31485a5a2e76b1a781ec3a4eff1e8100db80719 118 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 DelegationTriggered {"principal":"0xDdb18b319BE3530560eECFF962032dFAD88212d4","agent":"0x8C38B6212D6A78EB7a2DA7E204fBfe003903CF47"} {"topics":["0x185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960","0x0000000000000000000000008c38b6212d6a78eb7a2da7e204fbfe003903cf47"],"data":"0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4","tx":{"cid":"bagjqcgzanysad7prganaoaflmbf6gfefuwroo2y2papmhjhp6hubadnya4mq","txHash":"0x6e2401fdf1301a0700ab604be31485a5a2e76b1a781ec3a4eff1e8100db80719","index":56,"src":"0xE8D848debB3A3e12AA815b15900c8E020B863F31","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"DelegationTriggered(address,address)"} {"data":"{\\"blockHash\\":\\"0xafb470605fd86995175c2bb07ed62d9f78d1debff33ce2fc6f8d5f07a9ebeca2\\",\\"receiptCID\\":\\"bagkacgzaklu3ddgwwsmemfw5b2wgfs6c62euf233o3tslufku4u2v4bdt7za\\",\\"log\\":{\\"cid\\":\\"bagmqcgzaja54iaazd37cfk6pkqnkidfyguloff4er2e57oavnessaunweyma\\",\\"ipldBlock\\":\\"0xf87f30b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a0185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960a00000000000000000000000008c38b6212d6a78eb7a2da7e204fbfe003903cf47a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4\\"}}"} 5 +27 0x6e2401fdf1301a0700ab604be31485a5a2e76b1a781ec3a4eff1e8100db80719 119 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 MemberStatusUpdated {"entity":"0x1c27f716f8d8b62fd373e4f08eb48277c22fbb3b3d146ba67313ab3b6d046fd0","isMember":true} {"topics":["0x88e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2","0x1c27f716f8d8b62fd373e4f08eb48277c22fbb3b3d146ba67313ab3b6d046fd0"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","tx":{"cid":"bagjqcgzanysad7prganaoaflmbf6gfefuwroo2y2papmhjhp6hubadnya4mq","txHash":"0x6e2401fdf1301a0700ab604be31485a5a2e76b1a781ec3a4eff1e8100db80719","index":56,"src":"0xE8D848debB3A3e12AA815b15900c8E020B863F31","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"MemberStatusUpdated(string,bool)"} {"data":"{\\"blockHash\\":\\"0xafb470605fd86995175c2bb07ed62d9f78d1debff33ce2fc6f8d5f07a9ebeca2\\",\\"receiptCID\\":\\"bagkacgzaklu3ddgwwsmemfw5b2wgfs6c62euf233o3tslufku4u2v4bdt7za\\",\\"log\\":{\\"cid\\":\\"bagmqcgzagx4cimqpipdrqbxwlw44tfvzedutvmqk4euok6d4n3ge77r2xloq\\",\\"ipldBlock\\":\\"0xf87f31b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a088e1b1a43f3edcb9afe941dfea296f5bc32fab715b5fc9aa101ec26d87d2e8a2a01c27f716f8d8b62fd373e4f08eb48277c22fbb3b3d146ba67313ab3b6d046fd0a00000000000000000000000000000000000000000000000000000000000000001\\"}}"} 5 +28 0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3 225 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 DelegationTriggered {"principal":"0xDdb18b319BE3530560eECFF962032dFAD88212d4","agent":"0xDdb18b319BE3530560eECFF962032dFAD88212d4"} {"topics":["0x185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960","0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4"],"data":"0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4","tx":{"cid":"bagjqcgzam2xbu7uh235yw6i73gfhwxyac2jge37oze7xmb7jix6yiugi7hrq","txHash":"0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3","index":438,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"DelegationTriggered(address,address)"} {"data":"{\\"blockHash\\":\\"0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9\\",\\"receiptCID\\":\\"bagkacgzaickyui2bivfkwglvhlgs3dzbgzllvitvssccwsyg6evimm4hfaga\\",\\"log\\":{\\"cid\\":\\"bagmqcgzaz22koutltuxcphbuc72dcdt6xuqr2e3mk4w75xksg2zzqaynbmoa\\",\\"ipldBlock\\":\\"0xf87f30b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a0185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4\\"}}"} 6 +29 0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3 226 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 PhisherStatusUpdated {"entity":"0xd03b69864961ea513339c2896c365ffde0e6620a1ab832d93c6656f8ce6f988e","isPhisher":true} {"topics":["0x9d3712f4978fc20b17a1dfbcd563f9aded75d05b6019427a9eca23245220138b","0xd03b69864961ea513339c2896c365ffde0e6620a1ab832d93c6656f8ce6f988e"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","tx":{"cid":"bagjqcgzam2xbu7uh235yw6i73gfhwxyac2jge37oze7xmb7jix6yiugi7hrq","txHash":"0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3","index":438,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"PhisherStatusUpdated(string,bool)"} {"data":"{\\"blockHash\\":\\"0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9\\",\\"receiptCID\\":\\"bagkacgzaickyui2bivfkwglvhlgs3dzbgzllvitvssccwsyg6evimm4hfaga\\",\\"log\\":{\\"cid\\":\\"bagmqcgza2uylmeipltns5rcegmzev2dtcpm3yf7exr7azelvmmc45p7en3na\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a09d3712f4978fc20b17a1dfbcd563f9aded75d05b6019427a9eca23245220138ba0d03b69864961ea513339c2896c365ffde0e6620a1ab832d93c6656f8ce6f988ea00000000000000000000000000000000000000000000000000000000000000001\\"}}"} 6 +30 0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3 227 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 DelegationTriggered {"principal":"0xDdb18b319BE3530560eECFF962032dFAD88212d4","agent":"0xDdb18b319BE3530560eECFF962032dFAD88212d4"} {"topics":["0x185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960","0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4"],"data":"0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4","tx":{"cid":"bagjqcgzam2xbu7uh235yw6i73gfhwxyac2jge37oze7xmb7jix6yiugi7hrq","txHash":"0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3","index":438,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"DelegationTriggered(address,address)"} {"data":"{\\"blockHash\\":\\"0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9\\",\\"receiptCID\\":\\"bagkacgzaickyui2bivfkwglvhlgs3dzbgzllvitvssccwsyg6evimm4hfaga\\",\\"log\\":{\\"cid\\":\\"bagmqcgzanj72wfbfvqby3dvz3jnh5nwstmvl3nlm6kxrkgfio7z643s2qesq\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a0185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4\\"}}"} 6 +31 0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3 228 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 PhisherStatusUpdated {"entity":"0xb3beb6867a4bef1f11b65e036b831cd3b81e74898005c13110e0539fc74e8183","isPhisher":true} {"topics":["0x9d3712f4978fc20b17a1dfbcd563f9aded75d05b6019427a9eca23245220138b","0xb3beb6867a4bef1f11b65e036b831cd3b81e74898005c13110e0539fc74e8183"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","tx":{"cid":"bagjqcgzam2xbu7uh235yw6i73gfhwxyac2jge37oze7xmb7jix6yiugi7hrq","txHash":"0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3","index":438,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"PhisherStatusUpdated(string,bool)"} {"data":"{\\"blockHash\\":\\"0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9\\",\\"receiptCID\\":\\"bagkacgzaickyui2bivfkwglvhlgs3dzbgzllvitvssccwsyg6evimm4hfaga\\",\\"log\\":{\\"cid\\":\\"bagmqcgza23km44tuxt7uhtvhagfn4imaoctdxsvobpdgqtjpunsd7gk3owwq\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a09d3712f4978fc20b17a1dfbcd563f9aded75d05b6019427a9eca23245220138ba0b3beb6867a4bef1f11b65e036b831cd3b81e74898005c13110e0539fc74e8183a00000000000000000000000000000000000000000000000000000000000000001\\"}}"} 6 +32 0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3 229 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 DelegationTriggered {"principal":"0xDdb18b319BE3530560eECFF962032dFAD88212d4","agent":"0xDdb18b319BE3530560eECFF962032dFAD88212d4"} {"topics":["0x185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960","0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4"],"data":"0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4","tx":{"cid":"bagjqcgzam2xbu7uh235yw6i73gfhwxyac2jge37oze7xmb7jix6yiugi7hrq","txHash":"0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3","index":438,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"DelegationTriggered(address,address)"} {"data":"{\\"blockHash\\":\\"0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9\\",\\"receiptCID\\":\\"bagkacgzaickyui2bivfkwglvhlgs3dzbgzllvitvssccwsyg6evimm4hfaga\\",\\"log\\":{\\"cid\\":\\"bagmqcgzanj72wfbfvqby3dvz3jnh5nwstmvl3nlm6kxrkgfio7z643s2qesq\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a0185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4\\"}}"} 6 +33 0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3 230 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 PhisherStatusUpdated {"entity":"0xed6ad0a79ec0ad3e559cf0f958d9e28c6e6bf6be025a8249a975c9a8e2180acf","isPhisher":true} {"topics":["0x9d3712f4978fc20b17a1dfbcd563f9aded75d05b6019427a9eca23245220138b","0xed6ad0a79ec0ad3e559cf0f958d9e28c6e6bf6be025a8249a975c9a8e2180acf"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","tx":{"cid":"bagjqcgzam2xbu7uh235yw6i73gfhwxyac2jge37oze7xmb7jix6yiugi7hrq","txHash":"0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3","index":438,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"PhisherStatusUpdated(string,bool)"} {"data":"{\\"blockHash\\":\\"0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9\\",\\"receiptCID\\":\\"bagkacgzaickyui2bivfkwglvhlgs3dzbgzllvitvssccwsyg6evimm4hfaga\\",\\"log\\":{\\"cid\\":\\"bagmqcgzatns5jnxezocu52ibouvcladwphpkervyibz35llxy4kxra5kqrxq\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a09d3712f4978fc20b17a1dfbcd563f9aded75d05b6019427a9eca23245220138ba0ed6ad0a79ec0ad3e559cf0f958d9e28c6e6bf6be025a8249a975c9a8e2180acfa00000000000000000000000000000000000000000000000000000000000000001\\"}}"} 6 +34 0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3 231 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 DelegationTriggered {"principal":"0xDdb18b319BE3530560eECFF962032dFAD88212d4","agent":"0xDdb18b319BE3530560eECFF962032dFAD88212d4"} {"topics":["0x185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960","0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4"],"data":"0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4","tx":{"cid":"bagjqcgzam2xbu7uh235yw6i73gfhwxyac2jge37oze7xmb7jix6yiugi7hrq","txHash":"0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3","index":438,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"DelegationTriggered(address,address)"} {"data":"{\\"blockHash\\":\\"0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9\\",\\"receiptCID\\":\\"bagkacgzaickyui2bivfkwglvhlgs3dzbgzllvitvssccwsyg6evimm4hfaga\\",\\"log\\":{\\"cid\\":\\"bagmqcgzanj72wfbfvqby3dvz3jnh5nwstmvl3nlm6kxrkgfio7z643s2qesq\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a0185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4\\"}}"} 6 +35 0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3 232 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 PhisherStatusUpdated {"entity":"0x8f9e6c0c3630ec9bccfb22c903753257d2352a9800255daafcf1665ed3d4be45","isPhisher":true} {"topics":["0x9d3712f4978fc20b17a1dfbcd563f9aded75d05b6019427a9eca23245220138b","0x8f9e6c0c3630ec9bccfb22c903753257d2352a9800255daafcf1665ed3d4be45"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","tx":{"cid":"bagjqcgzam2xbu7uh235yw6i73gfhwxyac2jge37oze7xmb7jix6yiugi7hrq","txHash":"0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3","index":438,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"PhisherStatusUpdated(string,bool)"} {"data":"{\\"blockHash\\":\\"0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9\\",\\"receiptCID\\":\\"bagkacgzaickyui2bivfkwglvhlgs3dzbgzllvitvssccwsyg6evimm4hfaga\\",\\"log\\":{\\"cid\\":\\"bagmqcgzaeb4dn6y2qmnizhopkyr7poewd66gm2brx76cskal6kv5pn55hukq\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a09d3712f4978fc20b17a1dfbcd563f9aded75d05b6019427a9eca23245220138ba08f9e6c0c3630ec9bccfb22c903753257d2352a9800255daafcf1665ed3d4be45a00000000000000000000000000000000000000000000000000000000000000001\\"}}"} 6 +36 0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3 233 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 DelegationTriggered {"principal":"0xDdb18b319BE3530560eECFF962032dFAD88212d4","agent":"0xDdb18b319BE3530560eECFF962032dFAD88212d4"} {"topics":["0x185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960","0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4"],"data":"0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4","tx":{"cid":"bagjqcgzam2xbu7uh235yw6i73gfhwxyac2jge37oze7xmb7jix6yiugi7hrq","txHash":"0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3","index":438,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"DelegationTriggered(address,address)"} {"data":"{\\"blockHash\\":\\"0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9\\",\\"receiptCID\\":\\"bagkacgzaickyui2bivfkwglvhlgs3dzbgzllvitvssccwsyg6evimm4hfaga\\",\\"log\\":{\\"cid\\":\\"bagmqcgzanj72wfbfvqby3dvz3jnh5nwstmvl3nlm6kxrkgfio7z643s2qesq\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a0185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4\\"}}"} 6 +37 0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3 234 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 PhisherStatusUpdated {"entity":"0x895499123a28e797f284b94560fcc346a421533cb3ed9d4373293d533849e523","isPhisher":true} {"topics":["0x9d3712f4978fc20b17a1dfbcd563f9aded75d05b6019427a9eca23245220138b","0x895499123a28e797f284b94560fcc346a421533cb3ed9d4373293d533849e523"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","tx":{"cid":"bagjqcgzam2xbu7uh235yw6i73gfhwxyac2jge37oze7xmb7jix6yiugi7hrq","txHash":"0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3","index":438,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"PhisherStatusUpdated(string,bool)"} {"data":"{\\"blockHash\\":\\"0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9\\",\\"receiptCID\\":\\"bagkacgzaickyui2bivfkwglvhlgs3dzbgzllvitvssccwsyg6evimm4hfaga\\",\\"log\\":{\\"cid\\":\\"bagmqcgzapdolzcaiqir2ankq2of4kdts5spg7ov5ofkgqora47u6kmpijwza\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a09d3712f4978fc20b17a1dfbcd563f9aded75d05b6019427a9eca23245220138ba0895499123a28e797f284b94560fcc346a421533cb3ed9d4373293d533849e523a00000000000000000000000000000000000000000000000000000000000000001\\"}}"} 6 +38 0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3 235 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 DelegationTriggered {"principal":"0xDdb18b319BE3530560eECFF962032dFAD88212d4","agent":"0xDdb18b319BE3530560eECFF962032dFAD88212d4"} {"topics":["0x185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960","0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4"],"data":"0x000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4","tx":{"cid":"bagjqcgzam2xbu7uh235yw6i73gfhwxyac2jge37oze7xmb7jix6yiugi7hrq","txHash":"0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3","index":438,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"DelegationTriggered(address,address)"} {"data":"{\\"blockHash\\":\\"0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9\\",\\"receiptCID\\":\\"bagkacgzaickyui2bivfkwglvhlgs3dzbgzllvitvssccwsyg6evimm4hfaga\\",\\"log\\":{\\"cid\\":\\"bagmqcgzanj72wfbfvqby3dvz3jnh5nwstmvl3nlm6kxrkgfio7z643s2qesq\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a0185d11175440fcb6458fbc1889b02953452539ed80ad1da781a5449500f6d960a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4a0000000000000000000000000ddb18b319be3530560eecff962032dfad88212d4\\"}}"} 6 +39 0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3 236 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 PhisherStatusUpdated {"entity":"0x6d99b9b8f38c764f028cc564a69e4aa3c0d94fd4df0a9b0aab23cec3cfa03426","isPhisher":true} {"topics":["0x9d3712f4978fc20b17a1dfbcd563f9aded75d05b6019427a9eca23245220138b","0x6d99b9b8f38c764f028cc564a69e4aa3c0d94fd4df0a9b0aab23cec3cfa03426"],"data":"0x0000000000000000000000000000000000000000000000000000000000000001","tx":{"cid":"bagjqcgzam2xbu7uh235yw6i73gfhwxyac2jge37oze7xmb7jix6yiugi7hrq","txHash":"0x66ae1a7e87d6fb8b791fd98a7b5f001692626feec93f7607e945fd8450c8f9e3","index":438,"src":"0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825","dst":"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8","__typename":"EthTransactionCid"},"eventSignature":"PhisherStatusUpdated(string,bool)"} {"data":"{\\"blockHash\\":\\"0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9\\",\\"receiptCID\\":\\"bagkacgzaickyui2bivfkwglvhlgs3dzbgzllvitvssccwsyg6evimm4hfaga\\",\\"log\\":{\\"cid\\":\\"bagmqcgzak4f2sns3dh6lmajwdimphm2h6rj4lqobhu2hrjndtzrkabhywuha\\",\\"ipldBlock\\":\\"0xf87f20b87cf87a94b06e6db9288324738f04fcaac910f5a60102c1f8f842a09d3712f4978fc20b17a1dfbcd563f9aded75d05b6019427a9eca23245220138ba06d99b9b8f38c764f028cc564a69e4aa3c0d94fd4df0a9b0aab23cec3cfa03426a00000000000000000000000000000000000000000000000000000000000000001\\"}}"} 6 +\. + + +-- +-- Data for Name: ipld_block; Type: TABLE DATA; Schema: public; Owner: vdbm +-- + +COPY public.ipld_block (id, contract_address, cid, kind, data, block_id) FROM stdin; +1 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 bafyreigxcduvu2npfat2zunf2su63vmksekmqw6hlq7ijz7kfwvsbjolwe init \\xa2646d657461a4626964782a307842303645364442393238383332343733386630346643414163393130663541363031303243314638646b696e6464696e697466706172656e74a1612ff668657468426c6f636ba263636964a1612f783d626167696163677a61686b366171626270373568667432787674716e6a3432357161786a377a6534667370796b63733734356379786733346262336261636e756d1a00e2e4d1657374617465a0 1 +2 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 bafyreihshcncfaozkbpybok4scslmi4ogkdsmoo5guctkl3ov5ij4e7ena diff_staged \\xa2646d657461a4626964782a307842303645364442393238383332343733386630346643414163393130663541363031303243314638646b696e646b646966665f73746167656466706172656e74a1612f783b6261667972656967786364757675326e70666174327a756e663273753633766d6b73656b6d717736686c7137696a7a376b66777673626a6f6c776568657468426c6f636ba263636964a1612f783d626167696163677a61666466726e7a32617a766f783332646a7833726a6b377475696a347135686c786a7a78686461636b6d366a747937746371613461636e756d1a00e2fa61657374617465a16869734d656d626572a46c5457543a6b756d617669735f64747275656c5457543a6d6574616d61736b64747275656c5457543a74617976616e6f5f64747275656d5457543a64616e66696e6c61796474727565 2 +3 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 bafyreidnohfh3z2rgge2z6amrdn33ce66gdusrcwar2kfoig5ijozqo6he diff_staged \\xa2646d657461a4626964782a307842303645364442393238383332343733386630346643414163393130663541363031303243314638646b696e646b646966665f73746167656466706172656e74a1612f783b6261667972656967786364757675326e70666174327a756e663273753633766d6b73656b6d717736686c7137696a7a376b66777673626a6f6c776568657468426c6f636ba263636964a1612f783d626167696163677a616e36727078656534746d34676d7a6763657233797834656e70766f6474707a6e327432626a6a373263626c6b68726e6735627861636e756d1a00e2fef5657374617465a16869734d656d626572a26c5457543a72656b6d61726b736474727565715457543a6f6d6e61746f73686e6977616c6474727565 3 +4 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 bafyreidhsglp25dozbewxekeb5hueh5q4tu5kupwbn6q7tejtpmnk66qsu diff_staged \\xa2646d657461a4626964782a307842303645364442393238383332343733386630346643414163393130663541363031303243314638646b696e646b646966665f73746167656466706172656e74a1612f783b6261667972656967786364757675326e70666174327a756e663273753633766d6b73656b6d717736686c7137696a7a376b66777673626a6f6c776568657468426c6f636ba263636964a1612f783d626167696163677a616272636d6b6c736435633365677132686c72797067376f706167747675797371616635723271376e75653273746f7a6978626161636e756d1a00e32009657374617465a16869734d656d626572a66d5457543a61666475646c65793064747275656d5457543a666f616d737061636564747275656d5457543a66726f74686369747964747275656f5457543a76756c63616e697a65696f6474727565715457543a6d696b6567757368616e736b796474727565725457543a6c61636f6e69636e6574776f726b6474727565 4 +5 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 bafyreifocrnaxaj4qod3atzj4ipq3ocjztlydl3gcgmxiilbi4dbd2o2be diff_staged \\xa2646d657461a4626964782a307842303645364442393238383332343733386630346643414163393130663541363031303243314638646b696e646b646966665f73746167656466706172656e74a1612f783b6261667972656967786364757675326e70666174327a756e663273753633766d6b73656b6d717736686c7137696a7a376b66777673626a6f6c776568657468426c6f636ba263636964a1612f783d626167696163677a6176363268617963373362757a6b663234666f79683576726e7435346e64787637366d366f6637647072767071706b706c35737261636e756d1a00e3237b657374617465a16869734d656d626572a1735457543a64656e6e69736f6e6265727472616d6474727565 5 +6 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 bafyreicls2qpsocxj6yqwb2ujvrchi7zxeynh5qpevfy6o4un4qapwuwdy diff_staged \\xa2646d657461a4626964782a307842303645364442393238383332343733386630346643414163393130663541363031303243314638646b696e646b646966665f73746167656466706172656e74a1612f783b6261667972656967786364757675326e70666174327a756e663273753633766d6b73656b6d717736686c7137696a7a376b66777673626a6f6c776568657468426c6f636ba263636964a1612f783d626167696163677a616434707a33783275677870706b6475776d7672326e6378346761767232713572356c696d63777233676f6c326337636666323471636e756d1a00e87492657374617465a169697350686973686572a66e5457543a6a67686f7374323031306474727565715457543a6a6164656e37323434303030316474727565735457543a6261647361736b39323539333438396474727565735457543a6361737369647930363131343136356474727565735457543a65737472656c6c33313136333633316474727565735457543a6b696e6762656e37313335333833376474727565 6 +\. + + +-- +-- Data for Name: ipld_status; Type: TABLE DATA; Schema: public; Owner: vdbm +-- + +COPY public.ipld_status (id, latest_hooks_block_number, latest_checkpoint_block_number, latest_ipfs_block_number) FROM stdin; +\. + + +-- +-- Data for Name: is_member; Type: TABLE DATA; Schema: public; Owner: vdbm +-- + +COPY public.is_member (id, block_hash, block_number, contract_address, key0, value, proof) FROM stdin; +1 0x28cb16e740cd5d7de869bee2957e7442790e9d774e6e71804a67933c7e628038 14875233 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 TWT:danfinlay t {"data":"{\\"blockHash\\":\\"0x28cb16e740cd5d7de869bee2957e7442790e9d774e6e71804a67933c7e628038\\",\\"account\\":{\\"address\\":\\"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8\\",\\"storage\\":{\\"cid\\":\\"bagmacgzajz2idgp3mppl3xecw2jiyrdtpqxdsks3l2vayyrhylj2ddrsvf2q\\",\\"ipldBlock\\":\\"0xe2a0203d41e15b233c6d8a6221399699ffc64b2cca7ada26b947d7642b930362ca2001\\"}}}"} +2 0x28cb16e740cd5d7de869bee2957e7442790e9d774e6e71804a67933c7e628038 14875233 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 TWT:metamask t {"data":"{\\"blockHash\\":\\"0x28cb16e740cd5d7de869bee2957e7442790e9d774e6e71804a67933c7e628038\\",\\"account\\":{\\"address\\":\\"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8\\",\\"storage\\":{\\"cid\\":\\"bagmacgzayklkqlq7oyerf7d46p2bnccsqgnj24z5ey5iwnn3nesl5b6t2bba\\",\\"ipldBlock\\":\\"0xe2a0208bb17e9a3a883c386024f8e1a6976a71526c4598fd5577bde1e8e78dc5cceb01\\"}}}"} +3 0x28cb16e740cd5d7de869bee2957e7442790e9d774e6e71804a67933c7e628038 14875233 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 TWT:kumavis_ t {"data":"{\\"blockHash\\":\\"0x28cb16e740cd5d7de869bee2957e7442790e9d774e6e71804a67933c7e628038\\",\\"account\\":{\\"address\\":\\"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8\\",\\"storage\\":{\\"cid\\":\\"bagmacgzac4qmw47e5joqwqb62grydulsl62z6auzi3bpimezqowvedyqfz4a\\",\\"ipldBlock\\":\\"0xe2a020c4db4f66db1cb7f05bfa6518607749beab650a765c80492a458fbef069d21d01\\"}}}"} +4 0x28cb16e740cd5d7de869bee2957e7442790e9d774e6e71804a67933c7e628038 14875233 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 TWT:tayvano_ t {"data":"{\\"blockHash\\":\\"0x28cb16e740cd5d7de869bee2957e7442790e9d774e6e71804a67933c7e628038\\",\\"account\\":{\\"address\\":\\"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8\\",\\"storage\\":{\\"cid\\":\\"bagmacgzau2pcjzqad7bvet5tqprkvo75uyfiuiewle3rzgka65xb4msinxxq\\",\\"ipldBlock\\":\\"0xe2a0325a534478c2e78913d54d916517598739b2920691f3cdaa47dd025f4718492401\\"}}}"} +5 0x6fa2fb909c9b386664c224778bf08d7d5c39bf2dd4f414a7fa1056a3c5a6e86e 14876405 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 TWT:rekmarks t {"data":"{\\"blockHash\\":\\"0x6fa2fb909c9b386664c224778bf08d7d5c39bf2dd4f414a7fa1056a3c5a6e86e\\",\\"account\\":{\\"address\\":\\"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8\\",\\"storage\\":{\\"cid\\":\\"bagmacgza6bl5chphg5sp2hbmakf3m3hf5i2aqpwniit7fquldl4cyz6rcjyq\\",\\"ipldBlock\\":\\"0xe2a0370e3dd0b59d081149bd02578f68bc8b82b38d83a65eab9c0039330f2f44b1be01\\"}}}"} +6 0x6fa2fb909c9b386664c224778bf08d7d5c39bf2dd4f414a7fa1056a3c5a6e86e 14876405 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 TWT:omnatoshniwal t {"data":"{\\"blockHash\\":\\"0x6fa2fb909c9b386664c224778bf08d7d5c39bf2dd4f414a7fa1056a3c5a6e86e\\",\\"account\\":{\\"address\\":\\"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8\\",\\"storage\\":{\\"cid\\":\\"bagmacgzaevw2g7ldqq7u2cifx625hj2mtgpthw2gxo55hi3kfhmirlco27kq\\",\\"ipldBlock\\":\\"0xe2a020099e064c465e189f524b4ea5e1e1f880cc2404d54a5c3820cae1426406e3eb01\\"}}}"} +7 0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840 14884873 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 TWT:afdudley0 t {"data":"{\\"blockHash\\":\\"0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840\\",\\"account\\":{\\"address\\":\\"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8\\",\\"storage\\":{\\"cid\\":\\"bagmacgza4yb2o77os2exgj7ao2gmcycrktszfccus2pgiqayoyesbyv36yuq\\",\\"ipldBlock\\":\\"0xe2a0206f8288d5713c0319b22d7d7871ea9f79da0e2a69c4810045f7f9d8b513c97701\\"}}}"} +8 0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840 14884873 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 TWT:vulcanizeio t {"data":"{\\"blockHash\\":\\"0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840\\",\\"account\\":{\\"address\\":\\"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8\\",\\"storage\\":{\\"cid\\":\\"bagmacgza43rlyrrrvwbxuo4jwrk2aibx2yau2jwubvtkmufdu62ndxti5pla\\",\\"ipldBlock\\":\\"0xe2a020a206b39b5245e291b83d5b8bcad50fdca5196cedf7e717b87ab79b8d983f0701\\"}}}"} +9 0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840 14884873 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 TWT:laconicnetwork t {"data":"{\\"blockHash\\":\\"0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840\\",\\"account\\":{\\"address\\":\\"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8\\",\\"storage\\":{\\"cid\\":\\"bagmacgzaqlzj74qpi46z4lepfew43klj5jmyoiuzlhma6o6jozkjybc2lsvq\\",\\"ipldBlock\\":\\"0xe2a020ecd3a96a9329551758da7fdf41b5816885e29b184c3939c13c6ea20206fd2901\\"}}}"} +10 0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840 14884873 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 TWT:mikegushansky t {"data":"{\\"blockHash\\":\\"0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840\\",\\"account\\":{\\"address\\":\\"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8\\",\\"storage\\":{\\"cid\\":\\"bagmacgzalgavzfjocdkshzxwlpqmf3azofoz67rvulr5xxuqsvmmuvadwzdq\\",\\"ipldBlock\\":\\"0xe2a0202951bc50ed50810c883cc3f755dabb64394375acece9ea4be99e5a584fe6c901\\"}}}"} +11 0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840 14884873 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 TWT:foamspace t {"data":"{\\"blockHash\\":\\"0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840\\",\\"account\\":{\\"address\\":\\"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8\\",\\"storage\\":{\\"cid\\":\\"bagmacgzasy7at57g5wewqtzjlkh6vudbs7wbwx5qw7637fwi5b3nunw54usq\\",\\"ipldBlock\\":\\"0xe2a02029d04f9e7b98346aa9c447decb17659db9af23890b9c70f579a029cdcf593c01\\"}}}"} +12 0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840 14884873 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 TWT:frothcity t {"data":"{\\"blockHash\\":\\"0x0c44c52e43e8b64343475c70f37dcf01a75a6250017b1d43eda13529bb28b840\\",\\"account\\":{\\"address\\":\\"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8\\",\\"storage\\":{\\"cid\\":\\"bagmacgzawvqcds52in2gemhyszayvrl5zfc66up6hcuchxmi3ce4kzi5pweq\\",\\"ipldBlock\\":\\"0xe2a02034ac30337c5c70d2540bb4434e35ce4532a4eab91c852dca23deaacb0e275201\\"}}}"} +13 0xafb470605fd86995175c2bb07ed62d9f78d1debff33ce2fc6f8d5f07a9ebeca2 14885755 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 TWT:dennisonbertram t {"data":"{\\"blockHash\\":\\"0xafb470605fd86995175c2bb07ed62d9f78d1debff33ce2fc6f8d5f07a9ebeca2\\",\\"account\\":{\\"address\\":\\"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8\\",\\"storage\\":{\\"cid\\":\\"bagmacgzaeogthongsys3jydz4jw2sj5t7mqeqbor2qnaium4c5h5v74fqbta\\",\\"ipldBlock\\":\\"0xe19f3fea74c522a79f7db606c382429e0cb363617f45d6fd59cc02a2857144f18801\\"}}}"} +\. + + +-- +-- Data for Name: is_phisher; Type: TABLE DATA; Schema: public; Owner: vdbm +-- + +COPY public.is_phisher (id, block_hash, block_number, contract_address, key0, value, proof) FROM stdin; +1 0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9 15234194 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 TWT:cassidy06114165 t {"data":"{\\"blockHash\\":\\"0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9\\",\\"account\\":{\\"address\\":\\"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8\\",\\"storage\\":{\\"cid\\":\\"bagmacgzadyh6cl32cgz3rnd65247arv3fnjw7p6uqfcfysof4dksd2illf6q\\",\\"ipldBlock\\":\\"0xe2a0203c2016b922ff7b5efb562ade4ce1790eac49e191d0d6230b261475b1c2eb9b01\\"}}}"} +2 0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9 15234194 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 TWT:badsask92593489 t {"data":"{\\"blockHash\\":\\"0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9\\",\\"account\\":{\\"address\\":\\"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8\\",\\"storage\\":{\\"cid\\":\\"bagmacgzaqrrqdxcwdv654m3vpbiafzvjrhrvs7wv5wncbncb665dprx4cnzq\\",\\"ipldBlock\\":\\"0xe2a0204243b96ea0ada3c3ca9668be1e1ab841ee01999a18d1ebebae8ba2d24aa53101\\"}}}"} +3 0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9 15234194 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 TWT:estrell31163631 t {"data":"{\\"blockHash\\":\\"0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9\\",\\"account\\":{\\"address\\":\\"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8\\",\\"storage\\":{\\"cid\\":\\"bagmacgzaq25w3xcn7ahsaclw7lvbhv6wmuft6fwll6gs26pfure52vak2oea\\",\\"ipldBlock\\":\\"0xe2a020e7f0d045adaf03aaca32f26b20a70af72062abbdca72eca237efe7fe297a6a01\\"}}}"} +4 0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9 15234194 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 TWT:kingben71353837 t {"data":"{\\"blockHash\\":\\"0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9\\",\\"account\\":{\\"address\\":\\"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8\\",\\"storage\\":{\\"cid\\":\\"bagmacgzal4unm5r3ut4fsolqkibsowhada5aixdmjfaubaxamlrxes2t3eza\\",\\"ipldBlock\\":\\"0xe2a0347aeddef1702483d61eca78b85ff35caff4917a18acef04923858e206c58da401\\"}}}"} +5 0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9 15234194 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 TWT:jaden72440001 t {"data":"{\\"blockHash\\":\\"0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9\\",\\"account\\":{\\"address\\":\\"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8\\",\\"storage\\":{\\"cid\\":\\"bagmacgzadfup5fbucciy32alz4upntikcijqiqvwcjszkmuuugna26raioca\\",\\"ipldBlock\\":\\"0xe2a03c76ec48ccf04032d7c8463b37c68e68de9a2602967327c3c70f1a15a11f117b01\\"}}}"} +6 0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9 15234194 0xB06E6DB9288324738f04fCAAc910f5A60102C1F8 TWT:jghost2010 t {"data":"{\\"blockHash\\":\\"0x1f1f9ddf5435def50e966563a68afc302b1d43b1ead0c15a3b3397a17c452eb9\\",\\"account\\":{\\"address\\":\\"0xB06E6DB9288324738f04fCAAc910f5A60102C1F8\\",\\"storage\\":{\\"cid\\":\\"bagmacgzab5h56mqwe45hy3labtlq5tp7hsquoimrfgx3c2eycghukydumcoq\\",\\"ipldBlock\\":\\"0xe2a03da5b9c90f8be3d46373dc4c983ff2427d64c22470e858e62e5b25dd53ff8c7e01\\"}}}"} +\. + + +-- +-- Data for Name: is_revoked; Type: TABLE DATA; Schema: public; Owner: vdbm +-- + +COPY public.is_revoked (id, block_hash, block_number, contract_address, key0, value, proof) FROM stdin; +\. + + +-- +-- Data for Name: multi_nonce; Type: TABLE DATA; Schema: public; Owner: vdbm +-- + +COPY public.multi_nonce (id, block_hash, block_number, contract_address, key0, key1, value, proof) FROM stdin; +\. + + +-- +-- Data for Name: sync_status; Type: TABLE DATA; Schema: public; Owner: vdbm +-- + +COPY public.sync_status (id, chain_head_block_hash, chain_head_block_number, latest_indexed_block_hash, latest_indexed_block_number, latest_canonical_block_hash, latest_canonical_block_number, initial_indexed_block_hash, initial_indexed_block_number) FROM stdin; +\. + + +-- +-- Name: _owner_id_seq; Type: SEQUENCE SET; Schema: public; Owner: vdbm +-- + +SELECT pg_catalog.setval('public._owner_id_seq', 1, false); + + +-- +-- Name: block_progress_id_seq; Type: SEQUENCE SET; Schema: public; Owner: vdbm +-- + +SELECT pg_catalog.setval('public.block_progress_id_seq', 6, true); + + +-- +-- Name: contract_id_seq; Type: SEQUENCE SET; Schema: public; Owner: vdbm +-- + +SELECT pg_catalog.setval('public.contract_id_seq', 1, true); + + +-- +-- Name: domain_hash_id_seq; Type: SEQUENCE SET; Schema: public; Owner: vdbm +-- + +SELECT pg_catalog.setval('public.domain_hash_id_seq', 1, false); + + +-- +-- Name: event_id_seq; Type: SEQUENCE SET; Schema: public; Owner: vdbm +-- + +SELECT pg_catalog.setval('public.event_id_seq', 39, true); + + +-- +-- Name: ipld_block_id_seq; Type: SEQUENCE SET; Schema: public; Owner: vdbm +-- + +SELECT pg_catalog.setval('public.ipld_block_id_seq', 6, true); + + +-- +-- Name: ipld_status_id_seq; Type: SEQUENCE SET; Schema: public; Owner: vdbm +-- + +SELECT pg_catalog.setval('public.ipld_status_id_seq', 1, false); + + +-- +-- Name: is_member_id_seq; Type: SEQUENCE SET; Schema: public; Owner: vdbm +-- + +SELECT pg_catalog.setval('public.is_member_id_seq', 13, true); + + +-- +-- Name: is_phisher_id_seq; Type: SEQUENCE SET; Schema: public; Owner: vdbm +-- + +SELECT pg_catalog.setval('public.is_phisher_id_seq', 6, true); + + +-- +-- Name: is_revoked_id_seq; Type: SEQUENCE SET; Schema: public; Owner: vdbm +-- + +SELECT pg_catalog.setval('public.is_revoked_id_seq', 1, false); + + +-- +-- Name: multi_nonce_id_seq; Type: SEQUENCE SET; Schema: public; Owner: vdbm +-- + +SELECT pg_catalog.setval('public.multi_nonce_id_seq', 1, false); + + +-- +-- Name: sync_status_id_seq; Type: SEQUENCE SET; Schema: public; Owner: vdbm +-- + +SELECT pg_catalog.setval('public.sync_status_id_seq', 1, false); + + +-- +-- Name: contract PK_17c3a89f58a2997276084e706e8; Type: CONSTRAINT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.contract + ADD CONSTRAINT "PK_17c3a89f58a2997276084e706e8" PRIMARY KEY (id); + + +-- +-- Name: domain_hash PK_1b2fb63b534a5a1034c9de4af2d; Type: CONSTRAINT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.domain_hash + ADD CONSTRAINT "PK_1b2fb63b534a5a1034c9de4af2d" PRIMARY KEY (id); + + +-- +-- Name: event PK_30c2f3bbaf6d34a55f8ae6e4614; Type: CONSTRAINT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.event + ADD CONSTRAINT "PK_30c2f3bbaf6d34a55f8ae6e4614" PRIMARY KEY (id); + + +-- +-- Name: multi_nonce PK_31dab24db96d04fbf687ae28b00; Type: CONSTRAINT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.multi_nonce + ADD CONSTRAINT "PK_31dab24db96d04fbf687ae28b00" PRIMARY KEY (id); + + +-- +-- Name: ipld_block PK_35d483f7d0917b68494f40066ac; Type: CONSTRAINT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.ipld_block + ADD CONSTRAINT "PK_35d483f7d0917b68494f40066ac" PRIMARY KEY (id); + + +-- +-- Name: _owner PK_3ecb7a5aa92511dde29aa90a070; Type: CONSTRAINT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public._owner + ADD CONSTRAINT "PK_3ecb7a5aa92511dde29aa90a070" PRIMARY KEY (id); + + +-- +-- Name: is_revoked PK_578b81f9905005c7113f7bed9a3; Type: CONSTRAINT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.is_revoked + ADD CONSTRAINT "PK_578b81f9905005c7113f7bed9a3" PRIMARY KEY (id); + + +-- +-- Name: is_phisher PK_753c1da426677f67c51cd98d35e; Type: CONSTRAINT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.is_phisher + ADD CONSTRAINT "PK_753c1da426677f67c51cd98d35e" PRIMARY KEY (id); + + +-- +-- Name: sync_status PK_86336482262ab8d5b548a4a71b7; Type: CONSTRAINT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.sync_status + ADD CONSTRAINT "PK_86336482262ab8d5b548a4a71b7" PRIMARY KEY (id); + + +-- +-- Name: is_member PK_ab8bdc3ccfa64e2876d744e2e36; Type: CONSTRAINT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.is_member + ADD CONSTRAINT "PK_ab8bdc3ccfa64e2876d744e2e36" PRIMARY KEY (id); + + +-- +-- Name: block_progress PK_c01eea7890543f34821c499e874; Type: CONSTRAINT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.block_progress + ADD CONSTRAINT "PK_c01eea7890543f34821c499e874" PRIMARY KEY (id); + + +-- +-- Name: ipld_status PK_fda882aed0a0c022b9f4fccdb1c; Type: CONSTRAINT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.ipld_status + ADD CONSTRAINT "PK_fda882aed0a0c022b9f4fccdb1c" PRIMARY KEY (id); + + +-- +-- Name: IDX_00a8ca7940094d8552d67c3b72; Type: INDEX; Schema: public; Owner: vdbm +-- + +CREATE UNIQUE INDEX "IDX_00a8ca7940094d8552d67c3b72" ON public.block_progress USING btree (block_hash); + + +-- +-- Name: IDX_15ddaa8b6552f12be383fcec4e; Type: INDEX; Schema: public; Owner: vdbm +-- + +CREATE UNIQUE INDEX "IDX_15ddaa8b6552f12be383fcec4e" ON public.is_revoked USING btree (block_hash, contract_address, key0); + + +-- +-- Name: IDX_3da3a5ba019cd88f366213e48f; Type: INDEX; Schema: public; Owner: vdbm +-- + +CREATE UNIQUE INDEX "IDX_3da3a5ba019cd88f366213e48f" ON public._owner USING btree (block_hash, contract_address); + + +-- +-- Name: IDX_4bbe5fb40812718baf74cc9a79; Type: INDEX; Schema: public; Owner: vdbm +-- + +CREATE UNIQUE INDEX "IDX_4bbe5fb40812718baf74cc9a79" ON public.contract USING btree (address); + + +-- +-- Name: IDX_4c753e21652bf260667b3c1fd7; Type: INDEX; Schema: public; Owner: vdbm +-- + +CREATE UNIQUE INDEX "IDX_4c753e21652bf260667b3c1fd7" ON public.multi_nonce USING btree (block_hash, contract_address, key0, key1); + + +-- +-- Name: IDX_53e551bea07ca0f43c6a7a4cbb; Type: INDEX; Schema: public; Owner: vdbm +-- + +CREATE INDEX "IDX_53e551bea07ca0f43c6a7a4cbb" ON public.block_progress USING btree (block_number); + + +-- +-- Name: IDX_560b81b666276c48e0b330c22c; Type: INDEX; Schema: public; Owner: vdbm +-- + +CREATE UNIQUE INDEX "IDX_560b81b666276c48e0b330c22c" ON public.domain_hash USING btree (block_hash, contract_address); + + +-- +-- Name: IDX_679fe4cab2565b7be29dcd60c7; Type: INDEX; Schema: public; Owner: vdbm +-- + +CREATE INDEX "IDX_679fe4cab2565b7be29dcd60c7" ON public.ipld_block USING btree (block_id, contract_address); + + +-- +-- Name: IDX_9b12e478c35b95a248a04a8fbb; Type: INDEX; Schema: public; Owner: vdbm +-- + +CREATE INDEX "IDX_9b12e478c35b95a248a04a8fbb" ON public.block_progress USING btree (parent_hash); + + +-- +-- Name: IDX_a6953a5fcd777425c6001c1898; Type: INDEX; Schema: public; Owner: vdbm +-- + +CREATE UNIQUE INDEX "IDX_a6953a5fcd777425c6001c1898" ON public.ipld_block USING btree (cid); + + +-- +-- Name: IDX_ad541e3a5a00acd4d422c16ada; Type: INDEX; Schema: public; Owner: vdbm +-- + +CREATE INDEX "IDX_ad541e3a5a00acd4d422c16ada" ON public.event USING btree (block_id, contract); + + +-- +-- Name: IDX_b776a4314e7a73aa666ab272d7; Type: INDEX; Schema: public; Owner: vdbm +-- + +CREATE UNIQUE INDEX "IDX_b776a4314e7a73aa666ab272d7" ON public.ipld_block USING btree (block_id, contract_address, kind); + + +-- +-- Name: IDX_c86bf8a9f1c566350c422b7d3a; Type: INDEX; Schema: public; Owner: vdbm +-- + +CREATE UNIQUE INDEX "IDX_c86bf8a9f1c566350c422b7d3a" ON public.is_member USING btree (block_hash, contract_address, key0); + + +-- +-- Name: IDX_d3855d762b0f9fcf9e8a707ef7; Type: INDEX; Schema: public; Owner: vdbm +-- + +CREATE INDEX "IDX_d3855d762b0f9fcf9e8a707ef7" ON public.event USING btree (block_id, contract, event_name); + + +-- +-- Name: IDX_d67dffa77e472e6163e619f423; Type: INDEX; Schema: public; Owner: vdbm +-- + +CREATE UNIQUE INDEX "IDX_d67dffa77e472e6163e619f423" ON public.is_phisher USING btree (block_hash, contract_address, key0); + + +-- +-- Name: event FK_2b0d35d675c4f99751855c45021; Type: FK CONSTRAINT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.event + ADD CONSTRAINT "FK_2b0d35d675c4f99751855c45021" FOREIGN KEY (block_id) REFERENCES public.block_progress(id) ON DELETE CASCADE; + + +-- +-- Name: ipld_block FK_6fe551100c8a6d305b9c22ac6f3; Type: FK CONSTRAINT; Schema: public; Owner: vdbm +-- + +ALTER TABLE ONLY public.ipld_block + ADD CONSTRAINT "FK_6fe551100c8a6d305b9c22ac6f3" FOREIGN KEY (block_id) REFERENCES public.block_progress(id) ON DELETE CASCADE; + + +-- +-- PostgreSQL database dump complete +-- + diff --git a/config/watcher-mobymask/mobymask-watcher.toml b/config/watcher-mobymask/mobymask-watcher.toml new file mode 100644 index 00000000..4dba25b9 --- /dev/null +++ b/config/watcher-mobymask/mobymask-watcher.toml @@ -0,0 +1,53 @@ +[server] + host = "0.0.0.0" + port = 3001 + kind = "active" + + # Checkpointing state. + checkpointing = true + + # Checkpoint interval in number of blocks. + checkpointInterval = 2000 + + # IPFS API address (can be taken from the output on running the IPFS daemon). + # ipfsApiAddr = "/ip4/127.0.0.1/tcp/5001" + + # Boolean to filter logs by contract. + filterLogs = true + + # Max block range for which to return events in eventsInRange GQL query. + # Use -1 for skipping check on block range. + maxEventsBlockRange = -1 + +[metrics] + host = "0.0.0.0" + port = 9000 + [metrics.gql] + port = 9001 + +[database] + type = "postgres" + host = "watcher-db" + port = 5432 + database = "mobymask-watcher" + username = "vdbm" + password = "password" + synchronize = true + logging = false + +[upstream] + [upstream.ethServer] + gqlApiEndpoint = "http://ipld-eth-server:8083/graphql" + rpcProviderEndpoint = "http://ipld-eth-server:8082" + blockDelayInMilliSecs = 60000 + + [upstream.cache] + name = "requests" + enabled = false + deleteOnStart = false + +[jobQueue] + dbConnectionString = "postgres://vdbm:password@watcher-db/mobymask-watcher-job-queue" + maxCompletionLagInSecs = 300 + jobDelayInMilliSecs = 100 + eventsInBatch = 50 diff --git a/pod-list.txt b/pod-list.txt index ccd67089..c0635c4e 100644 --- a/pod-list.txt +++ b/pod-list.txt @@ -10,4 +10,5 @@ prometheus-grafana laconicd fixturenet-laconicd fixturenet-eth +watcher-mobymask test diff --git a/stacks/mobymask/README.md b/stacks/mobymask/README.md index b3263d88..2276a9d6 100644 --- a/stacks/mobymask/README.md +++ b/stacks/mobymask/README.md @@ -19,5 +19,7 @@ $ laconic-sh build-containers --include cerc/watcher-mobymask ``` ## Deploy the stack ``` +$ laconic-so deploy-system --include watcher-mobymask up watcher-db +$ docker exec -i psql -U vdbm mobymask-watcher < config/watcher-mobymask/mobymask-watcher-db.sql $ laconic-sh deploy-system --include watcher-mobymask ``` \ No newline at end of file From 06bfbd56e4853e9765bbe8ae28a3c650029ffb6e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 7 Nov 2022 23:17:56 -0700 Subject: [PATCH 0108/1010] Use host gateway for services --- compose/docker-compose-watcher-mobymask.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/compose/docker-compose-watcher-mobymask.yml b/compose/docker-compose-watcher-mobymask.yml index c6967684..7314e637 100644 --- a/compose/docker-compose-watcher-mobymask.yml +++ b/compose/docker-compose-watcher-mobymask.yml @@ -36,6 +36,8 @@ services: ports: - "0.0.0.0:3001:3001" - "0.0.0.0:9001:9001" + extra_hosts: + - "ipld-eth-server:host-gateway" healthcheck: test: ["CMD", "nc", "-v", "localhost", "3001"] interval: 20s @@ -56,6 +58,8 @@ services: - ../config/watcher-mobymask/mobymask-watcher.toml:/app/packages/mobymask-watcher/environments/local.toml ports: - "0.0.0.0:9000:9000" + extra_hosts: + - "ipld-eth-server:host-gateway" volumes: indexer_db_data: From 8121fda0d55b0fcaa2cdeed20e876ceb08500efe Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 7 Nov 2022 23:31:34 -0700 Subject: [PATCH 0109/1010] Fix config file path --- compose/docker-compose-watcher-mobymask.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compose/docker-compose-watcher-mobymask.yml b/compose/docker-compose-watcher-mobymask.yml index 7314e637..6ce410cc 100644 --- a/compose/docker-compose-watcher-mobymask.yml +++ b/compose/docker-compose-watcher-mobymask.yml @@ -32,7 +32,7 @@ services: image: cerc/watcher-mobymask:local command: ["sh", "-c", "yarn server"] volumes: - - ../config/watcher-mobymask/mobymask-watcher.toml:/app/packages/mobymask-watcher/environments/local.toml + - ../config/watcher-mobymask/mobymask-watcher.toml:/app/watcher-ts/packages/mobymask-watcher/environments/local.toml ports: - "0.0.0.0:3001:3001" - "0.0.0.0:9001:9001" @@ -55,7 +55,7 @@ services: image: cerc/watcher-mobymask:local command: ["sh", "-c", "yarn job-runner"] volumes: - - ../config/watcher-mobymask/mobymask-watcher.toml:/app/packages/mobymask-watcher/environments/local.toml + - ../config/watcher-mobymask/mobymask-watcher.toml:/app/watcher-ts/packages/mobymask-watcher/environments/local.toml ports: - "0.0.0.0:9000:9000" extra_hosts: From 5728484fad423dea57814d6308ae0383cedda12d Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 8 Nov 2022 00:23:40 -0700 Subject: [PATCH 0110/1010] Update doc --- stacks/mobymask/README.md | 17 ++++++++++++++--- stacks/mobymask/stack.yml | 1 + 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/stacks/mobymask/README.md b/stacks/mobymask/README.md index 2276a9d6..40ef9545 100644 --- a/stacks/mobymask/README.md +++ b/stacks/mobymask/README.md @@ -1,12 +1,14 @@ # Mobymask -## Set up a Mobymask Watcher +## Deploy the Mobymask Watcher +The instructions below show how to deploy a mobymask watcher using laconic-stack-orchestrator (the installation of which is covered [here](https://github.com/cerc-io/stack-orchestrator#install)). +This deployment expects that ipld-eth-server's endpoints are available on the local machine at http://ipld-eth-server.example.com:8083/graphql and http://ipld-eth-server.example.com:8082. More advanced configurations are supported by modifying the watcher's [config file](../../config/watcher-mobymask/mobymask-watcher.toml). ## Clone required repositories ``` $ laconic-so setup-repositories ``` -Checkout required branches: +Checkout required branches for the current release: ``` $ cd ~/cerc/assemblyscript $ git checkout ng-integrate-asyncify @@ -17,9 +19,18 @@ $ git checkout v0.2.13 ``` $ laconic-sh build-containers --include cerc/watcher-mobymask ``` +This should create a container with tag `cerc/watcher-mobymask` in the local image registry. ## Deploy the stack +First the watcher database has to be initialized. Start only the watcher-db service: ``` $ laconic-so deploy-system --include watcher-mobymask up watcher-db +``` +Next find the container's id using `docker ps` then run the following command to initialize the database: +``` $ docker exec -i psql -U vdbm mobymask-watcher < config/watcher-mobymask/mobymask-watcher-db.sql +``` +Finally start the remaining containers: +``` $ laconic-sh deploy-system --include watcher-mobymask -``` \ No newline at end of file +``` +Correct operation should be verified by following the instructions [here](https://github.com/cerc-io/mobymask-watcher/tree/main/mainnet-watcher-only#run), checking GraphQL queries return valid results in the watcher's [playground](http://127.0.0.1:3001/graphql). \ No newline at end of file diff --git a/stacks/mobymask/stack.yml b/stacks/mobymask/stack.yml index c7b4eea6..8925cf28 100644 --- a/stacks/mobymask/stack.yml +++ b/stacks/mobymask/stack.yml @@ -1,3 +1,4 @@ +version: "1.0" name: mobymask-watcher repos: - cerc-io/watcher-ts/v0.2.13 From 72251f966f060c46cb5edf58c51f0127f4f2f4e4 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 8 Nov 2022 00:28:27 -0700 Subject: [PATCH 0111/1010] fix typo --- stacks/mobymask/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stacks/mobymask/README.md b/stacks/mobymask/README.md index 40ef9545..239e2e03 100644 --- a/stacks/mobymask/README.md +++ b/stacks/mobymask/README.md @@ -31,6 +31,6 @@ $ docker exec -i psql -U vdbm mobymask-watcher < config/w ``` Finally start the remaining containers: ``` -$ laconic-sh deploy-system --include watcher-mobymask +$ laconic-so deploy-system --include watcher-mobymask ``` Correct operation should be verified by following the instructions [here](https://github.com/cerc-io/mobymask-watcher/tree/main/mainnet-watcher-only#run), checking GraphQL queries return valid results in the watcher's [playground](http://127.0.0.1:3001/graphql). \ No newline at end of file From 8a2a9bad9c212455ad5d8cfc59c6fd9a7e004102 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 10 Nov 2022 11:57:01 -0700 Subject: [PATCH 0112/1010] Update README.md --- stacks/mobymask/README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/stacks/mobymask/README.md b/stacks/mobymask/README.md index 239e2e03..46317b4b 100644 --- a/stacks/mobymask/README.md +++ b/stacks/mobymask/README.md @@ -1,7 +1,9 @@ -# Mobymask +# MobyMask -## Deploy the Mobymask Watcher -The instructions below show how to deploy a mobymask watcher using laconic-stack-orchestrator (the installation of which is covered [here](https://github.com/cerc-io/stack-orchestrator#install)). +The MobyMask watcher is a Laconic Network component that provides efficient access to MobyMask contract data from Ethereum, along with evidence allowing users to verify the correctness of that data. The watcher source code is available in [this repository](https://github.com/cerc-io/watcher-ts/tree/main/packages/mobymask-watcher) and a developer-oriented Docker Compose setup for the watcher can eb found [here](https://github.com/cerc-io/mobymask-watcher). The watcher can be deployed automatically using the Laconic Stack Orchestrator tool as detailed below: + +## Deploy the MobyMask Watcher +The instructions below show how to deploy a MobyMask watcher using laconic-stack-orchestrator (the installation of which is covered [here](https://github.com/cerc-io/stack-orchestrator#install)). This deployment expects that ipld-eth-server's endpoints are available on the local machine at http://ipld-eth-server.example.com:8083/graphql and http://ipld-eth-server.example.com:8082. More advanced configurations are supported by modifying the watcher's [config file](../../config/watcher-mobymask/mobymask-watcher.toml). ## Clone required repositories @@ -33,4 +35,4 @@ Finally start the remaining containers: ``` $ laconic-so deploy-system --include watcher-mobymask ``` -Correct operation should be verified by following the instructions [here](https://github.com/cerc-io/mobymask-watcher/tree/main/mainnet-watcher-only#run), checking GraphQL queries return valid results in the watcher's [playground](http://127.0.0.1:3001/graphql). \ No newline at end of file +Correct operation should be verified by following the instructions [here](https://github.com/cerc-io/mobymask-watcher/tree/main/mainnet-watcher-only#run), checking GraphQL queries return valid results in the watcher's [playground](http://127.0.0.1:3001/graphql). From 9afe1a99fa8ca9f34ee15af736aab1579b96b969 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 10 Nov 2022 12:12:14 -0700 Subject: [PATCH 0113/1010] Update README.md Fix typo --- stacks/mobymask/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stacks/mobymask/README.md b/stacks/mobymask/README.md index 46317b4b..f842ab03 100644 --- a/stacks/mobymask/README.md +++ b/stacks/mobymask/README.md @@ -1,6 +1,6 @@ # MobyMask -The MobyMask watcher is a Laconic Network component that provides efficient access to MobyMask contract data from Ethereum, along with evidence allowing users to verify the correctness of that data. The watcher source code is available in [this repository](https://github.com/cerc-io/watcher-ts/tree/main/packages/mobymask-watcher) and a developer-oriented Docker Compose setup for the watcher can eb found [here](https://github.com/cerc-io/mobymask-watcher). The watcher can be deployed automatically using the Laconic Stack Orchestrator tool as detailed below: +The MobyMask watcher is a Laconic Network component that provides efficient access to MobyMask contract data from Ethereum, along with evidence allowing users to verify the correctness of that data. The watcher source code is available in [this repository](https://github.com/cerc-io/watcher-ts/tree/main/packages/mobymask-watcher) and a developer-oriented Docker Compose setup for the watcher can be found [here](https://github.com/cerc-io/mobymask-watcher). The watcher can be deployed automatically using the Laconic Stack Orchestrator tool as detailed below: ## Deploy the MobyMask Watcher The instructions below show how to deploy a MobyMask watcher using laconic-stack-orchestrator (the installation of which is covered [here](https://github.com/cerc-io/stack-orchestrator#install)). From c74609f9d134b01c44e867405f5dd38190b22b14 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 14 Nov 2022 10:38:50 -0700 Subject: [PATCH 0114/1010] Update README.md Clarify Python venv install, remove first time script instructions until it can be made fail-safe. --- README.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 4c6adaf8..3c455e11 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,17 @@ Ensure that the following are already installed: $ python3 --version Python 3.8.10 ``` +1. Python venv package + This may or may not be already installed depending on the host OS and version. Check by running: + ``` + $ python3 -m venv + usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear] [--upgrade] [--without-pip] [--prompt PROMPT] ENV_DIR [ENV_DIR ...] + venv: error: the following arguments are required: ENV_DIR + ``` + If the venv package is missing you should see a message indicating how to install it, for example with: + ``` + $ apt install python3.8-venv + ``` 2. Docker (Install a current version from dockerco, don't use the version from any Linux distro) ``` $ docker --version @@ -35,14 +46,6 @@ Ensure that the following are already installed: ``` $ git clone (https://github.com/cerc-io/stack-orchestrator.git ``` -2. Optional first time setup for empty dev root and fresh SO checkout: - ``` - ./first_time_setup.sh - # e.g. /home/USER/workspace1/ - # only contains the stack-orchestrator repo cloned in step 1. - # this will naively attempt to setup and activate the venv, shiv, generate a LOCAL standalone laconic-so - # and then setup-repositories in workspace1/ - ``` 4. Enter the project directory: ``` $ cd stack-orchestrator From 8a08b8e277bed7c0bdf40c7afbb4b6764a52861c Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 14 Nov 2022 10:59:32 -0700 Subject: [PATCH 0115/1010] Update README.md Add missing shiv dependency --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3c455e11..a6b4cab2 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,7 @@ Use shiv to build a single file Python executable zip archive of laconic-so: 1. Install [shiv](https://github.com/linkedin/shiv): ``` $ (venv) pip install shiv + $ (venv) pip install wheel ``` 1. Run shiv to create a zipapp file: ``` From 5d05ef9b6be5252bbca79f5381daf532ca26fb65 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 14 Nov 2022 11:28:44 -0700 Subject: [PATCH 0116/1010] Update readme for binary release --- README.md | 59 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index a6b4cab2..36d845b9 100644 --- a/README.md +++ b/README.md @@ -3,29 +3,18 @@ Stack Orchestrator allows building and deployment of a Laconic stack on a single machine with minimial prerequisites. ## Setup -### Developer Mode -Developer mode runs the orchestrator from a cloned git repository. +### User Mode +Developer mode runs the orchestrator from a "binary" single-file release. #### Prerequisites Stack Orchestrator is a Python3 CLI tool that runs on any OS with Python3 and Docker. Tested on: Ubuntu 20/22. Ensure that the following are already installed: -1. Python3 (the version 3.8 available in Ubuntu 20/22 works) +1. Python3 (the stock Python3 version available in Ubuntu 20 and 22 is suitable) ``` $ python3 --version Python 3.8.10 ``` -1. Python venv package - This may or may not be already installed depending on the host OS and version. Check by running: - ``` - $ python3 -m venv - usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear] [--upgrade] [--without-pip] [--prompt PROMPT] ENV_DIR [ENV_DIR ...] - venv: error: the following arguments are required: ENV_DIR - ``` - If the venv package is missing you should see a message indicating how to install it, for example with: - ``` - $ apt install python3.8-venv - ``` 2. Docker (Install a current version from dockerco, don't use the version from any Linux distro) ``` $ docker --version @@ -42,6 +31,47 @@ Ensure that the following are already installed: # or to install for all users. ``` #### Install +1. Download the latest release from this page, into a suitable directory (e.g. `~/bin`): + ``` + $ cd ~/bin + $ curl https://github.com/cerc-io/stack-orchestrator/releases/download/v1.0.0-alpha/laconic-so + ``` +1. Ensure `laconic-so` is on the `PATH` +1. Verify operation: + ``` + $ ~/bin/laconic-so --help + Usage: python -m laconic-so [OPTIONS] COMMAND [ARGS]... + + Laconic Stack Orchestrator + + Options: + --quiet + --verbose + --dry-run + --local-stack + -h, --help Show this message and exit. + + Commands: + build-containers build the set of containers required for a complete... + deploy-system deploy a stack + setup-repositories git clone the set of repositories required to build... + ``` +### Developer mode +Suitable for developers either modifying or debugging the orchestrator Python code: +#### Prerequisites +In addition to the binary install prerequisites listed above, the following are required: +1. Python venv package + This may or may not be already installed depending on the host OS and version. Check by running: + ``` + $ python3 -m venv + usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear] [--upgrade] [--without-pip] [--prompt PROMPT] ENV_DIR [ENV_DIR ...] + venv: error: the following arguments are required: ENV_DIR + ``` + If the venv package is missing you should see a message indicating how to install it, for example with: + ``` + $ apt install python3.8-venv + ``` +#### Install 1. Clone this repository: ``` $ git clone (https://github.com/cerc-io/stack-orchestrator.git @@ -78,6 +108,7 @@ Ensure that the following are already installed: deploy-system deploy a stack setup-repositories git clone the set of repositories required to build... ``` + #### Build a zipapp (single file distributable script) Use shiv to build a single file Python executable zip archive of laconic-so: 1. Install [shiv](https://github.com/linkedin/shiv): From 4d8d4c0bbe656c02167db32ea1250643affcdc35 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 14 Nov 2022 11:31:06 -0700 Subject: [PATCH 0117/1010] Update README.md Fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 36d845b9..d6bc52f5 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Ensure that the following are already installed: # or to install for all users. ``` #### Install -1. Download the latest release from this page, into a suitable directory (e.g. `~/bin`): +1. Download the latest release from [this page](https://github.com/cerc-io/stack-orchestrator/tags), into a suitable directory (e.g. `~/bin`): ``` $ cd ~/bin $ curl https://github.com/cerc-io/stack-orchestrator/releases/download/v1.0.0-alpha/laconic-so From aa138efa17dd2c4d514d2c207ed31e5c28713dba Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 14 Nov 2022 11:32:28 -0700 Subject: [PATCH 0118/1010] Update README.md Fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d6bc52f5..8e6fb867 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Stack Orchestrator allows building and deployment of a Laconic stack on a single ## Setup ### User Mode -Developer mode runs the orchestrator from a "binary" single-file release. +User mode runs the orchestrator from a "binary" single-file release and does not require special Python environment setup. Use this mode unless you plan to make changes to the orchestrator source code. #### Prerequisites Stack Orchestrator is a Python3 CLI tool that runs on any OS with Python3 and Docker. Tested on: Ubuntu 20/22. From 437b5a696c02ac89936a6d5f7fb073f8da555512 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 14 Nov 2022 22:49:00 -0700 Subject: [PATCH 0119/1010] Selective git clone/pull --- app/setup_repositories.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/app/setup_repositories.py b/app/setup_repositories.py index db7fafb3..5110b36d 100644 --- a/app/setup_repositories.py +++ b/app/setup_repositories.py @@ -22,6 +22,7 @@ from decouple import config import git from tqdm import tqdm import click +from .util import include_exclude_check class GitProgress(git.RemoteProgress): @@ -49,11 +50,13 @@ def is_git_repo(path): @click.command() +@click.option("--include", help="only clone these repositories") +@click.option("--exclude", help="don\'t clone these repositories") @click.option('--check-only', is_flag=True, default=False) @click.option('--pull', is_flag=True, default=False) @click.option('--branches-file', help="checkout branches specified in this file") @click.pass_context -def command(ctx, check_only, pull, branches_file): +def command(ctx, include, exclude, check_only, pull, branches_file): '''git clone the set of repositories required to build the complete system from source''' quiet = ctx.obj.quiet @@ -87,10 +90,18 @@ def command(ctx, check_only, pull, branches_file): os.makedirs(dev_root_path) with open("repository-list.txt") as repository_list_file: - repos = repository_list_file.read().splitlines() + all_repos = repository_list_file.read().splitlines() if verbose: - print(f'Repos: {repos}') + print(f'Repos: {all_repos}') + + repos = [] + for repo in all_repos: + if include_exclude_check(repo, include, exclude): + repos.append(repo) + else: + if not quiet: + print(f"Excluding: {repo}") def process_repo(repo): full_github_repo_path = f'git@github.com:{repo}' From e27b3e114e0ad035afd5f34b7a74c0ed7fb39b25 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 14 Nov 2022 23:00:29 -0700 Subject: [PATCH 0120/1010] Update README.md Update for selective repo clone --- stacks/mobymask/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stacks/mobymask/README.md b/stacks/mobymask/README.md index f842ab03..2b5925f7 100644 --- a/stacks/mobymask/README.md +++ b/stacks/mobymask/README.md @@ -8,7 +8,7 @@ The instructions below show how to deploy a MobyMask watcher using laconic-stack This deployment expects that ipld-eth-server's endpoints are available on the local machine at http://ipld-eth-server.example.com:8083/graphql and http://ipld-eth-server.example.com:8082. More advanced configurations are supported by modifying the watcher's [config file](../../config/watcher-mobymask/mobymask-watcher.toml). ## Clone required repositories ``` -$ laconic-so setup-repositories +$ laconic-so setup-repositories --include vulcanize/assemblyscript,cerc-io/watcher-ts ``` Checkout required branches for the current release: ``` From 8236da4b01a98dac2d470e8d66f91b4cb40847e3 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 15 Nov 2022 10:56:08 -0700 Subject: [PATCH 0121/1010] Add laconicd fixturenet readme --- stacks/laconicd/README.md | 19 +++++++++++++++++++ stacks/laconicd/stack.yml | 11 +++++++++++ 2 files changed, 30 insertions(+) create mode 100644 stacks/laconicd/README.md create mode 100644 stacks/laconicd/stack.yml diff --git a/stacks/laconicd/README.md b/stacks/laconicd/README.md new file mode 100644 index 00000000..42139618 --- /dev/null +++ b/stacks/laconicd/README.md @@ -0,0 +1,19 @@ +# Laconicd Fixturenet + +Instructions for deploying a local Laconic blockchain "fixturenet" for development and testing purposes using laconic-stack-orchestrator (the installation of which is covered [here](https://github.com/cerc-io/stack-orchestrator#install)): + +## Clone required repositories +``` +$ laconic-so setup-repositories --include cerc-io/laconicd,cerc-io/laconic-sdk,cerc-io/laconic-cns-cli +``` +## Build the laconicd container +``` +$ laconic-sh build-containers --include cerc/laconicd +``` +This should create a container with tag `cerc/watcher-mobymask` in the local image registry. +## Deploy the stack +First the watcher database has to be initialized. Start only the watcher-db service: +``` +$ laconic-so deploy-system --include fixturenet-laconicd +``` +Correct operation should be verified by checking the laconicd container's log. diff --git a/stacks/laconicd/stack.yml b/stacks/laconicd/stack.yml new file mode 100644 index 00000000..0b54adee --- /dev/null +++ b/stacks/laconicd/stack.yml @@ -0,0 +1,11 @@ +version: "1.0" +name: laconicd-fixturenet +repos: + - cerc-io/laconicd + - cerc-io/laconic-sdk + - cerc-io/laconic-cns-cli +containers: + - cerc/laconicd + - cerc/laconic-cns-cli +pods: + - fixturenet-laconicd \ No newline at end of file From 8b12dec75b7e975bfa9efc3a70bbceb00a31cc18 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 15 Nov 2022 11:13:45 -0700 Subject: [PATCH 0122/1010] Update README.md Update version in download link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8e6fb867..cf625948 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Ensure that the following are already installed: 1. Download the latest release from [this page](https://github.com/cerc-io/stack-orchestrator/tags), into a suitable directory (e.g. `~/bin`): ``` $ cd ~/bin - $ curl https://github.com/cerc-io/stack-orchestrator/releases/download/v1.0.0-alpha/laconic-so + $ curl https://github.com/cerc-io/stack-orchestrator/releases/download/v1.0.1-alpha/laconic-so ``` 1. Ensure `laconic-so` is on the `PATH` 1. Verify operation: From 70b74763182ddf09eb65f198a96391715d884ef8 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 15 Nov 2022 11:14:33 -0700 Subject: [PATCH 0123/1010] Update README.md Fix install link --- stacks/laconicd/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stacks/laconicd/README.md b/stacks/laconicd/README.md index 42139618..b6abafec 100644 --- a/stacks/laconicd/README.md +++ b/stacks/laconicd/README.md @@ -1,6 +1,6 @@ # Laconicd Fixturenet -Instructions for deploying a local Laconic blockchain "fixturenet" for development and testing purposes using laconic-stack-orchestrator (the installation of which is covered [here](https://github.com/cerc-io/stack-orchestrator#install)): +Instructions for deploying a local Laconic blockchain "fixturenet" for development and testing purposes using laconic-stack-orchestrator (the installation of which is covered [here](https://github.com/cerc-io/stack-orchestrator#user-mode)): ## Clone required repositories ``` From 7a5834a02175eb2c56fea22fd39e49e42b4cc6f6 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 15 Nov 2022 11:14:56 -0700 Subject: [PATCH 0124/1010] Update README.md Fix install link --- stacks/mobymask/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stacks/mobymask/README.md b/stacks/mobymask/README.md index 2b5925f7..8b197754 100644 --- a/stacks/mobymask/README.md +++ b/stacks/mobymask/README.md @@ -3,7 +3,7 @@ The MobyMask watcher is a Laconic Network component that provides efficient access to MobyMask contract data from Ethereum, along with evidence allowing users to verify the correctness of that data. The watcher source code is available in [this repository](https://github.com/cerc-io/watcher-ts/tree/main/packages/mobymask-watcher) and a developer-oriented Docker Compose setup for the watcher can be found [here](https://github.com/cerc-io/mobymask-watcher). The watcher can be deployed automatically using the Laconic Stack Orchestrator tool as detailed below: ## Deploy the MobyMask Watcher -The instructions below show how to deploy a MobyMask watcher using laconic-stack-orchestrator (the installation of which is covered [here](https://github.com/cerc-io/stack-orchestrator#install)). +The instructions below show how to deploy a MobyMask watcher using laconic-stack-orchestrator (the installation of which is covered [here](https://github.com/cerc-io/stack-orchestrator#user-mode)). This deployment expects that ipld-eth-server's endpoints are available on the local machine at http://ipld-eth-server.example.com:8083/graphql and http://ipld-eth-server.example.com:8082. More advanced configurations are supported by modifying the watcher's [config file](../../config/watcher-mobymask/mobymask-watcher.toml). ## Clone required repositories From 5a69bf471b9e489f0d569f924a04db5534599674 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 15 Nov 2022 11:34:13 -0700 Subject: [PATCH 0125/1010] Move data files into subdirectory --- app/build_containers.py | 2 +- app/deploy_system.py | 2 +- app/setup_repositories.py | 2 +- container-image-list.txt => data/container-image-list.txt | 0 pod-list.txt => data/pod-list.txt | 0 repository-list.txt => data/repository-list.txt | 0 6 files changed, 3 insertions(+), 3 deletions(-) rename container-image-list.txt => data/container-image-list.txt (100%) rename pod-list.txt => data/pod-list.txt (100%) rename repository-list.txt => data/repository-list.txt (100%) diff --git a/app/build_containers.py b/app/build_containers.py index 817dc0e3..7a660b8a 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -55,7 +55,7 @@ def command(ctx, include, exclude): if not os.path.isdir(dev_root_path): print('Dev root directory doesn\'t exist, creating') - with open("container-image-list.txt") as container_list_file: + with open("data/container-image-list.txt") as container_list_file: containers = container_list_file.read().splitlines() if verbose: diff --git a/app/deploy_system.py b/app/deploy_system.py index ad8614ff..56f00604 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -48,7 +48,7 @@ def command(ctx, include, exclude, cluster, command, services): if verbose: print(f"Using cluster name: {cluster}") - with open("pod-list.txt") as pod_list_file: + with open("data/pod-list.txt") as pod_list_file: pods = pod_list_file.read().splitlines() if verbose: diff --git a/app/setup_repositories.py b/app/setup_repositories.py index 5110b36d..ff8e8f84 100644 --- a/app/setup_repositories.py +++ b/app/setup_repositories.py @@ -89,7 +89,7 @@ def command(ctx, include, exclude, check_only, pull, branches_file): print('Dev root directory doesn\'t exist, creating') os.makedirs(dev_root_path) - with open("repository-list.txt") as repository_list_file: + with open("data/repository-list.txt") as repository_list_file: all_repos = repository_list_file.read().splitlines() if verbose: diff --git a/container-image-list.txt b/data/container-image-list.txt similarity index 100% rename from container-image-list.txt rename to data/container-image-list.txt diff --git a/pod-list.txt b/data/pod-list.txt similarity index 100% rename from pod-list.txt rename to data/pod-list.txt diff --git a/repository-list.txt b/data/repository-list.txt similarity index 100% rename from repository-list.txt rename to data/repository-list.txt From 1a5844af7aee2c8cd80caa60a7c464f1f07527d9 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 15 Nov 2022 22:02:44 -0700 Subject: [PATCH 0126/1010] Fix shiv package --- app/build_containers.py | 5 +++-- {data => app/data}/container-image-list.txt | 0 {data => app/data}/pod-list.txt | 0 {data => app/data}/repository-list.txt | 0 app/deploy_system.py | 7 ++++--- app/setup_repositories.py | 21 +++++++++++---------- setup.py | 2 ++ 7 files changed, 20 insertions(+), 15 deletions(-) rename {data => app/data}/container-image-list.txt (100%) rename {data => app/data}/pod-list.txt (100%) rename {data => app/data}/repository-list.txt (100%) diff --git a/app/build_containers.py b/app/build_containers.py index 7a660b8a..3621e5da 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -25,6 +25,7 @@ import sys from decouple import config import subprocess import click +import pkg_resources from .util import include_exclude_check # TODO: find a place for this @@ -55,8 +56,8 @@ def command(ctx, include, exclude): if not os.path.isdir(dev_root_path): print('Dev root directory doesn\'t exist, creating') - with open("data/container-image-list.txt") as container_list_file: - containers = container_list_file.read().splitlines() + with pkg_resources.resource_stream(__name__, "data/container-image-list.txt") as container_list_file: + containers = container_list_file.read().decode().splitlines() if verbose: print(f'Containers: {containers}') diff --git a/data/container-image-list.txt b/app/data/container-image-list.txt similarity index 100% rename from data/container-image-list.txt rename to app/data/container-image-list.txt diff --git a/data/pod-list.txt b/app/data/pod-list.txt similarity index 100% rename from data/pod-list.txt rename to app/data/pod-list.txt diff --git a/data/repository-list.txt b/app/data/repository-list.txt similarity index 100% rename from data/repository-list.txt rename to app/data/repository-list.txt diff --git a/app/deploy_system.py b/app/deploy_system.py index 56f00604..9cef3f65 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -20,6 +20,7 @@ import os import sys from python_on_whales import DockerClient import click +import pkg_resources from .util import include_exclude_check @@ -48,11 +49,11 @@ def command(ctx, include, exclude, cluster, command, services): if verbose: print(f"Using cluster name: {cluster}") - with open("data/pod-list.txt") as pod_list_file: - pods = pod_list_file.read().splitlines() + with pkg_resources.resource_stream(__name__, "data/pod-list.txt") as pod_list_file: + pods = pod_list_file.read().decode().splitlines() if verbose: - print(f'Pods: {pods}') + print(f"Pods: {pods}") # Construct a docker compose command suitable for our purpose diff --git a/app/setup_repositories.py b/app/setup_repositories.py index ff8e8f84..e7693147 100644 --- a/app/setup_repositories.py +++ b/app/setup_repositories.py @@ -22,6 +22,7 @@ from decouple import config import git from tqdm import tqdm import click +import pkg_resources from .util import include_exclude_check @@ -77,23 +78,23 @@ def command(ctx, include, exclude, check_only, pull, branches_file): if local_stack: dev_root_path = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] - print(f'Local stack dev_root_path (CERC_REPO_BASE_DIR) overridden to: {dev_root_path}') + print(f"Local stack dev_root_path (CERC_REPO_BASE_DIR) overridden to: {dev_root_path}") else: dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) if not quiet: - print(f'Dev Root is: {dev_root_path}') + print(f"Dev Root is: {dev_root_path}") if not os.path.isdir(dev_root_path): if not quiet: print('Dev root directory doesn\'t exist, creating') os.makedirs(dev_root_path) - with open("data/repository-list.txt") as repository_list_file: - all_repos = repository_list_file.read().splitlines() + with pkg_resources.resource_stream(__name__, "data/repository-list.txt") as repository_list_file: + all_repos = repository_list_file.read().decode().splitlines() if verbose: - print(f'Repos: {all_repos}') + print(f"Repos: {all_repos}") repos = [] for repo in all_repos: @@ -104,23 +105,23 @@ def command(ctx, include, exclude, check_only, pull, branches_file): print(f"Excluding: {repo}") def process_repo(repo): - full_github_repo_path = f'git@github.com:{repo}' + full_github_repo_path = f"git@github.com:{repo}" repoName = repo.split("/")[-1] full_filesystem_repo_path = os.path.join(dev_root_path, repoName) is_present = os.path.isdir(full_filesystem_repo_path) if not quiet: - present_text = f'already exists active branch: {git.Repo(full_filesystem_repo_path).active_branch}' if is_present \ + present_text = f"already exists active branch: {git.Repo(full_filesystem_repo_path).active_branch}" if is_present \ else 'Needs to be fetched' - print(f'Checking: {full_filesystem_repo_path}: {present_text}') + print(f"Checking: {full_filesystem_repo_path}: {present_text}") # Quick check that it's actually a repo if is_present: if not is_git_repo(full_filesystem_repo_path): - print(f'Error: {full_filesystem_repo_path} does not contain a valid git repository') + print(f"Error: {full_filesystem_repo_path} does not contain a valid git repository") sys.exit(1) else: if pull: if verbose: - print(f'Running git pull for {full_filesystem_repo_path}') + print(f"Running git pull for {full_filesystem_repo_path}") if not check_only: git_repo = git.Repo(full_filesystem_repo_path) origin = git_repo.remotes.origin diff --git a/setup.py b/setup.py index 88e10155..17d2ae35 100644 --- a/setup.py +++ b/setup.py @@ -18,6 +18,8 @@ setup( packages=find_packages(), install_requires=[requirements], python_requires='>=3.7', + include_package_data=True, + package_data={'': ['data/*.txt']}, classifiers=[ "Programming Language :: Python :: 3.8", "Operating System :: OS Independent", From e5c18ba77abddf053e76df2d5f2c8b732115f235 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 15 Nov 2022 22:06:04 -0700 Subject: [PATCH 0127/1010] Update README.md Update download url version. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cf625948..d16fed8f 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Ensure that the following are already installed: 1. Download the latest release from [this page](https://github.com/cerc-io/stack-orchestrator/tags), into a suitable directory (e.g. `~/bin`): ``` $ cd ~/bin - $ curl https://github.com/cerc-io/stack-orchestrator/releases/download/v1.0.1-alpha/laconic-so + $ curl https://github.com/cerc-io/stack-orchestrator/releases/download/v1.0.2-alpha/laconic-so ``` 1. Ensure `laconic-so` is on the `PATH` 1. Verify operation: From ed4352911dab032f53992187b92a584e87f13a4f Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 15 Nov 2022 22:18:43 -0700 Subject: [PATCH 0128/1010] Allow http for git (as the default) --- app/setup_repositories.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/setup_repositories.py b/app/setup_repositories.py index e7693147..828a0eb0 100644 --- a/app/setup_repositories.py +++ b/app/setup_repositories.py @@ -53,11 +53,12 @@ def is_git_repo(path): @click.command() @click.option("--include", help="only clone these repositories") @click.option("--exclude", help="don\'t clone these repositories") +@click.option('--git-ssh', is_flag=True, default=False) @click.option('--check-only', is_flag=True, default=False) @click.option('--pull', is_flag=True, default=False) @click.option('--branches-file', help="checkout branches specified in this file") @click.pass_context -def command(ctx, include, exclude, check_only, pull, branches_file): +def command(ctx, include, exclude, git_ssh, check_only, pull, branches_file): '''git clone the set of repositories required to build the complete system from source''' quiet = ctx.obj.quiet @@ -105,7 +106,9 @@ def command(ctx, include, exclude, check_only, pull, branches_file): print(f"Excluding: {repo}") def process_repo(repo): - full_github_repo_path = f"git@github.com:{repo}" + git_ssh_prefix = "git@github.com:" + git_http_prefix = "https://github.com/" + full_github_repo_path = f"{git_ssh_prefix if git_ssh else git_http_prefix}{repo}" repoName = repo.split("/")[-1] full_filesystem_repo_path = os.path.join(dev_root_path, repoName) is_present = os.path.isdir(full_filesystem_repo_path) From f7e9cf4ba48c0d015ebea0127a48fbd607859760 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 15 Nov 2022 22:24:11 -0700 Subject: [PATCH 0129/1010] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d16fed8f..2deac75d 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Ensure that the following are already installed: 1. Download the latest release from [this page](https://github.com/cerc-io/stack-orchestrator/tags), into a suitable directory (e.g. `~/bin`): ``` $ cd ~/bin - $ curl https://github.com/cerc-io/stack-orchestrator/releases/download/v1.0.2-alpha/laconic-so + $ curl https://github.com/cerc-io/stack-orchestrator/releases/download/v1.0.3-alpha/laconic-so ``` 1. Ensure `laconic-so` is on the `PATH` 1. Verify operation: From acb06feac44623c63f741caa3bfa311d9fa0ffec Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 29 Nov 2022 06:29:18 -0700 Subject: [PATCH 0130/1010] Fix typo --- stacks/laconicd/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stacks/laconicd/README.md b/stacks/laconicd/README.md index b6abafec..e7c0023b 100644 --- a/stacks/laconicd/README.md +++ b/stacks/laconicd/README.md @@ -8,7 +8,7 @@ $ laconic-so setup-repositories --include cerc-io/laconicd,cerc-io/laconic-sdk,c ``` ## Build the laconicd container ``` -$ laconic-sh build-containers --include cerc/laconicd +$ laconic-so build-containers --include cerc/laconicd ``` This should create a container with tag `cerc/watcher-mobymask` in the local image registry. ## Deploy the stack From 28a3880fcfdad398fe93eee033a0339df018e61a Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 29 Nov 2022 06:33:46 -0700 Subject: [PATCH 0131/1010] Add deploy command --- stacks/laconicd/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stacks/laconicd/README.md b/stacks/laconicd/README.md index e7c0023b..37368262 100644 --- a/stacks/laconicd/README.md +++ b/stacks/laconicd/README.md @@ -14,6 +14,6 @@ This should create a container with tag `cerc/watcher-mobymask` in the local ima ## Deploy the stack First the watcher database has to be initialized. Start only the watcher-db service: ``` -$ laconic-so deploy-system --include fixturenet-laconicd +$ laconic-so deploy-system --include fixturenet-laconicd up ``` Correct operation should be verified by checking the laconicd container's log. From 43d59a9e28d3142d059eb4e21aa5d1b0830e3ff5 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 29 Nov 2022 19:54:08 -0700 Subject: [PATCH 0132/1010] Quiet verbose output --- app/deploy_system.py | 2 +- app/setup_repositories.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/deploy_system.py b/app/deploy_system.py index 9cef3f65..aee2d060 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -63,7 +63,7 @@ def command(ctx, include, exclude, cluster, command, services): compose_file_name = os.path.join("compose", f"docker-compose-{pod}.yml") compose_files.append(compose_file_name) else: - if not quiet: + if verbose: print(f"Excluding: {pod}") if verbose: diff --git a/app/setup_repositories.py b/app/setup_repositories.py index 828a0eb0..3086cbb1 100644 --- a/app/setup_repositories.py +++ b/app/setup_repositories.py @@ -102,7 +102,7 @@ def command(ctx, include, exclude, git_ssh, check_only, pull, branches_file): if include_exclude_check(repo, include, exclude): repos.append(repo) else: - if not quiet: + if verbose: print(f"Excluding: {repo}") def process_repo(repo): From 3308328524ce2a1b75d004688d6dca4a77427e8e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 29 Nov 2022 19:58:18 -0700 Subject: [PATCH 0133/1010] Fix copy/paste --- stacks/laconicd/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/stacks/laconicd/README.md b/stacks/laconicd/README.md index 37368262..56017fd5 100644 --- a/stacks/laconicd/README.md +++ b/stacks/laconicd/README.md @@ -10,9 +10,8 @@ $ laconic-so setup-repositories --include cerc-io/laconicd,cerc-io/laconic-sdk,c ``` $ laconic-so build-containers --include cerc/laconicd ``` -This should create a container with tag `cerc/watcher-mobymask` in the local image registry. +This should create a container with tag `cerc/laconicd` in the local image registry. ## Deploy the stack -First the watcher database has to be initialized. Start only the watcher-db service: ``` $ laconic-so deploy-system --include fixturenet-laconicd up ``` From d87a2387e59f855041c919541a75f45d3a5590b5 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 29 Nov 2022 21:14:40 -0700 Subject: [PATCH 0134/1010] Display mapped ports, revert to ps command name --- app/deploy_system.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/app/deploy_system.py b/app/deploy_system.py index aee2d060..b3fb618a 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -72,7 +72,7 @@ def command(ctx, include, exclude, cluster, command, services): # See: https://gabrieldemarmiesse.github.io/python-on-whales/sub-commands/compose/ docker = DockerClient(compose_files=compose_files, compose_project_name=cluster) - services_list = list(services) or None + services_list = list(services) or None if not dry_run: if command == "up": @@ -83,14 +83,19 @@ def command(ctx, include, exclude, cluster, command, services): if verbose: print("Running compose down") docker.compose.down() - elif command == "status": + elif command == "ps": if verbose: print("Running compose ps") container_list = docker.compose.ps() if len(container_list) > 0: print("Running containers:") for container in container_list: - print(f"id: {container.id}, name: {container.name}") + print(f"id: {container.id}, name: {container.name}, ports: ", end="") + ports = container.network_settings.ports + for port_mapping in ports.keys(): + print(f"{ports[port_mapping][0]['HostIp']}:{ports[port_mapping][0]['HostPort']}->{port_mapping}", end=",") + # TODO: fix the extra comma + print() else: print("No containers running") elif command == "logs": From bd9aaebe3d44eb6c6e25c97f9783d7a90a21446d Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Tue, 6 Dec 2022 11:10:38 -0600 Subject: [PATCH 0135/1010] eth-probe with fixturenet (#57) * eth-probe with fixturenet * Add ability to wait on geth to be up and minting blocks before launching the probe. --- app/data/container-image-list.txt | 1 + app/data/pod-list.txt | 1 + app/data/repository-list.txt | 1 + compose/docker-compose-eth-probe.yml | 59 +++++++++++++++++++ compose/docker-compose-fixturenet-eth.yml | 3 + config/fixturenet-eth/fixturenet-eth.env | 1 + container-build/cerc-eth-probe/build.sh | 3 + .../genesis/el/build_el.sh | 25 +++++++- .../genesis/el/el-config.yaml | 11 ++++ .../cerc-fixturenet-eth-geth/run-el.sh | 8 ++- 10 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 compose/docker-compose-eth-probe.yml create mode 100755 container-build/cerc-eth-probe/build.sh diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index 65c1c54f..47c488dc 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -14,3 +14,4 @@ cerc/fixturenet-eth-geth cerc/fixturenet-eth-lighthouse cerc/watcher-mobymask cerc/test-container +cerc/eth-probe diff --git a/app/data/pod-list.txt b/app/data/pod-list.txt index c0635c4e..342e3018 100644 --- a/app/data/pod-list.txt +++ b/app/data/pod-list.txt @@ -12,3 +12,4 @@ fixturenet-laconicd fixturenet-eth watcher-mobymask test +eth-probe diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index 6bc5970d..a57b00dc 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -12,3 +12,4 @@ cerc-io/laconic-cns-cli cerc-io/mobymask-watcher cerc-io/watcher-ts vulcanize/assemblyscript +vulcanize/eth-probe diff --git a/compose/docker-compose-eth-probe.yml b/compose/docker-compose-eth-probe.yml new file mode 100644 index 00000000..8051db20 --- /dev/null +++ b/compose/docker-compose-eth-probe.yml @@ -0,0 +1,59 @@ +version: '3.2' + +services: + eth-probe-db: + restart: always + image: timescale/timescaledb:latest-pg14 + environment: + POSTGRES_USER: "probe" + POSTGRES_DB: "probe" + POSTGRES_PASSWORD: "probe" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "5432"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 10s + volumes: + - ../../eth-probe/db/schema.sql:/docker-entrypoint-initdb.d/init.sql + ports: + - 5432 + eth-probe-mq: + restart: always + image: cerc/eth-probe:local + environment: + MODE: "mq" + PROBE_DEV: "false" + PGPORT: 5432 + PGPASSWORD: "probe" + DB_USER: "probe" + PROBE_DB_NAME: "probe" + PROBE_DB_LOCATION: "eth-probe-db" + MQ_HOST: "0.0.0.0" + MQ_PORT: 33333 + DEBUG: "vulcanize:*,cerc:*" + healthcheck: + test: [ "CMD", "nc", "-v", "localhost", "33333" ] + interval: 20s + timeout: 5s + retries: 15 + start_period: 10s + depends_on: + eth-probe-db: + condition: service_healthy + eth-probe-probe: + restart: always + image: cerc/eth-probe:local + environment: + MODE: "probe" + PROBE_DEV: "false" + MQ_HOST: "eth-probe-mq" + MQ_PORT: 33333 + PROBE_ID: 0 + GETH_HOST: "fixturenet-eth-geth-1" + GETH_MIN_BLOCK: 5 + GETHJSON_URL: "http://fixturenet-eth-geth-1:9898/geth.json" + DEBUG: "vulcanize:*,cerc:*,-vulcanize:sniffer:dpt:error" + depends_on: + eth-probe-mq: + condition: service_healthy diff --git a/compose/docker-compose-fixturenet-eth.yml b/compose/docker-compose-fixturenet-eth.yml index d105221f..96e3d2ba 100644 --- a/compose/docker-compose-fixturenet-eth.yml +++ b/compose/docker-compose-fixturenet-eth.yml @@ -8,6 +8,9 @@ services: environment: RUN_BOOTNODE: "true" image: cerc/fixturenet-eth-geth:local + ports: + - "9898" + - "30303" fixturenet-eth-geth-1: hostname: fixturenet-eth-geth-1 diff --git a/config/fixturenet-eth/fixturenet-eth.env b/config/fixturenet-eth/fixturenet-eth.env index 4467c543..9ec6742e 100644 --- a/config/fixturenet-eth/fixturenet-eth.env +++ b/config/fixturenet-eth/fixturenet-eth.env @@ -2,6 +2,7 @@ ACCOUNT_PASSWORD=secret1212 # ENODE of the geth bootnode. +BOOTNODE_KEY="b0ac22adcad37213c7c565810a50f1772291e7b0ce53fb73e7ec2a3c75bc13b5" ENODE="enode://af22c29c316ad069cf48a09a4ad5cf04a251b411e45098888d114c6dd7f489a13786620d5953738762afa13711d4ffb3b19aa5de772d8af72f851f7e9c5b164a@fixturenet-eth-bootnode-geth:30303" # JWT shared by geth and lighthouse for authentication. diff --git a/container-build/cerc-eth-probe/build.sh b/container-build/cerc-eth-probe/build.sh new file mode 100755 index 00000000..4f211307 --- /dev/null +++ b/container-build/cerc-eth-probe/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +# Build cerc/eth-probe +docker build -t cerc/eth-probe:local ${CERC_REPO_BASE_DIR}/eth-probe diff --git a/container-build/cerc-fixturenet-eth-geth/genesis/el/build_el.sh b/container-build/cerc-fixturenet-eth-geth/genesis/el/build_el.sh index 0070707d..76b43daf 100755 --- a/container-build/cerc-fixturenet-eth-geth/genesis/el/build_el.sh +++ b/container-build/cerc-fixturenet-eth-geth/genesis/el/build_el.sh @@ -10,6 +10,29 @@ tmp_dir=$(mktemp -d -t ci-XXXXXXXXXX) envsubst < el-config.yaml > $tmp_dir/genesis-config.yaml ttd=`cat $tmp_dir/genesis-config.yaml | grep terminal_total_difficulty | awk '{ print $2 }'` +homestead_block=`cat $tmp_dir/genesis-config.yaml | grep homestead_block | awk '{ print $2 }'` +eip150_block=`cat $tmp_dir/genesis-config.yaml | grep eip150_block | awk '{ print $2 }'` +eip155_block=`cat $tmp_dir/genesis-config.yaml | grep eip155_block | awk '{ print $2 }'` +eip158_block=`cat $tmp_dir/genesis-config.yaml | grep eip158_block | awk '{ print $2 }'` +byzantium_block=`cat $tmp_dir/genesis-config.yaml | grep byzantium_block | awk '{ print $2 }'` +constantinople_block=`cat $tmp_dir/genesis-config.yaml | grep constantinople_block | awk '{ print $2 }'` +petersburg_block=`cat $tmp_dir/genesis-config.yaml | grep petersburg_block | awk '{ print $2 }'` +istanbul_block=`cat $tmp_dir/genesis-config.yaml | grep istanbul_block | awk '{ print $2 }'` +berlin_block=`cat $tmp_dir/genesis-config.yaml | grep berlin_block | awk '{ print $2 }'` +london_block=`cat $tmp_dir/genesis-config.yaml | grep london_block | awk '{ print $2 }'` +merge_fork_block=`cat $tmp_dir/genesis-config.yaml | grep merge_fork_block | awk '{ print $2 }'` -python3 /apps/el-gen/genesis_geth.py $tmp_dir/genesis-config.yaml | jq ".config.terminalTotalDifficulty=$ttd" > ../build/el/geth.json +python3 /apps/el-gen/genesis_geth.py $tmp_dir/genesis-config.yaml | \ + jq ".config.terminalTotalDifficulty=$ttd" | \ + jq ".config.homesteadBlock=$homestead_block" | \ + jq ".config.eip150Block=$eip150_block" | \ + jq ".config.eip155Block=$eip155_block" | \ + jq ".config.eip158Block=$eip158_block" | \ + jq ".config.byzantiumBlock=$byzantium_block" | \ + jq ".config.constantinopleBlock=$constantinople_block" | \ + jq ".config.petersburgBlock=$petersburg_block" | \ + jq ".config.istanbulBlock=$istanbul_block" | \ + jq ".config.berlinBlock=$berlin_block" | \ + jq ".config.londonBlock=$london_block" | \ + jq ".config.mergeForkBlock=$merge_fork_block" > ../build/el/geth.json python3 ../accounts/mnemonic_to_csv.py $tmp_dir/genesis-config.yaml > ../build/el/accounts.csv diff --git a/container-build/cerc-fixturenet-eth-geth/genesis/el/el-config.yaml b/container-build/cerc-fixturenet-eth-geth/genesis/el/el-config.yaml index ed8d4885..8bcb0fac 100644 --- a/container-build/cerc-fixturenet-eth-geth/genesis/el/el-config.yaml +++ b/container-build/cerc-fixturenet-eth-geth/genesis/el/el-config.yaml @@ -11,6 +11,17 @@ chain_id: 1212 deposit_contract_address: "0x1212121212121212121212121212121212121212" genesis_timestamp: 0 terminal_total_difficulty: 1000 +homestead_block: 1 +eip150_block: 1 +eip155_block: 1 +eip158_block: 1 +byzantium_block: 1 +constantinople_block: 1 +petersburg_block: 1 +istanbul_block: 1 +berlin_block: 1 +london_block: 1 +merge_fork_block: 1 clique: enabled: false diff --git a/container-build/cerc-fixturenet-eth-geth/run-el.sh b/container-build/cerc-fixturenet-eth-geth/run-el.sh index 0d0a866b..caf14070 100755 --- a/container-build/cerc-fixturenet-eth-geth/run-el.sh +++ b/container-build/cerc-fixturenet-eth-geth/run-el.sh @@ -4,9 +4,14 @@ ETHERBASE=`cat /opt/testnet/build/el/accounts.csv | head -1 | cut -d',' -f2` NETWORK_ID=`cat /opt/testnet/el/el-config.yaml | grep 'chain_id' | awk '{ print $2 }'` NETRESTRICT=`ip addr | grep inet | grep -v '127.0' | awk '{print $2}'` +HOME_DIR=`pwd` +cd /opt/testnet/build/el +python3 -m http.server 9898 & +cd $HOME_DIR + if [ "true" == "$RUN_BOOTNODE" ]; then geth \ - --nodekeyhex="b0ac22adcad37213c7c565810a50f1772291e7b0ce53fb73e7ec2a3c75bc13b5" \ + --nodekeyhex="${BOOTNODE_KEY}" \ --nodiscover \ --ipcdisable \ --networkid=${NETWORK_ID} \ @@ -49,5 +54,6 @@ else --syncmode=full \ --mine \ --miner.threads=1 \ + --verbosity=5 \ --miner.etherbase="${ETHERBASE}" ${STATEDIFF_OPTS} 2>&1 | tee /var/log/geth.log fi From 32edd7aea783ca934e661519b9ab5b830e485fdf Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Tue, 6 Dec 2022 17:17:24 -0600 Subject: [PATCH 0136/1010] 46: Make it possible to launch fixturenet with or without the statediff DB. (#59) * 46: Make it possible to launch fixturenet with or without the statediff DB. * Require the hostname as well. --- compose/docker-compose-fixturenet-eth.yml | 3 +-- config/fixturenet-eth/fixturenet-eth.env | 1 + .../cerc-fixturenet-eth-geth/Dockerfile | 2 +- .../cerc-fixturenet-eth-geth/run-el.sh | 25 +++++++++++++++++++ 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/compose/docker-compose-fixturenet-eth.yml b/compose/docker-compose-fixturenet-eth.yml index 96e3d2ba..df6ae30a 100644 --- a/compose/docker-compose-fixturenet-eth.yml +++ b/compose/docker-compose-fixturenet-eth.yml @@ -31,7 +31,7 @@ services: fixturenet-eth-geth-2: hostname: fixturenet-eth-geth-2 environment: - CERC_RUN_STATEDIFF: "true" + CERC_RUN_STATEDIFF: "detect" CERC_STATEDIFF_DB_NODE_ID: 2 healthcheck: test: ["CMD", "nc", "-v", "localhost", "8545"] @@ -43,7 +43,6 @@ services: - ../config/fixturenet-eth/fixturenet-eth.env image: cerc/fixturenet-eth-geth:local depends_on: - - migrations - fixturenet-eth-bootnode-geth fixturenet-eth-bootnode-lighthouse: diff --git a/config/fixturenet-eth/fixturenet-eth.env b/config/fixturenet-eth/fixturenet-eth.env index 9ec6742e..10d6c94c 100644 --- a/config/fixturenet-eth/fixturenet-eth.env +++ b/config/fixturenet-eth/fixturenet-eth.env @@ -17,3 +17,4 @@ CERC_STATEDIFF_DB_PORT=5432 CERC_STATEDIFF_DB_NAME="cerc_testing" CERC_STATEDIFF_DB_USER="vdbm" CERC_STATEDIFF_DB_PASSWORD="password" +CERC_STATEDIFF_DB_GOOSE_MIN_VER=23 diff --git a/container-build/cerc-fixturenet-eth-geth/Dockerfile b/container-build/cerc-fixturenet-eth-geth/Dockerfile index 72c03039..cefe1bef 100644 --- a/container-build/cerc-fixturenet-eth-geth/Dockerfile +++ b/container-build/cerc-fixturenet-eth-geth/Dockerfile @@ -1,7 +1,7 @@ FROM skylenet/ethereum-genesis-generator@sha256:210353ce7c898686bc5092f16c61220a76d357f51eff9c451e9ad1b9ad03d4d3 AS ethgen FROM cerc/go-ethereum:local -RUN apk add --no-cache python3 python3-dev py3-pip curl wget jq build-base gettext libintl openssl bash +RUN apk add --no-cache python3 python3-dev py3-pip curl wget jq build-base gettext libintl openssl bash bind-tools postgresql-client COPY --from=ethgen /usr/local/bin/eth2-testnet-genesis /usr/local/bin/eth2-testnet-genesis COPY --from=ethgen /usr/local/bin/eth2-val-tools /usr/local/bin/eth2-val-tools diff --git a/container-build/cerc-fixturenet-eth-geth/run-el.sh b/container-build/cerc-fixturenet-eth-geth/run-el.sh index caf14070..34e74182 100755 --- a/container-build/cerc-fixturenet-eth-geth/run-el.sh +++ b/container-build/cerc-fixturenet-eth-geth/run-el.sh @@ -22,8 +22,33 @@ else echo -n "$JWT" > /opt/testnet/build/el/jwtsecret + if [ "$CERC_RUN_STATEDIFF" == "detect" ] && [ -n "$CERC_STATEDIFF_DB_HOST" ]; then + if [ -n "$(dig $CERC_STATEDIFF_DB_HOST +short)" ]; then + echo "Statediff DB at $CERC_STATEDIFF_DB_HOST" + CERC_RUN_STATEDIFF="true" + else + echo "No statediff DB available." + CERC_RUN_STATEDIFF="false" + fi + fi + STATEDIFF_OPTS="" if [ "$CERC_RUN_STATEDIFF" == "true" ]; then + ready=0 + while [ $ready -eq 0 ]; do + echo "Waiting for statediff DB..." + sleep 1 + export PGPASSWORD="$CERC_STATEDIFF_DB_PASSWORD" + result=$(psql -h "$CERC_STATEDIFF_DB_HOST" \ + -p "$CERC_STATEDIFF_DB_PORT" \ + -U "$CERC_STATEDIFF_DB_USER" \ + -d "$CERC_STATEDIFF_DB_NAME" \ + -t -c 'select max(version_id) from goose_db_version;' 2>/dev/null | awk '{ print $1 }') + if [ -n "$result" ] && [ $result -ge $CERC_STATEDIFF_DB_GOOSE_MIN_VER ]; then + echo "DB ready..." + ready=1 + fi + done STATEDIFF_OPTS="--statediff=true \ --statediff.db.host=$CERC_STATEDIFF_DB_HOST \ --statediff.db.name=$CERC_STATEDIFF_DB_NAME \ From d0903a2780bad6d9187edfc07d2c4330967e838f Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 7 Dec 2022 11:38:32 -0700 Subject: [PATCH 0137/1010] Build js builder container --- app/build_containers.py | 28 ++++++++++++----- app/data/container-image-list.txt | 1 + container-build/cerc-builder-js/Dockerfile | 36 ++++++++++++++++++++++ container-build/default-build.sh | 11 +++++++ 4 files changed, 68 insertions(+), 8 deletions(-) create mode 100644 container-build/cerc-builder-js/Dockerfile create mode 100755 container-build/default-build.sh diff --git a/app/build_containers.py b/app/build_containers.py index 3621e5da..f8edb0b3 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -21,7 +21,6 @@ # TODO: display the available list of containers; allow re-build of either all or specific containers import os -import sys from decouple import config import subprocess import click @@ -44,6 +43,9 @@ def command(ctx, include, exclude): dry_run = ctx.obj.dry_run local_stack = ctx.obj.local_stack + # TODO: check this still works in the shiv package scenario + container_build_dir = os.path.join(os.getcwd(), "container-build") + if local_stack: dev_root_path = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] print(f'Local stack dev_root_path (CERC_REPO_BASE_DIR) overridden to: {dev_root_path}') @@ -65,15 +67,25 @@ def command(ctx, include, exclude): def process_container(container): if not quiet: print(f"Building: {container}") - build_script_filename = os.path.join("container-build", container.replace("/", "-"), "build.sh") + build_dir = os.path.join(container_build_dir, container.replace("/", "-")) + build_script_filename = os.path.join(build_dir, "build.sh") if verbose: - print(f"Script: {build_script_filename}") - if not os.path.exists(build_script_filename): - print(f"Error, script: {build_script_filename} doesn't exist") - sys.exit(1) + print(f"Build script filename: {build_script_filename}") + if os.path.exists(build_script_filename): + build_command = build_script_filename + else: + if verbose: + print(f"No script file found: {build_script_filename}, using default build script") + repo_dir = container.split('/')[1] + # TODO: make this less of a hack -- should be specified in some metadata somewhere + # Check if we have a repo for this container. If not, set the context dir to the container-build subdir + repo_full_path = os.path.join(dev_root_path, repo_dir) + repo_dir_or_build_dir = repo_dir if os.path.exists(repo_full_path) else build_dir + build_command = os.path.join("container-build", "default-build.sh") + f" {container} {repo_dir_or_build_dir}" if not dry_run: - # We need to export CERC_REPO_BASE_DIR - build_result = subprocess.run(build_script_filename, shell=True, env={'CERC_REPO_BASE_DIR': dev_root_path}) + if verbose: + print(f"Executing: {build_command}") + build_result = subprocess.run(build_command, shell=True, env={'CERC_REPO_BASE_DIR': dev_root_path}) # TODO: check result in build_result.returncode print(f"Result is: {build_result}") else: diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index 47c488dc..2f7675a8 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -15,3 +15,4 @@ cerc/fixturenet-eth-lighthouse cerc/watcher-mobymask cerc/test-container cerc/eth-probe +cerc/builder-js diff --git a/container-build/cerc-builder-js/Dockerfile b/container-build/cerc-builder-js/Dockerfile new file mode 100644 index 00000000..1f020839 --- /dev/null +++ b/container-build/cerc-builder-js/Dockerfile @@ -0,0 +1,36 @@ +# Originally from: https://github.com/devcontainers/images/blob/main/src/javascript-node/.devcontainer/Dockerfile +# [Choice] Node.js version (use -bullseye variants on local arm64/Apple Silicon): 18, 16, 14, 18-bullseye, 16-bullseye, 14-bullseye, 18-buster, 16-buster, 14-buster +ARG VARIANT=16-bullseye +FROM node:${VARIANT} + +ARG USERNAME=node +ARG NPM_GLOBAL=/usr/local/share/npm-global + +# Add NPM global to PATH. +ENV PATH=${NPM_GLOBAL}/bin:${PATH} + +RUN \ + # Configure global npm install location, use group to adapt to UID/GID changes + if ! cat /etc/group | grep -e "^npm:" > /dev/null 2>&1; then groupadd -r npm; fi \ + && usermod -a -G npm ${USERNAME} \ + && umask 0002 \ + && mkdir -p ${NPM_GLOBAL} \ + && touch /usr/local/etc/npmrc \ + && chown ${USERNAME}:npm ${NPM_GLOBAL} /usr/local/etc/npmrc \ + && chmod g+s ${NPM_GLOBAL} \ + && npm config -g set prefix ${NPM_GLOBAL} \ + && su ${USERNAME} -c "npm config -g set prefix ${NPM_GLOBAL}" \ + # Install eslint + && su ${USERNAME} -c "umask 0002 && npm install -g eslint" \ + && npm cache clean --force > /dev/null 2>&1 + +# [Optional] Uncomment this section to install additional OS packages. +# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ +# && apt-get -y install --no-install-recommends + +# [Optional] Uncomment if you want to install an additional version of node using nvm +# ARG EXTRA_NODE_VERSION=10 +# RUN su node -c "source /usr/local/share/nvm/nvm.sh && nvm install ${EXTRA_NODE_VERSION}" + +# [Optional] Uncomment if you want to install more global node modules +# RUN su node -c "npm install -g " \ No newline at end of file diff --git a/container-build/default-build.sh b/container-build/default-build.sh new file mode 100755 index 00000000..b369e2c9 --- /dev/null +++ b/container-build/default-build.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# Usage: default-build.sh [] +# if is not supplied, the context is the directory where the Dockerfile lives +if [[ $# -ne 2 ]]; then + echo "Illegal number of parameters" >&2 + exit 1 +fi +image_tag=$1 +build_dir=$2 +echo "Building ${image_tag} in ${build_dir}" +docker build -t ${image_tag} ${build_dir} From d6e90c2dbdc999d84f31082e2011b81591658878 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 12 Dec 2022 12:38:12 -0700 Subject: [PATCH 0138/1010] Add generic entrypoint --- container-build/cerc-builder-js/Dockerfile | 5 ++++- container-build/cerc-builder-js/entrypoint.sh | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100755 container-build/cerc-builder-js/entrypoint.sh diff --git a/container-build/cerc-builder-js/Dockerfile b/container-build/cerc-builder-js/Dockerfile index 1f020839..faea9b38 100644 --- a/container-build/cerc-builder-js/Dockerfile +++ b/container-build/cerc-builder-js/Dockerfile @@ -33,4 +33,7 @@ RUN \ # RUN su node -c "source /usr/local/share/nvm/nvm.sh && nvm install ${EXTRA_NODE_VERSION}" # [Optional] Uncomment if you want to install more global node modules -# RUN su node -c "npm install -g " \ No newline at end of file +# RUN su node -c "npm install -g " + +COPY entrypoint.sh entrypoint.sh +ENTRYPOINT ./entrypoint.sh diff --git a/container-build/cerc-builder-js/entrypoint.sh b/container-build/cerc-builder-js/entrypoint.sh new file mode 100755 index 00000000..311cb8cb --- /dev/null +++ b/container-build/cerc-builder-js/entrypoint.sh @@ -0,0 +1,2 @@ +#!/bin/sh +exec "$@" From faa6027772a60a303b1dabb012f5344586e76d25 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 12 Dec 2022 12:42:07 -0700 Subject: [PATCH 0139/1010] Fix entrypoint --- container-build/cerc-builder-js/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/container-build/cerc-builder-js/Dockerfile b/container-build/cerc-builder-js/Dockerfile index faea9b38..a6b9de51 100644 --- a/container-build/cerc-builder-js/Dockerfile +++ b/container-build/cerc-builder-js/Dockerfile @@ -36,4 +36,5 @@ RUN \ # RUN su node -c "npm install -g " COPY entrypoint.sh entrypoint.sh -ENTRYPOINT ./entrypoint.sh +ENTRYPOINT ["./entrypoint.sh"] +CMD node --version \ No newline at end of file From 46375082d6d14780d052631bbbd89150459763e7 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 12 Dec 2022 14:40:11 -0700 Subject: [PATCH 0140/1010] Support building an npm package to gitea --- app/data/repository-list.txt | 3 ++- container-build/cerc-builder-js/Dockerfile | 8 +++++-- container-build/cerc-builder-js/README.md | 11 ++++++++++ .../cerc-builder-js/build-npm-package.sh | 22 +++++++++++++++++++ 4 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 container-build/cerc-builder-js/README.md create mode 100755 container-build/cerc-builder-js/build-npm-package.sh diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index a57b00dc..a8c28e00 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -8,7 +8,8 @@ vulcanize/ipld-eth-db-validator vulcanize/ipld-eth-beacon-indexer vulcanize/ipld-eth-beacon-db cerc-io/laconicd -cerc-io/laconic-cns-cli +cerc-io/laconic-sdk +cerc-io/laconic-registry-cli cerc-io/mobymask-watcher cerc-io/watcher-ts vulcanize/assemblyscript diff --git a/container-build/cerc-builder-js/Dockerfile b/container-build/cerc-builder-js/Dockerfile index a6b9de51..e9511933 100644 --- a/container-build/cerc-builder-js/Dockerfile +++ b/container-build/cerc-builder-js/Dockerfile @@ -35,6 +35,10 @@ RUN \ # [Optional] Uncomment if you want to install more global node modules # RUN su node -c "npm install -g " -COPY entrypoint.sh entrypoint.sh +COPY build-npm-package.sh . + +COPY entrypoint.sh . ENTRYPOINT ["./entrypoint.sh"] -CMD node --version \ No newline at end of file +# Placeholder CMD : generally this will be overridden at run time like : +# docker run -it -v /home/builder/cerc/laconic-sdk:/workspace cerc/builder-js sh -c 'cd /workspace && yarn && yarn build' +CMD node --version diff --git a/container-build/cerc-builder-js/README.md b/container-build/cerc-builder-js/README.md new file mode 100644 index 00000000..aa644612 --- /dev/null +++ b/container-build/cerc-builder-js/README.md @@ -0,0 +1,11 @@ +## Building JS/TS Packages + +As a temporary measure while the necessary functionality is being added to Stack Orchestrator, +it is possible to build packages manually by invoking `docker run` , for example as follows: + +``` +docker run -it --add-host host.docker.internal:host-gateway \ + -v ${HOME}/cerc/laconic-sdk:/workspace cerc/builder-js \ + sh -c 'cd /workspace && NPM_AUTH_TOKEN=6613572a28ebebaee20ccd90064251fa8c2b94f6 \ + /build-npm-package.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 1.2.3-test' +``` \ No newline at end of file diff --git a/container-build/cerc-builder-js/build-npm-package.sh b/container-build/cerc-builder-js/build-npm-package.sh new file mode 100755 index 00000000..cc2eeb26 --- /dev/null +++ b/container-build/cerc-builder-js/build-npm-package.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# Usage: build-npm-package.sh +# Note: supply the registry auth token in NPM_AUTH_TOKEN +if [ -n "$CERC_ENABLE_SCRIPT_DEBUG" ]; then + set -x +fi +if [[ $# -ne 2 ]]; then + echo "Illegal number of parameters" >&2 + exit 1 +fi +if [[ -z "${NPM_AUTH_TOKEN}" ]]; then + echo "NPM_AUTH_TOKEN is not set" >&2 + exit 1 +fi +local_npm_registry_url=$1 +package_publish_version=$2 +npm config set @cerc-io:registry ${local_npm_registry_url} +npm config set -- ${local_npm_registry_url}:_authToken ${NPM_AUTH_TOKEN} +echo "Build and publish version ${package_publish_version}" +yarn install +yarn build +yarn publish --non-interactive --new-version ${package_publish_version} --no-git-tag-version From c85b29c2375f5f57b6355b07ffe0e2783043ffdd Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 12 Dec 2022 14:44:43 -0700 Subject: [PATCH 0141/1010] Update README.md --- container-build/cerc-builder-js/README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/container-build/cerc-builder-js/README.md b/container-build/cerc-builder-js/README.md index aa644612..ea09f21e 100644 --- a/container-build/cerc-builder-js/README.md +++ b/container-build/cerc-builder-js/README.md @@ -1,11 +1,16 @@ -## Building JS/TS Packages +## JS/TS Package Builder + +This container is designed to be used as a simple "build runner" environment for building and publishing JS/TS projects +using `yarn`. + +### Running a build As a temporary measure while the necessary functionality is being added to Stack Orchestrator, it is possible to build packages manually by invoking `docker run` , for example as follows: ``` -docker run -it --add-host host.docker.internal:host-gateway \ +$ docker run -it --add-host host.docker.internal:host-gateway \ -v ${HOME}/cerc/laconic-sdk:/workspace cerc/builder-js \ sh -c 'cd /workspace && NPM_AUTH_TOKEN=6613572a28ebebaee20ccd90064251fa8c2b94f6 \ /build-npm-package.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 1.2.3-test' -``` \ No newline at end of file +``` From 680f227967d5d32323d6bafe72ab8bb0be054c57 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 14 Dec 2022 09:23:12 -0700 Subject: [PATCH 0142/1010] Add yarn fixup script for local registry --- container-build/cerc-builder-js/README.md | 11 +++++++- .../cerc-builder-js/build-npm-package.sh | 2 +- .../yarn-local-registry-fixup.sh | 27 +++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100755 container-build/cerc-builder-js/yarn-local-registry-fixup.sh diff --git a/container-build/cerc-builder-js/README.md b/container-build/cerc-builder-js/README.md index ea09f21e..c1a93e32 100644 --- a/container-build/cerc-builder-js/README.md +++ b/container-build/cerc-builder-js/README.md @@ -12,5 +12,14 @@ it is possible to build packages manually by invoking `docker run` , for example $ docker run -it --add-host host.docker.internal:host-gateway \ -v ${HOME}/cerc/laconic-sdk:/workspace cerc/builder-js \ sh -c 'cd /workspace && NPM_AUTH_TOKEN=6613572a28ebebaee20ccd90064251fa8c2b94f6 \ - /build-npm-package.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 1.2.3-test' + /build-npm-package.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 0.1.4' +``` + +or: + +``` +$ docker run --rm -it --add-host host.docker.internal:host-gateway \ + -v ${HOME}/cerc/laconic-registry-cli:/workspace cerc/builder-js \ + sh -c 'cd /workspace && NPM_AUTH_TOKEN=6613572a28ebebaee20ccd90064251fa8c2b94f6 \ + /build-npm-package.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 0.1.4' ``` diff --git a/container-build/cerc-builder-js/build-npm-package.sh b/container-build/cerc-builder-js/build-npm-package.sh index cc2eeb26..9e5094b2 100755 --- a/container-build/cerc-builder-js/build-npm-package.sh +++ b/container-build/cerc-builder-js/build-npm-package.sh @@ -1,7 +1,7 @@ #!/bin/bash # Usage: build-npm-package.sh # Note: supply the registry auth token in NPM_AUTH_TOKEN -if [ -n "$CERC_ENABLE_SCRIPT_DEBUG" ]; then +if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi if [[ $# -ne 2 ]]; then diff --git a/container-build/cerc-builder-js/yarn-local-registry-fixup.sh b/container-build/cerc-builder-js/yarn-local-registry-fixup.sh new file mode 100755 index 00000000..b16585cf --- /dev/null +++ b/container-build/cerc-builder-js/yarn-local-registry-fixup.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# Usage: yarn-local-registry-fixup.sh +# Assumes package.json and yarn.lock are in the cwd +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi +if [[ $# -ne 1 ]]; then + echo "Illegal number of parameters" >&2 + exit 1 +fi +target_package=$1 +versioned_target_package=$(grep ${target_package} package.json | sed -e 's#[[:space:]]\{1,\}\"\('${target_package}'\)\":[[:space:]]\{1,\}\"\(.*\)\",#\1@\2#' ) +yarn_info_output=$(yarn info --json $versioned_target_package 2>/dev/null) +package_tarball=$(echo $yarn_info_output | jq -r .data.dist.tarball) +package_integrity=$(echo $yarn_info_output | jq -r .data.dist.integrity) +package_shasum=$(echo $yarn_info_output | jq -r .data.dist.shasum) +package_resolved=${package_tarball}#${package_shasum} +escaped_package_resolved=$(printf '%s\n' "$package_resolved" | sed -e 's/[\/&]/\\&/g') +escaped_target_package=$(printf '%s\n' "$target_package" | sed -e 's/[\/&]/\\&/g') +if [ -n "$CERC_SCRIPT_VERBOSE" ]; then + echo "Tarball: ${package_tarball}" + echo "Integrity: ${package_integrity}" + echo "Shasum: ${package_shasum}" + echo "Resolved: ${package_resolved}" +fi +sed -i -e '/^\"'${escaped_target_package}'.*\":$/ , /^\".*$/ s/^\([[:space:]]\{1,\}resolved \).*$/\1'\"${escaped_package_resolved}\"'/' yarn.lock +sed -i -e '/^\"'${escaped_target_package}'.*\":$/ , /^\".*$/ s/^\([[:space:]]\{1,\}integrity \).*$/\1'${package_integrity}'/' yarn.lock From d96546a3c592f312ab29139b83dca0371202c7d7 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 14 Dec 2022 09:26:18 -0700 Subject: [PATCH 0143/1010] Put script into the container --- container-build/cerc-builder-js/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/container-build/cerc-builder-js/Dockerfile b/container-build/cerc-builder-js/Dockerfile index e9511933..8eab2705 100644 --- a/container-build/cerc-builder-js/Dockerfile +++ b/container-build/cerc-builder-js/Dockerfile @@ -36,6 +36,7 @@ RUN \ # RUN su node -c "npm install -g " COPY build-npm-package.sh . +COPY yarn-local-registry-fixup.sh . COPY entrypoint.sh . ENTRYPOINT ["./entrypoint.sh"] From df0bf549a2a52bcb686b05af0728b15f1ff64aec Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Wed, 14 Dec 2022 12:59:40 -0600 Subject: [PATCH 0144/1010] Keycloak + nginx reverse proxy (#63) * Example Keycloak config. * Proxy for geth, ipld-eth-server, and lighthouse. * Add metrics. --- app/data/container-image-list.txt | 1 + app/data/pod-list.txt | 1 + compose/docker-compose-keycloak.yml | 37 + config/keycloak/import/cerc-realm.json | 2087 +++++++++++++++++++++ config/keycloak/keycloak.env | 17 + config/keycloak/nginx/keycloak_proxy.conf | 69 + container-build/cerc-keycloak/Dockerfile | 12 + container-build/cerc-keycloak/build.sh | 8 + 8 files changed, 2232 insertions(+) create mode 100644 compose/docker-compose-keycloak.yml create mode 100644 config/keycloak/import/cerc-realm.json create mode 100644 config/keycloak/keycloak.env create mode 100644 config/keycloak/nginx/keycloak_proxy.conf create mode 100644 container-build/cerc-keycloak/Dockerfile create mode 100755 container-build/cerc-keycloak/build.sh diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index 2f7675a8..ba70e6f6 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -16,3 +16,4 @@ cerc/watcher-mobymask cerc/test-container cerc/eth-probe cerc/builder-js +cerc/keycloak diff --git a/app/data/pod-list.txt b/app/data/pod-list.txt index 342e3018..a15507de 100644 --- a/app/data/pod-list.txt +++ b/app/data/pod-list.txt @@ -13,3 +13,4 @@ fixturenet-eth watcher-mobymask test eth-probe +keycloak diff --git a/compose/docker-compose-keycloak.yml b/compose/docker-compose-keycloak.yml new file mode 100644 index 00000000..294387cd --- /dev/null +++ b/compose/docker-compose-keycloak.yml @@ -0,0 +1,37 @@ +version: '3.8' + +services: + keycloak-db: + image: postgres:14-alpine + env_file: + - ../config/keycloak/keycloak.env + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "5432"] + interval: 30s + timeout: 10s + retries: 10 + start_period: 3s + ports: + - 5432 + keycloak: + image: cerc/keycloak:local + env_file: + - ../config/keycloak/keycloak.env + environment: + JAVA_OPTS_APPEND: "-Dkeycloak.migration.action=import -Dkeycloak.migration.provider=dir -Dkeycloak.migration.dir=/import -Dkeycloak.migration.strategy=IGNORE_EXISTING" + volumes: + - ../config/keycloak/import:/import + ports: + - 8080 + command: ["start"] + depends_on: + keycloak-db: + condition: service_healthy + keycloak-nginx: + image: nginx:1.23-alpine + volumes: + - ../config/keycloak/nginx:/etc/nginx/conf.d + ports: + - 80 + depends_on: + - keycloak diff --git a/config/keycloak/import/cerc-realm.json b/config/keycloak/import/cerc-realm.json new file mode 100644 index 00000000..e1e9dc97 --- /dev/null +++ b/config/keycloak/import/cerc-realm.json @@ -0,0 +1,2087 @@ +{ + "id": "cerc", + "realm": "cerc", + "notBefore": 0, + "defaultSignatureAlgorithm": "RS256", + "revokeRefreshToken": false, + "refreshTokenMaxReuse": 0, + "accessTokenLifespan": 300, + "accessTokenLifespanForImplicitFlow": 900, + "ssoSessionIdleTimeout": 1800, + "ssoSessionMaxLifespan": 36000, + "ssoSessionIdleTimeoutRememberMe": 0, + "ssoSessionMaxLifespanRememberMe": 0, + "offlineSessionIdleTimeout": 2592000, + "offlineSessionMaxLifespanEnabled": false, + "offlineSessionMaxLifespan": 5184000, + "clientSessionIdleTimeout": 0, + "clientSessionMaxLifespan": 0, + "clientOfflineSessionIdleTimeout": 0, + "clientOfflineSessionMaxLifespan": 0, + "accessCodeLifespan": 60, + "accessCodeLifespanUserAction": 300, + "accessCodeLifespanLogin": 1800, + "actionTokenGeneratedByAdminLifespan": 43200, + "actionTokenGeneratedByUserLifespan": 300, + "oauth2DeviceCodeLifespan": 600, + "oauth2DevicePollingInterval": 5, + "enabled": true, + "sslRequired": "external", + "registrationAllowed": false, + "registrationEmailAsUsername": false, + "rememberMe": false, + "verifyEmail": false, + "loginWithEmailAllowed": true, + "duplicateEmailsAllowed": false, + "resetPasswordAllowed": false, + "editUsernameAllowed": false, + "bruteForceProtected": false, + "permanentLockout": false, + "maxFailureWaitSeconds": 900, + "minimumQuickLoginWaitSeconds": 60, + "waitIncrementSeconds": 60, + "quickLoginCheckMilliSeconds": 1000, + "maxDeltaTimeSeconds": 43200, + "failureFactor": 30, + "defaultRole": { + "id": "211646ea-04a3-467e-9f25-f7539a405d03", + "name": "default-roles-cerc", + "description": "${role_default-roles}", + "composite": true, + "clientRole": false, + "containerId": "cerc" + }, + "requiredCredentials": [ + "password" + ], + "otpPolicyType": "totp", + "otpPolicyAlgorithm": "HmacSHA1", + "otpPolicyInitialCounter": 0, + "otpPolicyDigits": 6, + "otpPolicyLookAheadWindow": 1, + "otpPolicyPeriod": 30, + "otpPolicyCodeReusable": false, + "otpSupportedApplications": [ + "totpAppGoogleName", + "totpAppFreeOTPName" + ], + "webAuthnPolicyRpEntityName": "keycloak", + "webAuthnPolicySignatureAlgorithms": [ + "ES256" + ], + "webAuthnPolicyRpId": "", + "webAuthnPolicyAttestationConveyancePreference": "not specified", + "webAuthnPolicyAuthenticatorAttachment": "not specified", + "webAuthnPolicyRequireResidentKey": "not specified", + "webAuthnPolicyUserVerificationRequirement": "not specified", + "webAuthnPolicyCreateTimeout": 0, + "webAuthnPolicyAvoidSameAuthenticatorRegister": false, + "webAuthnPolicyAcceptableAaguids": [], + "webAuthnPolicyPasswordlessRpEntityName": "keycloak", + "webAuthnPolicyPasswordlessSignatureAlgorithms": [ + "ES256" + ], + "webAuthnPolicyPasswordlessRpId": "", + "webAuthnPolicyPasswordlessAttestationConveyancePreference": "not specified", + "webAuthnPolicyPasswordlessAuthenticatorAttachment": "not specified", + "webAuthnPolicyPasswordlessRequireResidentKey": "not specified", + "webAuthnPolicyPasswordlessUserVerificationRequirement": "not specified", + "webAuthnPolicyPasswordlessCreateTimeout": 0, + "webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister": false, + "webAuthnPolicyPasswordlessAcceptableAaguids": [], + "users": [ + { + "id": "70af487b-c6d8-4f51-84d2-a23e8c9df7a3", + "createdTimestamp": 1670910521308, + "username": "service-account-dashboard-client", + "enabled": true, + "totp": false, + "emailVerified": false, + "serviceAccountClientId": "dashboard-client", + "disableableCredentialTypes": [], + "requiredActions": [], + "notBefore": 0 + } + ], + "scopeMappings": [ + { + "clientScope": "offline_access", + "roles": [ + "offline_access" + ] + } + ], + "clientScopeMappings": { + "account": [ + { + "client": "account-console", + "roles": [ + "manage-account", + "view-groups" + ] + } + ] + }, + "clients": [ + { + "id": "1ff40495-e44c-4cbc-886a-87c3ca1edc9d", + "clientId": "account", + "name": "${client_account}", + "rootUrl": "${authBaseUrl}", + "baseUrl": "/realms/cerc/account/", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "secret": "**********", + "redirectUris": [ + "/realms/cerc/account/*" + ], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": false, + "publicClient": false, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": { + "post.logout.redirect.uris": "+" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "defaultClientScopes": [ + "web-origins", + "profile", + "roles", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ] + }, + { + "id": "75b3bc74-dd4d-4d0a-940c-f1a809c004a6", + "clientId": "account-console", + "name": "${client_account-console}", + "rootUrl": "${authBaseUrl}", + "baseUrl": "/realms/cerc/account/", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "redirectUris": [ + "/realms/cerc/account/*" + ], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": false, + "publicClient": true, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": { + "post.logout.redirect.uris": "+", + "pkce.code.challenge.method": "S256" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "protocolMappers": [ + { + "id": "4ec0bc59-9111-46da-a7d3-549b7aa0e398", + "name": "audience resolve", + "protocol": "openid-connect", + "protocolMapper": "oidc-audience-resolve-mapper", + "consentRequired": false, + "config": {} + } + ], + "defaultClientScopes": [ + "web-origins", + "profile", + "roles", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ] + }, + { + "id": "0dc11c0a-b159-4e48-bdf9-31a1fccd25c6", + "clientId": "admin-cli", + "name": "${client_admin-cli}", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "secret": "**********", + "redirectUris": [], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": false, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": true, + "serviceAccountsEnabled": false, + "publicClient": true, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": { + "post.logout.redirect.uris": "+" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "defaultClientScopes": [ + "web-origins", + "profile", + "roles", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ] + }, + { + "id": "c8a751e8-08be-427f-9191-3bdc0cc3e829", + "clientId": "broker", + "name": "${client_broker}", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "secret": "**********", + "redirectUris": [], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": false, + "publicClient": false, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": { + "post.logout.redirect.uris": "+" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "defaultClientScopes": [ + "web-origins", + "profile", + "roles", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ] + }, + { + "id": "2d7384c7-9301-4a57-8fb5-b42aa43b8d3f", + "clientId": "dashboard-client", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "secret": "**********", + "redirectUris": [ + "http://localhost:8180/*" + ], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": true, + "serviceAccountsEnabled": true, + "authorizationServicesEnabled": true, + "publicClient": false, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": { + "saml.assertion.signature": "false", + "saml.force.post.binding": "false", + "saml.multivalued.roles": "false", + "saml.encrypt": "false", + "post.logout.redirect.uris": "+", + "saml.server.signature": "false", + "saml.server.signature.keyinfo.ext": "false", + "exclude.session.state.from.auth.response": "false", + "saml_force_name_id_format": "false", + "saml.client.signature": "false", + "tls.client.certificate.bound.access.tokens": "false", + "saml.authnstatement": "false", + "display.on.consent.screen": "false", + "saml.onetimeuse.condition": "false" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": true, + "nodeReRegistrationTimeout": -1, + "protocolMappers": [ + { + "id": "5746e878-a248-4170-9f6e-221dad215e25", + "name": "Client ID", + "protocol": "openid-connect", + "protocolMapper": "oidc-usersessionmodel-note-mapper", + "consentRequired": false, + "config": { + "user.session.note": "clientId", + "userinfo.token.claim": "true", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "clientId", + "jsonType.label": "String" + } + }, + { + "id": "e584082b-a232-45bd-8520-bc88908642a1", + "name": "Client IP Address", + "protocol": "openid-connect", + "protocolMapper": "oidc-usersessionmodel-note-mapper", + "consentRequired": false, + "config": { + "user.session.note": "clientAddress", + "userinfo.token.claim": "true", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "clientAddress", + "jsonType.label": "String" + } + }, + { + "id": "bd9eaacb-6c5b-4bf1-bc0d-2457f7f7a767", + "name": "api-key", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "api-key", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "api-key", + "jsonType.label": "String" + } + }, + { + "id": "a10834b6-005a-4083-84e7-69ea2c08c0a8", + "name": "Client Host", + "protocol": "openid-connect", + "protocolMapper": "oidc-usersessionmodel-note-mapper", + "consentRequired": false, + "config": { + "user.session.note": "clientHost", + "userinfo.token.claim": "true", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "clientHost", + "jsonType.label": "String" + } + } + ], + "defaultClientScopes": [ + "web-origins", + "profile", + "roles", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ], + "authorizationSettings": { + "allowRemoteResourceManagement": true, + "policyEnforcementMode": "ENFORCING", + "resources": [ + { + "name": "Default Resource", + "type": "urn:dashboard-client:resources:default", + "ownerManagedAccess": false, + "attributes": {}, + "_id": "fd85dada-073c-4da0-ac3c-73a823e86e70", + "uris": [ + "/*" + ] + } + ], + "policies": [], + "scopes": [], + "decisionStrategy": "UNANIMOUS" + } + }, + { + "id": "1a91181f-823b-4cbf-9d7a-f5f097a00d73", + "clientId": "realm-management", + "name": "${client_realm-management}", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "secret": "**********", + "redirectUris": [], + "webOrigins": [], + "notBefore": 0, + "bearerOnly": true, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": false, + "publicClient": false, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": { + "post.logout.redirect.uris": "+" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "defaultClientScopes": [ + "web-origins", + "profile", + "roles", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ] + }, + { + "id": "1c10f8e8-6553-4d39-a705-8380214a01c9", + "clientId": "security-admin-console", + "name": "${client_security-admin-console}", + "rootUrl": "${authAdminUrl}", + "baseUrl": "/admin/cerc/console/", + "surrogateAuthRequired": false, + "enabled": true, + "alwaysDisplayInConsole": false, + "clientAuthenticatorType": "client-secret", + "secret": "**********", + "redirectUris": [ + "/admin/cerc/console/*" + ], + "webOrigins": [ + "+" + ], + "notBefore": 0, + "bearerOnly": false, + "consentRequired": false, + "standardFlowEnabled": true, + "implicitFlowEnabled": false, + "directAccessGrantsEnabled": false, + "serviceAccountsEnabled": false, + "publicClient": true, + "frontchannelLogout": false, + "protocol": "openid-connect", + "attributes": { + "post.logout.redirect.uris": "+", + "pkce.code.challenge.method": "S256" + }, + "authenticationFlowBindingOverrides": {}, + "fullScopeAllowed": false, + "nodeReRegistrationTimeout": 0, + "protocolMappers": [ + { + "id": "e65eaf73-6a5d-44da-a129-930481351e5e", + "name": "locale", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "locale", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "locale", + "jsonType.label": "String" + } + } + ], + "defaultClientScopes": [ + "web-origins", + "profile", + "roles", + "email" + ], + "optionalClientScopes": [ + "address", + "phone", + "offline_access", + "microprofile-jwt" + ] + } + ], + "clientScopes": [ + { + "id": "6e3c0398-187d-4515-9fad-e09225e6484c", + "name": "email", + "description": "OpenID Connect built-in scope: email", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "true", + "consent.screen.text": "${emailScopeConsentText}" + }, + "protocolMappers": [ + { + "id": "7e81f77f-8631-46a0-979a-7744ea451880", + "name": "email", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "email", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "email", + "jsonType.label": "String" + } + }, + { + "id": "b41d73c7-5ae4-4492-9f05-fe737bbd8a9b", + "name": "email verified", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "emailVerified", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "email_verified", + "jsonType.label": "boolean" + } + } + ] + }, + { + "id": "42c276ef-e93e-4e65-a963-b84a7b229449", + "name": "microprofile-jwt", + "description": "Microprofile - JWT built-in scope", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "false" + }, + "protocolMappers": [ + { + "id": "145a68c2-075a-417c-bafb-824c0bb02dd2", + "name": "groups", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-realm-role-mapper", + "consentRequired": false, + "config": { + "multivalued": "true", + "userinfo.token.claim": "true", + "user.attribute": "foo", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "groups", + "jsonType.label": "String" + } + }, + { + "id": "d9f7cb53-ae29-47e0-aaf8-edd40acfa5b9", + "name": "upn", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "username", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "upn", + "jsonType.label": "String" + } + } + ] + }, + { + "id": "c88a720f-8fe6-4750-81b6-b87551066905", + "name": "role_list", + "description": "SAML role list", + "protocol": "saml", + "attributes": { + "consent.screen.text": "${samlRoleListScopeConsentText}", + "display.on.consent.screen": "true" + }, + "protocolMappers": [ + { + "id": "0244f0c4-773e-40e3-a0e4-308f5b10ab78", + "name": "role list", + "protocol": "saml", + "protocolMapper": "saml-role-list-mapper", + "consentRequired": false, + "config": { + "single": "false", + "attribute.nameformat": "Basic", + "attribute.name": "Role" + } + } + ] + }, + { + "id": "ba66e4d5-12f9-4c44-921d-42d901485803", + "name": "web-origins", + "description": "OpenID Connect scope for add allowed web origins to the access token", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "false", + "display.on.consent.screen": "false", + "consent.screen.text": "" + }, + "protocolMappers": [ + { + "id": "0f2f1ccf-7292-4e49-a079-d9166ec100bb", + "name": "allowed web origins", + "protocol": "openid-connect", + "protocolMapper": "oidc-allowed-origins-mapper", + "consentRequired": false, + "config": {} + } + ] + }, + { + "id": "e73a3670-4958-43bc-b5fa-982a895bc8d4", + "name": "phone", + "description": "OpenID Connect built-in scope: phone", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "true", + "consent.screen.text": "${phoneScopeConsentText}" + }, + "protocolMappers": [ + { + "id": "bf04e15d-711a-4f66-b6f4-c35f21fcb0c8", + "name": "phone number", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "phoneNumber", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "phone_number", + "jsonType.label": "String" + } + }, + { + "id": "76493880-66bf-40d9-8f41-b14a8d400b1d", + "name": "phone number verified", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "phoneNumberVerified", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "phone_number_verified", + "jsonType.label": "boolean" + } + } + ] + }, + { + "id": "5cb4b2c4-880e-4437-b905-19a5eb471765", + "name": "profile", + "description": "OpenID Connect built-in scope: profile", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "true", + "consent.screen.text": "${profileScopeConsentText}" + }, + "protocolMappers": [ + { + "id": "f7ba27e0-141e-4389-93d2-cc6c5fb1f78a", + "name": "family name", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "lastName", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "family_name", + "jsonType.label": "String" + } + }, + { + "id": "f3c2b39e-a11b-4640-acb3-c6ce139235e5", + "name": "zoneinfo", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "zoneinfo", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "zoneinfo", + "jsonType.label": "String" + } + }, + { + "id": "bbf1c241-15c1-4d94-812a-ad4e260f77df", + "name": "picture", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "picture", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "picture", + "jsonType.label": "String" + } + }, + { + "id": "0dc161e8-f2e8-4017-b895-c24a78d38e92", + "name": "birthdate", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "birthdate", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "birthdate", + "jsonType.label": "String" + } + }, + { + "id": "86761664-57a4-47df-a891-d0d721243327", + "name": "nickname", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "nickname", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "nickname", + "jsonType.label": "String" + } + }, + { + "id": "20f086d5-a07c-4711-88aa-3396fafb2adf", + "name": "full name", + "protocol": "openid-connect", + "protocolMapper": "oidc-full-name-mapper", + "consentRequired": false, + "config": { + "id.token.claim": "true", + "access.token.claim": "true", + "userinfo.token.claim": "true" + } + }, + { + "id": "d79a8b71-9312-4658-b14b-8f3145052116", + "name": "username", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "username", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "preferred_username", + "jsonType.label": "String" + } + }, + { + "id": "ad342e65-e36a-48cc-a90a-d48aacefab01", + "name": "profile", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "profile", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "profile", + "jsonType.label": "String" + } + }, + { + "id": "6abd60fb-39b7-4063-aaee-5ff380f0a97e", + "name": "gender", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "gender", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "gender", + "jsonType.label": "String" + } + }, + { + "id": "580133fc-8e44-4e7a-a526-dcbc7d82c911", + "name": "website", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "website", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "website", + "jsonType.label": "String" + } + }, + { + "id": "4bcde3c0-41ef-45e6-a23b-aea222640399", + "name": "locale", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "locale", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "locale", + "jsonType.label": "String" + } + }, + { + "id": "1ed7844e-9002-4c7b-be3d-61f9b3c725b9", + "name": "middle name", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "middleName", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "middle_name", + "jsonType.label": "String" + } + }, + { + "id": "4c9e9ec5-f40d-4b6e-9385-f86b0d228940", + "name": "updated at", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-attribute-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "updatedAt", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "updated_at", + "jsonType.label": "String" + } + }, + { + "id": "bf10082b-d485-4cf4-bf31-f0181884e8cf", + "name": "given name", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "firstName", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "given_name", + "jsonType.label": "String" + } + } + ] + }, + { + "id": "b25abfe5-1130-4d7d-98f4-227f8b0dc4f9", + "name": "roles", + "description": "OpenID Connect scope for add user roles to the access token", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "false", + "display.on.consent.screen": "true", + "consent.screen.text": "${rolesScopeConsentText}" + }, + "protocolMappers": [ + { + "id": "84b22a06-dced-4b2f-bbc8-f818b01c73d0", + "name": "realm roles", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-realm-role-mapper", + "consentRequired": false, + "config": { + "user.attribute": "foo", + "access.token.claim": "true", + "claim.name": "realm_access.roles", + "jsonType.label": "String", + "multivalued": "true" + } + }, + { + "id": "5c6ed3cf-0840-4191-81ea-7092569f70fe", + "name": "audience resolve", + "protocol": "openid-connect", + "protocolMapper": "oidc-audience-resolve-mapper", + "consentRequired": false, + "config": {} + }, + { + "id": "dce34b2a-e58f-41b8-86ab-794edeccae40", + "name": "client roles", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-client-role-mapper", + "consentRequired": false, + "config": { + "user.attribute": "foo", + "access.token.claim": "true", + "claim.name": "resource_access.${client_id}.roles", + "jsonType.label": "String", + "multivalued": "true" + } + } + ] + }, + { + "id": "00476d55-cd2f-4f60-92dd-6f3ff634799e", + "name": "acr", + "description": "OpenID Connect scope for add acr (authentication context class reference) to the token", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "false", + "display.on.consent.screen": "false" + }, + "protocolMappers": [ + { + "id": "f0ae1247-2120-4513-b1d1-fab7cfecfbb8", + "name": "acr loa level", + "protocol": "openid-connect", + "protocolMapper": "oidc-acr-mapper", + "consentRequired": false, + "config": { + "id.token.claim": "true", + "access.token.claim": "true", + "userinfo.token.claim": "true" + } + } + ] + }, + { + "id": "3f68af4c-10e8-4351-a62d-f829b9832037", + "name": "address", + "description": "OpenID Connect built-in scope: address", + "protocol": "openid-connect", + "attributes": { + "include.in.token.scope": "true", + "display.on.consent.screen": "true", + "consent.screen.text": "${addressScopeConsentText}" + }, + "protocolMappers": [ + { + "id": "3037e6e9-e1d7-492c-a060-9b2c35c688cb", + "name": "address", + "protocol": "openid-connect", + "protocolMapper": "oidc-address-mapper", + "consentRequired": false, + "config": { + "user.attribute.formatted": "formatted", + "user.attribute.country": "country", + "user.attribute.postal_code": "postal_code", + "userinfo.token.claim": "true", + "user.attribute.street": "street", + "id.token.claim": "true", + "user.attribute.region": "region", + "access.token.claim": "true", + "user.attribute.locality": "locality" + } + } + ] + }, + { + "id": "f900704b-5e92-451e-b093-02286cc22774", + "name": "offline_access", + "description": "OpenID Connect built-in scope: offline_access", + "protocol": "openid-connect", + "attributes": { + "consent.screen.text": "${offlineAccessScopeConsentText}", + "display.on.consent.screen": "true" + } + } + ], + "defaultDefaultClientScopes": [ + "profile", + "email", + "roles", + "web-origins", + "role_list", + "acr" + ], + "defaultOptionalClientScopes": [ + "address", + "microprofile-jwt", + "phone", + "offline_access" + ], + "browserSecurityHeaders": { + "contentSecurityPolicyReportOnly": "", + "xContentTypeOptions": "nosniff", + "xRobotsTag": "none", + "xFrameOptions": "SAMEORIGIN", + "contentSecurityPolicy": "frame-src 'self'; frame-ancestors 'self'; object-src 'none';", + "xXSSProtection": "1; mode=block", + "strictTransportSecurity": "max-age=31536000; includeSubDomains" + }, + "smtpServer": {}, + "accountTheme": "custom", + "eventsEnabled": true, + "eventsExpiration": 604800, + "eventsListeners": [ + "api-key-registration-generation", + "metrics-listener", + "jboss-logging" + ], + "enabledEventTypes": [ + "SEND_RESET_PASSWORD", + "REMOVE_TOTP", + "REVOKE_GRANT", + "UPDATE_TOTP", + "LOGIN_ERROR", + "CLIENT_LOGIN", + "RESET_PASSWORD_ERROR", + "IMPERSONATE_ERROR", + "CODE_TO_TOKEN_ERROR", + "CUSTOM_REQUIRED_ACTION", + "RESTART_AUTHENTICATION", + "IMPERSONATE", + "UPDATE_PROFILE_ERROR", + "LOGIN", + "UPDATE_PASSWORD_ERROR", + "CLIENT_INITIATED_ACCOUNT_LINKING", + "TOKEN_EXCHANGE", + "LOGOUT", + "REGISTER", + "CLIENT_REGISTER", + "IDENTITY_PROVIDER_LINK_ACCOUNT", + "UPDATE_PASSWORD", + "CLIENT_DELETE", + "FEDERATED_IDENTITY_LINK_ERROR", + "IDENTITY_PROVIDER_FIRST_LOGIN", + "CLIENT_DELETE_ERROR", + "VERIFY_EMAIL", + "CLIENT_LOGIN_ERROR", + "RESTART_AUTHENTICATION_ERROR", + "EXECUTE_ACTIONS", + "REMOVE_FEDERATED_IDENTITY_ERROR", + "TOKEN_EXCHANGE_ERROR", + "PERMISSION_TOKEN", + "SEND_IDENTITY_PROVIDER_LINK_ERROR", + "EXECUTE_ACTION_TOKEN_ERROR", + "SEND_VERIFY_EMAIL", + "EXECUTE_ACTIONS_ERROR", + "REMOVE_FEDERATED_IDENTITY", + "IDENTITY_PROVIDER_POST_LOGIN", + "IDENTITY_PROVIDER_LINK_ACCOUNT_ERROR", + "UPDATE_EMAIL", + "REGISTER_ERROR", + "REVOKE_GRANT_ERROR", + "EXECUTE_ACTION_TOKEN", + "LOGOUT_ERROR", + "UPDATE_EMAIL_ERROR", + "CLIENT_UPDATE_ERROR", + "UPDATE_PROFILE", + "CLIENT_REGISTER_ERROR", + "FEDERATED_IDENTITY_LINK", + "SEND_IDENTITY_PROVIDER_LINK", + "SEND_VERIFY_EMAIL_ERROR", + "RESET_PASSWORD", + "CLIENT_INITIATED_ACCOUNT_LINKING_ERROR", + "REMOVE_TOTP_ERROR", + "VERIFY_EMAIL_ERROR", + "SEND_RESET_PASSWORD_ERROR", + "CLIENT_UPDATE", + "CUSTOM_REQUIRED_ACTION_ERROR", + "IDENTITY_PROVIDER_POST_LOGIN_ERROR", + "UPDATE_TOTP_ERROR", + "CODE_TO_TOKEN", + "IDENTITY_PROVIDER_FIRST_LOGIN_ERROR" + ], + "adminEventsEnabled": false, + "adminEventsDetailsEnabled": false, + "identityProviders": [], + "identityProviderMappers": [], + "components": { + "org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy": [ + { + "id": "e108ed9d-422a-4c84-af0e-d7ea9ddc1890", + "name": "Trusted Hosts", + "providerId": "trusted-hosts", + "subType": "anonymous", + "subComponents": {}, + "config": { + "host-sending-registration-request-must-match": [ + "true" + ], + "client-uris-must-match": [ + "true" + ] + } + }, + { + "id": "b9a4a7f7-d684-45bd-b4bf-646be1f79364", + "name": "Full Scope Disabled", + "providerId": "scope", + "subType": "anonymous", + "subComponents": {}, + "config": {} + }, + { + "id": "8df4222e-0b62-44dc-be51-f27d828f0f66", + "name": "Allowed Protocol Mapper Types", + "providerId": "allowed-protocol-mappers", + "subType": "anonymous", + "subComponents": {}, + "config": { + "allowed-protocol-mapper-types": [ + "saml-user-property-mapper", + "oidc-sha256-pairwise-sub-mapper", + "oidc-full-name-mapper", + "saml-role-list-mapper", + "oidc-usermodel-property-mapper", + "oidc-usermodel-attribute-mapper", + "saml-user-attribute-mapper", + "oidc-address-mapper" + ] + } + }, + { + "id": "59dd3e18-4dbe-4054-b012-423e8c4da909", + "name": "Max Clients Limit", + "providerId": "max-clients", + "subType": "anonymous", + "subComponents": {}, + "config": { + "max-clients": [ + "200" + ] + } + }, + { + "id": "7ce212c8-2587-4f6c-8824-705eabb7f925", + "name": "Allowed Client Scopes", + "providerId": "allowed-client-templates", + "subType": "authenticated", + "subComponents": {}, + "config": { + "allow-default-scopes": [ + "true" + ] + } + }, + { + "id": "4cbfdd25-6c33-4bad-8d88-9a1aec6c8e25", + "name": "Consent Required", + "providerId": "consent-required", + "subType": "anonymous", + "subComponents": {}, + "config": {} + }, + { + "id": "bd008843-3c81-4750-ae85-a5e4e181b877", + "name": "Allowed Protocol Mapper Types", + "providerId": "allowed-protocol-mappers", + "subType": "authenticated", + "subComponents": {}, + "config": { + "allowed-protocol-mapper-types": [ + "oidc-usermodel-property-mapper", + "saml-role-list-mapper", + "saml-user-property-mapper", + "oidc-full-name-mapper", + "oidc-address-mapper", + "oidc-sha256-pairwise-sub-mapper", + "saml-user-attribute-mapper", + "oidc-usermodel-attribute-mapper" + ] + } + }, + { + "id": "2edf8e74-e1b6-4e6d-83a3-c1123d462d14", + "name": "Allowed Client Scopes", + "providerId": "allowed-client-templates", + "subType": "anonymous", + "subComponents": {}, + "config": { + "allow-default-scopes": [ + "true" + ] + } + } + ], + "org.keycloak.userprofile.UserProfileProvider": [ + { + "id": "bfd8d11c-d90c-4620-802d-2b5bb04ed9d3", + "providerId": "declarative-user-profile", + "subComponents": {}, + "config": {} + } + ], + "org.keycloak.keys.KeyProvider": [ + { + "id": "ca2afd56-df5d-47ab-bea4-4416c859a338", + "name": "hmac-generated", + "providerId": "hmac-generated", + "subComponents": {}, + "config": { + "priority": [ + "100" + ], + "algorithm": [ + "HS256" + ] + } + }, + { + "id": "c72d323d-5737-4bed-bbc9-41be440e99fb", + "name": "rsa-generated", + "providerId": "rsa-generated", + "subComponents": {}, + "config": { + "priority": [ + "100" + ] + } + }, + { + "id": "f80ab6e7-1b0a-4de4-acaa-3275d3f867a2", + "name": "aes-generated", + "providerId": "aes-generated", + "subComponents": {}, + "config": { + "priority": [ + "100" + ] + } + } + ] + }, + "internationalizationEnabled": false, + "supportedLocales": [], + "authenticationFlows": [ + { + "id": "43505ad9-3c8d-4f11-9f90-55bcf19e621b", + "alias": "Handle Existing Account", + "description": "Handle what to do if there is existing account with same email/username like authenticated identity provider", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "idp-confirm-link", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticatorFlow": true, + "requirement": "REQUIRED", + "priority": 20, + "autheticatorFlow": true, + "flowAlias": "Handle Existing Account - Alternatives - 0", + "userSetupAllowed": false + } + ] + }, + { + "id": "f5a8bcf1-b58f-4fd9-a0c1-4ec3933d9d64", + "alias": "Handle Existing Account - Alternatives - 0", + "description": "Subflow of Handle Existing Account with alternative executions", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "idp-email-verification", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticatorFlow": true, + "requirement": "ALTERNATIVE", + "priority": 20, + "autheticatorFlow": true, + "flowAlias": "Verify Existing Account by Re-authentication", + "userSetupAllowed": false + } + ] + }, + { + "id": "b3f19451-b375-4341-8c23-f9a3b531ceb0", + "alias": "Verify Existing Account by Re-authentication", + "description": "Reauthentication of existing account", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "idp-username-password-form", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticatorFlow": true, + "requirement": "CONDITIONAL", + "priority": 20, + "autheticatorFlow": true, + "flowAlias": "Verify Existing Account by Re-authentication - auth-otp-form - Conditional", + "userSetupAllowed": false + } + ] + }, + { + "id": "0db81a1c-dd36-4721-89e4-19dc7e204b56", + "alias": "Verify Existing Account by Re-authentication - auth-otp-form - Conditional", + "description": "Flow to determine if the auth-otp-form authenticator should be used or not.", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "conditional-user-configured", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "auth-otp-form", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + } + ] + }, + { + "id": "e0937686-c0c4-41b2-8abd-98b5219e1953", + "alias": "browser", + "description": "browser based authentication", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "auth-cookie", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "auth-spnego", + "authenticatorFlow": false, + "requirement": "DISABLED", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "identity-provider-redirector", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 25, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticatorFlow": true, + "requirement": "ALTERNATIVE", + "priority": 30, + "autheticatorFlow": true, + "flowAlias": "forms", + "userSetupAllowed": false + } + ] + }, + { + "id": "3508fa7b-a459-44ad-b56a-af9737ed86a5", + "alias": "browser plus basic", + "description": "browser based authentication", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": false, + "authenticationExecutions": [ + { + "authenticator": "auth-cookie", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "basic-auth", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "auth-spnego", + "authenticatorFlow": false, + "requirement": "DISABLED", + "priority": 25, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "identity-provider-redirector", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 30, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticatorFlow": true, + "requirement": "ALTERNATIVE", + "priority": 31, + "autheticatorFlow": true, + "flowAlias": "browser plus basic forms", + "userSetupAllowed": false + } + ] + }, + { + "id": "79ee49ad-20f2-4967-a9bf-ddca82c1516c", + "alias": "browser plus basic forms", + "description": "Username, password, otp and other auth forms.", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": false, + "authenticationExecutions": [ + { + "authenticator": "auth-username-password-form", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticatorFlow": true, + "requirement": "CONDITIONAL", + "priority": 20, + "autheticatorFlow": true, + "flowAlias": "browser plus basic forms - auth-otp-form - Conditional", + "userSetupAllowed": false + } + ] + }, + { + "id": "802ce2dc-dd4a-45e6-837e-fecc17affe55", + "alias": "browser plus basic forms - auth-otp-form - Conditional", + "description": "Flow to determine if the auth-otp-form authenticator should be used or not.", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": false, + "authenticationExecutions": [ + { + "authenticator": "conditional-user-configured", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "auth-otp-form", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + } + ] + }, + { + "id": "0f4a4d19-db06-409b-baa8-a3c8a6f52a22", + "alias": "clients", + "description": "Base authentication for clients", + "providerId": "client-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "client-secret", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "client-jwt", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "client-secret-jwt", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 30, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "client-x509", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 40, + "autheticatorFlow": false, + "userSetupAllowed": false + } + ] + }, + { + "id": "b177d3f1-dad8-4b40-ac1d-04038f0e5a7d", + "alias": "direct grant", + "description": "OpenID Connect Resource Owner Grant", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "direct-grant-validate-username", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "direct-grant-validate-password", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticatorFlow": true, + "requirement": "CONDITIONAL", + "priority": 30, + "autheticatorFlow": true, + "flowAlias": "direct grant - direct-grant-validate-otp - Conditional", + "userSetupAllowed": false + } + ] + }, + { + "id": "788ccbc9-c3c8-468d-8d4c-d2eb04b438a5", + "alias": "direct grant - direct-grant-validate-otp - Conditional", + "description": "Flow to determine if the direct-grant-validate-otp authenticator should be used or not.", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "conditional-user-configured", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "direct-grant-validate-otp", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + } + ] + }, + { + "id": "8edd3a8f-7d9d-4029-8fd2-21a8ead2b090", + "alias": "docker auth", + "description": "Used by Docker clients to authenticate against the IDP", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "docker-http-basic-authenticator", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + } + ] + }, + { + "id": "a67bc8ee-b99a-409f-adf5-a7d4c7f27512", + "alias": "first broker login", + "description": "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticatorConfig": "review profile config", + "authenticator": "idp-review-profile", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticatorFlow": true, + "requirement": "REQUIRED", + "priority": 20, + "autheticatorFlow": true, + "flowAlias": "first broker login - Alternatives - 0", + "userSetupAllowed": false + } + ] + }, + { + "id": "ffe8dad9-6998-4358-ab2c-061cf7235d53", + "alias": "first broker login - Alternatives - 0", + "description": "Subflow of first broker login with alternative executions", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticatorConfig": "create unique user config", + "authenticator": "idp-create-user-if-unique", + "authenticatorFlow": false, + "requirement": "ALTERNATIVE", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticatorFlow": true, + "requirement": "ALTERNATIVE", + "priority": 20, + "autheticatorFlow": true, + "flowAlias": "Handle Existing Account", + "userSetupAllowed": false + } + ] + }, + { + "id": "26133bdd-6657-449d-a823-73519956b272", + "alias": "forms", + "description": "Username, password, otp and other auth forms.", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "auth-username-password-form", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticatorFlow": true, + "requirement": "CONDITIONAL", + "priority": 20, + "autheticatorFlow": true, + "flowAlias": "forms - auth-otp-form - Conditional", + "userSetupAllowed": false + } + ] + }, + { + "id": "57620e5a-f7cd-4e88-ac51-d78e91ff7868", + "alias": "forms - auth-otp-form - Conditional", + "description": "Flow to determine if the auth-otp-form authenticator should be used or not.", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "conditional-user-configured", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "auth-otp-form", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + } + ] + }, + { + "id": "cffbb5df-de0a-49ed-9136-296a877ab175", + "alias": "http challenge", + "description": "An authentication flow based on challenge-response HTTP Authentication Schemes", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "no-cookie-redirect", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "basic-auth", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "basic-auth-otp", + "authenticatorFlow": false, + "requirement": "DISABLED", + "priority": 30, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "auth-spnego", + "authenticatorFlow": false, + "requirement": "DISABLED", + "priority": 40, + "autheticatorFlow": false, + "userSetupAllowed": false + } + ] + }, + { + "id": "6ac5a9df-dacb-462c-9b12-207470e9fcbf", + "alias": "registration", + "description": "registration flow", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "registration-page-form", + "authenticatorFlow": true, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": true, + "flowAlias": "registration form", + "userSetupAllowed": false + } + ] + }, + { + "id": "27e40f78-ce1e-4ad4-9b48-88a8bf9c8d92", + "alias": "registration form", + "description": "registration form", + "providerId": "form-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "registration-user-creation", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "registration-profile-action", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 40, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "registration-password-action", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 50, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "registration-recaptcha-action", + "authenticatorFlow": false, + "requirement": "DISABLED", + "priority": 60, + "autheticatorFlow": false, + "userSetupAllowed": false + } + ] + }, + { + "id": "31340e3b-f6c7-49ce-94ac-f28213b84be6", + "alias": "reset credentials", + "description": "Reset credentials for a user if they forgot their password or something", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "reset-credentials-choose-user", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "reset-credential-email", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "reset-password", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 30, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticatorFlow": true, + "requirement": "CONDITIONAL", + "priority": 40, + "autheticatorFlow": true, + "flowAlias": "reset credentials - reset-otp - Conditional", + "userSetupAllowed": false + } + ] + }, + { + "id": "aee4a6d9-caab-463e-ad62-48aba91a4098", + "alias": "reset credentials - reset-otp - Conditional", + "description": "Flow to determine if the reset-otp authenticator should be used or not.", + "providerId": "basic-flow", + "topLevel": false, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "conditional-user-configured", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + }, + { + "authenticator": "reset-otp", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 20, + "autheticatorFlow": false, + "userSetupAllowed": false + } + ] + }, + { + "id": "4052bdf6-9b94-42a1-b199-0c14ffe67ac5", + "alias": "saml ecp", + "description": "SAML ECP Profile Authentication Flow", + "providerId": "basic-flow", + "topLevel": true, + "builtIn": true, + "authenticationExecutions": [ + { + "authenticator": "http-basic-authenticator", + "authenticatorFlow": false, + "requirement": "REQUIRED", + "priority": 10, + "autheticatorFlow": false, + "userSetupAllowed": false + } + ] + } + ], + "authenticatorConfig": [ + { + "id": "4bc95f52-8c28-449c-830b-a4ffc3340399", + "alias": "create unique user config", + "config": { + "require.password.update.after.registration": "false" + } + }, + { + "id": "367a56fc-c128-43f8-85d5-50ceae63b7aa", + "alias": "review profile config", + "config": { + "update.profile.on.first.login": "missing" + } + } + ], + "requiredActions": [ + { + "alias": "CONFIGURE_TOTP", + "name": "Configure OTP", + "providerId": "CONFIGURE_TOTP", + "enabled": true, + "defaultAction": false, + "priority": 10, + "config": {} + }, + { + "alias": "terms_and_conditions", + "name": "Terms and Conditions", + "providerId": "terms_and_conditions", + "enabled": false, + "defaultAction": false, + "priority": 20, + "config": {} + }, + { + "alias": "UPDATE_PASSWORD", + "name": "Update Password", + "providerId": "UPDATE_PASSWORD", + "enabled": true, + "defaultAction": false, + "priority": 30, + "config": {} + }, + { + "alias": "UPDATE_PROFILE", + "name": "Update Profile", + "providerId": "UPDATE_PROFILE", + "enabled": true, + "defaultAction": false, + "priority": 40, + "config": {} + }, + { + "alias": "VERIFY_EMAIL", + "name": "Verify Email", + "providerId": "VERIFY_EMAIL", + "enabled": true, + "defaultAction": false, + "priority": 50, + "config": {} + }, + { + "alias": "delete_account", + "name": "Delete Account", + "providerId": "delete_account", + "enabled": false, + "defaultAction": false, + "priority": 60, + "config": {} + }, + { + "alias": "update_user_locale", + "name": "Update User Locale", + "providerId": "update_user_locale", + "enabled": true, + "defaultAction": false, + "priority": 1000, + "config": {} + } + ], + "browserFlow": "browser plus basic", + "registrationFlow": "registration", + "directGrantFlow": "direct grant", + "resetCredentialsFlow": "reset credentials", + "clientAuthenticationFlow": "clients", + "dockerAuthenticationFlow": "docker auth", + "attributes": { + "cibaBackchannelTokenDeliveryMode": "poll", + "cibaExpiresIn": "120", + "cibaAuthRequestedUserHint": "login_hint", + "oauth2DeviceCodeLifespan": "600", + "clientOfflineSessionMaxLifespan": "0", + "oauth2DevicePollingInterval": "5", + "clientSessionIdleTimeout": "0", + "parRequestUriLifespan": "60", + "clientSessionMaxLifespan": "0", + "clientOfflineSessionIdleTimeout": "0", + "cibaInterval": "5", + "realmReusableOtpCode": "false" + }, + "keycloakVersion": "20.0.2", + "userManagedAccessAllowed": false, + "clientProfiles": { + "profiles": [] + }, + "clientPolicies": { + "policies": [] + } +} \ No newline at end of file diff --git a/config/keycloak/keycloak.env b/config/keycloak/keycloak.env new file mode 100644 index 00000000..0bc7bf15 --- /dev/null +++ b/config/keycloak/keycloak.env @@ -0,0 +1,17 @@ +POSTGRES_DB=keycloak +POSTGRES_USER=keycloak +POSTGRES_PASSWORD=keycloak +KC_DB=postgres +KC_DB_URL_HOST=keycloak-db +KC_DB_URL_DATABASE=${POSTGRES_DB} +KC_DB_USERNAME=${POSTGRES_USER} +KC_DB_PASSWORD=${POSTGRES_PASSWORD} +KC_DB_SCHEMA=public +KC_HOSTNAME=localhost +KC_HTTP_ENABLED="true" +KC_HTTP_RELATIVE_PATH="/auth" +KC_HOSTNAME_STRICT_HTTPS="false" +KEYCLOAK_ADMIN=admin +KEYCLOAK_ADMIN_PASSWORD=admin +X_API_CHECK_REALM=cerc +X_API_CHECK_CLIENT_ID="%api_key%" diff --git a/config/keycloak/nginx/keycloak_proxy.conf b/config/keycloak/nginx/keycloak_proxy.conf new file mode 100644 index 00000000..fb77ef81 --- /dev/null +++ b/config/keycloak/nginx/keycloak_proxy.conf @@ -0,0 +1,69 @@ +server { + listen 80; + listen [::]:80; + server_name localhost; + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + +### geth + location ~ ^/eth/?([^/]*)$ { + set $apiKey $1; + if ($apiKey = '') { + set $apiKey $http_X_API_KEY; + } + auth_request /auth; + proxy_buffering off; + rewrite /.*$ / break; + proxy_pass http://fixturenet-eth-geth-1:8545; + } + +### ipld-eth-server +# location ~ ^/ipld/eth/([^/]*)$ { +# set $apiKey $1; +# if ($apiKey = '') { +# set $apiKey $http_X_API_KEY; +# } +# auth_request /auth; +# proxy_buffering off; +# rewrite /.*$ / break; +# proxy_pass http://ipld-eth-server:8081; +# } +# +# location ~ ^/ipld/gql/([^/]*)$ { +# set $apiKey $1; +# if ($apiKey = '') { +# set $apiKey $http_X_API_KEY; +# } +# auth_request /auth; +# proxy_buffering off; +# rewrite /.*$ / break; +# proxy_pass http://ipld-eth-server:8082; +# } +# +### lighthouse +# location /beacon/ { +# set $apiKey $http_X_API_KEY; +# auth_request /auth; +# proxy_buffering off; +# proxy_pass http://fixturenet-eth-lighthouse-1:8001/; +# } + + location = /auth { + internal; + proxy_buffering off; + resolver 127.0.0.11 ipv6=off; + proxy_pass http://keycloak:8080/auth/realms/cerc/check?apiKey=$apiKey; + proxy_pass_request_body off; + proxy_set_header Content-Length ""; + proxy_set_header X-Original-URI $request_uri; + proxy_set_header X-Original-Remote-Addr $remote_addr; + proxy_set_header X-Original-Host $host; + } + +# location = /basic_status { +# stub_status; +# } +} diff --git a/container-build/cerc-keycloak/Dockerfile b/container-build/cerc-keycloak/Dockerfile new file mode 100644 index 00000000..038f578c --- /dev/null +++ b/container-build/cerc-keycloak/Dockerfile @@ -0,0 +1,12 @@ +FROM maven:3-eclipse-temurin-11-alpine AS builder +RUN apk add --update --no-cache git +WORKDIR /build +RUN git clone https://github.com/cerc-io/keycloak-api-key-demo.git && \ + cd keycloak-api-key-demo && \ + git checkout '60c48b5c3e562c6cf2c85cfdd8f08145b0ebac5a' && \ + mvn -f api-key-module package + +FROM quay.io/keycloak/keycloak:20.0 +COPY --from=builder /build/keycloak-api-key-demo//api-key-module/target/deploy/* /opt/keycloak/providers/ +WORKDIR /opt/keycloak/providers +RUN curl -L https://github.com/aerogear/keycloak-metrics-spi/releases/download/2.5.3/keycloak-metrics-spi-2.5.3.jar --output keycloak-metrics-spi.jar diff --git a/container-build/cerc-keycloak/build.sh b/container-build/cerc-keycloak/build.sh new file mode 100755 index 00000000..0e147a9d --- /dev/null +++ b/container-build/cerc-keycloak/build.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# +#Build cerc/keycloack + +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t cerc/keycloak:local ${SCRIPT_DIR} From 5d482658a7f8b8a14f75fee278c1d5498b52f267 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Fri, 16 Dec 2022 14:15:56 -0600 Subject: [PATCH 0145/1010] Download pre-built keycloak api-key-module-0.1.jar rather than building it. (#66) --- container-build/cerc-keycloak/Dockerfile | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/container-build/cerc-keycloak/Dockerfile b/container-build/cerc-keycloak/Dockerfile index 038f578c..0e70a0b0 100644 --- a/container-build/cerc-keycloak/Dockerfile +++ b/container-build/cerc-keycloak/Dockerfile @@ -1,12 +1,4 @@ -FROM maven:3-eclipse-temurin-11-alpine AS builder -RUN apk add --update --no-cache git -WORKDIR /build -RUN git clone https://github.com/cerc-io/keycloak-api-key-demo.git && \ - cd keycloak-api-key-demo && \ - git checkout '60c48b5c3e562c6cf2c85cfdd8f08145b0ebac5a' && \ - mvn -f api-key-module package - FROM quay.io/keycloak/keycloak:20.0 -COPY --from=builder /build/keycloak-api-key-demo//api-key-module/target/deploy/* /opt/keycloak/providers/ WORKDIR /opt/keycloak/providers RUN curl -L https://github.com/aerogear/keycloak-metrics-spi/releases/download/2.5.3/keycloak-metrics-spi-2.5.3.jar --output keycloak-metrics-spi.jar +RUN curl -L https://github.com/cerc-io/keycloak-api-key-demo/releases/download/v0.1/api-key-module-0.1.jar --output api-key-module.jar From 8a9c1fb7815afbadffcf34478708b675b692725a Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Fri, 16 Dec 2022 15:57:26 -0600 Subject: [PATCH 0146/1010] Use new repo (#68) --- app/data/repository-list.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index a8c28e00..bf9c4427 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -13,4 +13,4 @@ cerc-io/laconic-registry-cli cerc-io/mobymask-watcher cerc-io/watcher-ts vulcanize/assemblyscript -vulcanize/eth-probe +cerc-io/eth-probe From 717391d835fc7af8a9a18138c39e1a17e82b9210 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 19 Dec 2022 09:37:24 -0700 Subject: [PATCH 0147/1010] Add comments --- .../cerc-builder-js/yarn-local-registry-fixup.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/container-build/cerc-builder-js/yarn-local-registry-fixup.sh b/container-build/cerc-builder-js/yarn-local-registry-fixup.sh index b16585cf..db04c433 100755 --- a/container-build/cerc-builder-js/yarn-local-registry-fixup.sh +++ b/container-build/cerc-builder-js/yarn-local-registry-fixup.sh @@ -1,6 +1,12 @@ #!/bin/bash # Usage: yarn-local-registry-fixup.sh # Assumes package.json and yarn.lock are in the cwd +# The purpose of this script is to take a project cloned from git +# and "fixup" its yarn.lock file such that specified dependency +# will be fetched from a repository other than the one used when +# yarn.lock was generated. It updates all checksums using data +# from the "new" registry (because due to embedded timestamps etc +# the same source code re-built later will not have the same checksum). if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi @@ -10,11 +16,14 @@ if [[ $# -ne 1 ]]; then fi target_package=$1 versioned_target_package=$(grep ${target_package} package.json | sed -e 's#[[:space:]]\{1,\}\"\('${target_package}'\)\":[[:space:]]\{1,\}\"\(.*\)\",#\1@\2#' ) +# Use yarn info to get URL checksums etc from the new registry yarn_info_output=$(yarn info --json $versioned_target_package 2>/dev/null) +# Code below parses out the values we need package_tarball=$(echo $yarn_info_output | jq -r .data.dist.tarball) package_integrity=$(echo $yarn_info_output | jq -r .data.dist.integrity) package_shasum=$(echo $yarn_info_output | jq -r .data.dist.shasum) package_resolved=${package_tarball}#${package_shasum} +# Some strings need to be escaped so they work when passed to sed later escaped_package_resolved=$(printf '%s\n' "$package_resolved" | sed -e 's/[\/&]/\\&/g') escaped_target_package=$(printf '%s\n' "$target_package" | sed -e 's/[\/&]/\\&/g') if [ -n "$CERC_SCRIPT_VERBOSE" ]; then @@ -23,5 +32,6 @@ if [ -n "$CERC_SCRIPT_VERBOSE" ]; then echo "Shasum: ${package_shasum}" echo "Resolved: ${package_resolved}" fi +# Use magic sed regex to replace the values in yarn.lock sed -i -e '/^\"'${escaped_target_package}'.*\":$/ , /^\".*$/ s/^\([[:space:]]\{1,\}resolved \).*$/\1'\"${escaped_package_resolved}\"'/' yarn.lock sed -i -e '/^\"'${escaped_target_package}'.*\":$/ , /^\".*$/ s/^\([[:space:]]\{1,\}integrity \).*$/\1'${package_integrity}'/' yarn.lock From 23b12cc8f1aa04fd04f8b75a88a2625d961a0ae5 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 19 Dec 2022 09:44:51 -0700 Subject: [PATCH 0148/1010] Fix typo --- container-build/cerc-builder-js/yarn-local-registry-fixup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/container-build/cerc-builder-js/yarn-local-registry-fixup.sh b/container-build/cerc-builder-js/yarn-local-registry-fixup.sh index db04c433..13264a23 100755 --- a/container-build/cerc-builder-js/yarn-local-registry-fixup.sh +++ b/container-build/cerc-builder-js/yarn-local-registry-fixup.sh @@ -3,7 +3,7 @@ # Assumes package.json and yarn.lock are in the cwd # The purpose of this script is to take a project cloned from git # and "fixup" its yarn.lock file such that specified dependency -# will be fetched from a repository other than the one used when +# will be fetched from a registry other than the one used when # yarn.lock was generated. It updates all checksums using data # from the "new" registry (because due to embedded timestamps etc # the same source code re-built later will not have the same checksum). From efbc86bdeaa2144f012a821363159972d3db6338 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Tue, 20 Dec 2022 14:06:48 -0600 Subject: [PATCH 0149/1010] Moved repos. (#72) --- app/data/repository-list.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index bf9c4427..72d778b7 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -5,8 +5,8 @@ cerc-io/ipld-eth-server cerc-io/eth-statediff-service vulcanize/eth-statediff-fill-service vulcanize/ipld-eth-db-validator -vulcanize/ipld-eth-beacon-indexer -vulcanize/ipld-eth-beacon-db +cerc-io/ipld-eth-beacon-indexer +cerc-io/ipld-eth-beacon-db cerc-io/laconicd cerc-io/laconic-sdk cerc-io/laconic-registry-cli From 8f63328d608cbf3c45da90dce7e60c5840795451 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Tue, 20 Dec 2022 14:08:10 -0600 Subject: [PATCH 0150/1010] fixturenet-eth README (#73) * fixturenet-eth README * Fix bullets * Minor edit * Update README.md --- stacks/fixturenet-eth/README.md | 88 +++++++++++++++++++++++++++++++++ stacks/fixturenet-eth/stack.yml | 12 +++++ 2 files changed, 100 insertions(+) create mode 100644 stacks/fixturenet-eth/README.md create mode 100644 stacks/fixturenet-eth/stack.yml diff --git a/stacks/fixturenet-eth/README.md b/stacks/fixturenet-eth/README.md new file mode 100644 index 00000000..d4c37fe9 --- /dev/null +++ b/stacks/fixturenet-eth/README.md @@ -0,0 +1,88 @@ +# fixturenet-eth + +Instructions for deploying a local a geth + lighthouse blockchain "fixturenet" for development and testing purposes using laconic-stack-orchestrator (the installation of which is covered [here](https://github.com/cerc-io/stack-orchestrator#user-mode)): + +## Clone required repositories +``` +$ laconic-so setup-repositories --include cerc-io/go-ethereum +``` + +## Build the fixturenet-eth containers +``` +$ laconic-so build-containers --include cerc/go-ethereum,cerc/lighthouse,cerc/fixturenet-eth-geth,cerc/fixturenet-eth-lighthouse +``` +This should create several container in the local image registry: + +* cerc/go-ethereum +* cerc/lighthouse +* cerc/fixturenet-eth-geth +* cerc/fixturenet-eth-lighthouse + +## Deploy the stack +``` +$ laconic-so deploy-system --include fixturenet-eth up +``` + +## Check status + +``` +$ container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh +Waiting for geth to generate DAG ..................................................... DONE! +Waiting for beacon phase0 .... DONE! +Waiting for beacon altair .... DONE! +Waiting for beacon bellatrix pre-merge .... DONE! +Waiting for beacon bellatrix merge .... DONE! +``` + +## Additional pieces + +Several other containers can used with the basic `fixturenet-eth`: + +* `ipld-eth-db` (enables statediffing) +* `ipld-eth-server` (GQL and Ethereum API server, requires `ipld-eth-db`) +* `ipld-eth-beacon-db` and `ipld-eth-beacon-indexer` (for indexing Beacon chain blocks) +* `eth-probe` (captures eth1 tx gossip) +* `keycloak` (nginx proxy with keycloak auth for API authentication) + +It is not necessary to use them all at once, but a complete example follows: + +``` +# Setup +$ laconic-so setup-repositories --include cerc-io/go-ethereum,cerc-io/ipld-eth-db,cerc-io/ipld-eth-server,cerc-io/ipld-eth-beacon-db,cerc-io/ipld-eth-beacon-indexer,cerc-io/eth-probe + +# Build +$ laconic-so build-containers --include cerc/go-ethereum,cerc/lighthouse,cerc/fixturenet-eth-geth,cerc/fixturenet-eth-lighthouse,cerc/ipld-eth-db,cerc/ipld-eth-server,cerc/ipld-eth-beacon-db,cerc/ipld-eth-beacon-indexer,cerc/eth-probe,cerc/keycloak + +# Deploy +$ laconic-so deploy-system --include db,fixturenet-eth,ipld-eth-server,ipld-eth-beacon-db,ipld-eth-beacon-indexer,eth-probe,keycloak up + +# Status + +$ container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh +Waiting for geth to generate DAG.... DONE! +Waiting for beacon phase0.... DONE! +Waiting for beacon altair.... DONE! +Waiting for beacon bellatrix pre-merge.... DONE! +Waiting for beacon bellatrix merge.... DONE! + +$ docker ps -f 'name=laconic' +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +fe60af64140c cerc/ipld-eth-beacon-indexer:local "./entrypoint.sh" 4 minutes ago Up 3 minutes laconic-7ca8f4a970d7999a235e0ee27588a5ab-ipld-eth-beacon-indexer-1 +015583b318c2 cerc/eth-probe:local "/app/run.sh" 4 minutes ago Up 3 minutes laconic-7ca8f4a970d7999a235e0ee27588a5ab-eth-probe-probe-1 +180b03993b1e nginx:1.23-alpine "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 0.0.0.0:54162->80/tcp laconic-7ca8f4a970d7999a235e0ee27588a5ab-keycloak-nginx-1 +2e963e3c4b44 cerc/ipld-eth-server:local "/app/entrypoint.sh" 4 minutes ago Up 4 minutes 127.0.0.1:8081-8082->8081-8082/tcp laconic-7ca8f4a970d7999a235e0ee27588a5ab-ipld-eth-server-1 +913cefc5cecf cerc/fixturenet-eth-lighthouse:local "/opt/testnet/run.sh" 4 minutes ago Up 4 minutes (healthy) 0.0.0.0:54161->8001/tcp laconic-7ca8f4a970d7999a235e0ee27588a5ab-fixturenet-eth-lighthouse-1-1 +c0659d0204ff cerc/fixturenet-eth-lighthouse:local "/opt/testnet/run.sh" 4 minutes ago Up 3 minutes (healthy) laconic-7ca8f4a970d7999a235e0ee27588a5ab-fixturenet-eth-lighthouse-2-1 +1636ed1013a6 cerc/keycloak:local "/opt/keycloak/bin/k…" 4 minutes ago Up 4 minutes 8443/tcp, 0.0.0.0:54160->8080/tcp laconic-7ca8f4a970d7999a235e0ee27588a5ab-keycloak-1 +439b017d75c1 cerc/ipld-eth-db:local "/app/startup_script…" 4 minutes ago Up 4 minutes laconic-7ca8f4a970d7999a235e0ee27588a5ab-migrations-1 +0a2c740a8e12 cerc/eth-probe:local "/app/run.sh" 4 minutes ago Up 4 minutes (healthy) laconic-7ca8f4a970d7999a235e0ee27588a5ab-eth-probe-mq-1 +35a816e0bac1 cerc/fixturenet-eth-geth:local "/opt/testnet/run.sh" 4 minutes ago Up 4 minutes (healthy) 8546/tcp, 30303/tcp, 30303/udp, 0.0.0.0:54154->8545/tcp laconic-7ca8f4a970d7999a235e0ee27588a5ab-fixturenet-eth-geth-1-1 +6691e5988519 cerc/fixturenet-eth-geth:local "/opt/testnet/run.sh" 4 minutes ago Up 4 minutes (healthy) 8545-8546/tcp, 30303/tcp, 30303/udp laconic-7ca8f4a970d7999a235e0ee27588a5ab-fixturenet-eth-geth-2-1 +06602dc7e3d0 timescale/timescaledb:latest-pg14 "docker-entrypoint.s…" 4 minutes ago Up 4 minutes (healthy) 0.0.0.0:54153->5432/tcp laconic-7ca8f4a970d7999a235e0ee27588a5ab-eth-probe-db-1 +91d73ec45b97 cerc/ipld-eth-beacon-db:local "docker-entrypoint.s…" 4 minutes ago Up 4 minutes (healthy) 127.0.0.1:8076->5432/tcp laconic-7ca8f4a970d7999a235e0ee27588a5ab-ipld-eth-beacon-db-1 +48459978329c postgres:14-alpine "docker-entrypoint.s…" 4 minutes ago Up 4 minutes (healthy) 0.0.0.0:54152->5432/tcp laconic-7ca8f4a970d7999a235e0ee27588a5ab-keycloak-db-1 +f48169806b54 timescale/timescaledb:2.8.1-pg14 "docker-entrypoint.s…" 4 minutes ago Up 4 minutes (healthy) 127.0.0.1:8077->5432/tcp laconic-7ca8f4a970d7999a235e0ee27588a5ab-ipld-eth-db-1 +56686c4e004f cerc/fixturenet-eth-geth:local "/opt/testnet/run.sh" 4 minutes ago Up 4 minutes 8545-8546/tcp, 30303/udp, 0.0.0.0:54151->9898/tcp, 0.0.0.0:54150->30303/tcp laconic-7ca8f4a970d7999a235e0ee27588a5ab-fixturenet-eth-bootnode-geth-1 +95f073c5e956 cerc/fixturenet-eth-lighthouse:local "/opt/testnet/run.sh" 4 minutes ago Up 4 minutes laconic-7ca8f4a970d7999a235e0ee27588a5ab-fixturenet-eth-bootnode-lighthouse-1 +``` + diff --git a/stacks/fixturenet-eth/stack.yml b/stacks/fixturenet-eth/stack.yml new file mode 100644 index 00000000..0030fdd4 --- /dev/null +++ b/stacks/fixturenet-eth/stack.yml @@ -0,0 +1,12 @@ +version: "1.0" +name: fixturenet-eth +repos: + - cerc-io/go-ethereum + - cerc-io/lighthouse +containers: + - cerc/go-ethereum + - cerc/lighthouse + - cerc/fixturenet-eth-geth + - cerc/fixturenet-eth-lighthouse +pods: + - fixturenet-eth \ No newline at end of file From 543afe18088d21a8284551dd98b308b65567e53f Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 20 Dec 2022 19:10:23 -0700 Subject: [PATCH 0151/1010] Fix typo --- stacks/fixturenet-eth/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stacks/fixturenet-eth/README.md b/stacks/fixturenet-eth/README.md index d4c37fe9..e2087f82 100644 --- a/stacks/fixturenet-eth/README.md +++ b/stacks/fixturenet-eth/README.md @@ -11,7 +11,7 @@ $ laconic-so setup-repositories --include cerc-io/go-ethereum ``` $ laconic-so build-containers --include cerc/go-ethereum,cerc/lighthouse,cerc/fixturenet-eth-geth,cerc/fixturenet-eth-lighthouse ``` -This should create several container in the local image registry: +This should create several container images in the local image registry: * cerc/go-ethereum * cerc/lighthouse From d138bb1a72091c7b41b9cf77b02b7b53f7d85da1 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 20 Dec 2022 19:15:36 -0700 Subject: [PATCH 0152/1010] Add warning on user mode install --- README.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2deac75d..49a7f2f5 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,7 @@ Stack Orchestrator allows building and deployment of a Laconic stack on a single machine with minimial prerequisites. ## Setup -### User Mode -User mode runs the orchestrator from a "binary" single-file release and does not require special Python environment setup. Use this mode unless you plan to make changes to the orchestrator source code. -#### Prerequisites +### Prerequisites Stack Orchestrator is a Python3 CLI tool that runs on any OS with Python3 and Docker. Tested on: Ubuntu 20/22. Ensure that the following are already installed: @@ -30,7 +28,13 @@ Ensure that the following are already installed: # see https://docs.docker.com/compose/install/linux/#install-the-plugin-manually for further details # or to install for all users. ``` -#### Install + +### User Mode Install + +User mode runs the orchestrator from a "binary" single-file release and does not require special Python environment setup. Use this mode unless you plan to make changes to the orchestrator source code. + +*NOTE: User Mode is currently broken, use "Developer mode" described below for now.* + 1. Download the latest release from [this page](https://github.com/cerc-io/stack-orchestrator/tags), into a suitable directory (e.g. `~/bin`): ``` $ cd ~/bin @@ -56,7 +60,7 @@ Ensure that the following are already installed: deploy-system deploy a stack setup-repositories git clone the set of repositories required to build... ``` -### Developer mode +### Developer mode Install Suitable for developers either modifying or debugging the orchestrator Python code: #### Prerequisites In addition to the binary install prerequisites listed above, the following are required: From 2c2df6ebbda84eebd44d8f1727a261e0ddc92da1 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 20 Dec 2022 20:37:33 -0700 Subject: [PATCH 0153/1010] Remove extraneous repo This repo was included erroneously in the original move from old-stack-orchestrator. --- app/data/repository-list.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index 72d778b7..3da6b4f6 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -1,4 +1,3 @@ -vulcanize/ops cerc-io/ipld-eth-db cerc-io/go-ethereum cerc-io/ipld-eth-server From e7296c2ce324b037ec15924a7fee7a3f1e4faf54 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Wed, 21 Dec 2022 09:59:40 -0600 Subject: [PATCH 0154/1010] Add tx-spammer (#74) * Add tx-spammer * Update README --- app/data/container-image-list.txt | 1 + app/data/pod-list.txt | 1 + app/data/repository-list.txt | 1 + compose/docker-compose-tx-spammer.yml | 18 ++++++++ config/tx-spammer/tx-spammer.env | 2 + container-build/cerc-tx-spammer/build.sh | 3 ++ stacks/fixturenet-eth/README.md | 58 ++++++++++++++---------- 7 files changed, 60 insertions(+), 24 deletions(-) create mode 100644 compose/docker-compose-tx-spammer.yml create mode 100644 config/tx-spammer/tx-spammer.env create mode 100755 container-build/cerc-tx-spammer/build.sh diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index ba70e6f6..12db6164 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -17,3 +17,4 @@ cerc/test-container cerc/eth-probe cerc/builder-js cerc/keycloak +cerc/tx-spammer diff --git a/app/data/pod-list.txt b/app/data/pod-list.txt index a15507de..659eeb10 100644 --- a/app/data/pod-list.txt +++ b/app/data/pod-list.txt @@ -14,3 +14,4 @@ watcher-mobymask test eth-probe keycloak +tx-spammer diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index 3da6b4f6..c73ce29b 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -13,3 +13,4 @@ cerc-io/mobymask-watcher cerc-io/watcher-ts vulcanize/assemblyscript cerc-io/eth-probe +cerc-io/tx-spammer diff --git a/compose/docker-compose-tx-spammer.yml b/compose/docker-compose-tx-spammer.yml new file mode 100644 index 00000000..2d203b10 --- /dev/null +++ b/compose/docker-compose-tx-spammer.yml @@ -0,0 +1,18 @@ +version: '3.2' + +services: + tx-spammer: + restart: always + image: cerc/tx-spammer:local + env_file: + - ../config/tx-spammer/tx-spammer.env + environment: + ACCOUNTS_CSV_URL: http://fixturenet-eth-bootnode-geth:9898/accounts.csv + ETH_HTTP_PATH: http://fixturenet-eth-geth-1:8545 + LOG_LEVEL: debug + SPAMMER_COMMAND: autoSend + depends_on: + fixturenet-eth-bootnode-geth: + condition: service_started + fixturenet-eth-geth-1: + condition: service_healthy diff --git a/config/tx-spammer/tx-spammer.env b/config/tx-spammer/tx-spammer.env new file mode 100644 index 00000000..35534265 --- /dev/null +++ b/config/tx-spammer/tx-spammer.env @@ -0,0 +1,2 @@ +ETH_CALL_FREQ=1000 +ETH_SEND_FREQ=1000 diff --git a/container-build/cerc-tx-spammer/build.sh b/container-build/cerc-tx-spammer/build.sh new file mode 100755 index 00000000..b6752dd7 --- /dev/null +++ b/container-build/cerc-tx-spammer/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +# Build cerc/tx-spammer +docker build -t cerc/tx-spammer:local ${CERC_REPO_BASE_DIR}/tx-spammer diff --git a/stacks/fixturenet-eth/README.md b/stacks/fixturenet-eth/README.md index e2087f82..bf77c25c 100644 --- a/stacks/fixturenet-eth/README.md +++ b/stacks/fixturenet-eth/README.md @@ -32,6 +32,15 @@ Waiting for beacon phase0 .... DONE! Waiting for beacon altair .... DONE! Waiting for beacon bellatrix pre-merge .... DONE! Waiting for beacon bellatrix merge .... DONE! + +$ docker ps -f 'name=laconic' --format 'table {{.Names}}\t{{.Ports}}' | cut -d'-' -f3- | sort +NAMES PORTS +fixturenet-eth-bootnode-geth-1 8545-8546/tcp, 30303/udp, 0.0.0.0:55847->9898/tcp, 0.0.0.0:55848->30303/tcp +fixturenet-eth-bootnode-lighthouse-1 +fixturenet-eth-geth-1-1 8546/tcp, 30303/tcp, 30303/udp, 0.0.0.0:55851->8545/tcp +fixturenet-eth-geth-2-1 8545-8546/tcp, 30303/tcp, 30303/udp +fixturenet-eth-lighthouse-1-1 0.0.0.0:55858->8001/tcp +fixturenet-eth-lighthouse-2-1 ``` ## Additional pieces @@ -43,18 +52,19 @@ Several other containers can used with the basic `fixturenet-eth`: * `ipld-eth-beacon-db` and `ipld-eth-beacon-indexer` (for indexing Beacon chain blocks) * `eth-probe` (captures eth1 tx gossip) * `keycloak` (nginx proxy with keycloak auth for API authentication) +* `tx-spammer` (generates and sends automated transactions to the fixturenet) It is not necessary to use them all at once, but a complete example follows: ``` # Setup -$ laconic-so setup-repositories --include cerc-io/go-ethereum,cerc-io/ipld-eth-db,cerc-io/ipld-eth-server,cerc-io/ipld-eth-beacon-db,cerc-io/ipld-eth-beacon-indexer,cerc-io/eth-probe +$ laconic-so setup-repositories --include cerc-io/go-ethereum,cerc-io/ipld-eth-db,cerc-io/ipld-eth-server,cerc-io/ipld-eth-beacon-db,cerc-io/ipld-eth-beacon-indexer,cerc-io/eth-probe,cerc-io/tx-spammer # Build -$ laconic-so build-containers --include cerc/go-ethereum,cerc/lighthouse,cerc/fixturenet-eth-geth,cerc/fixturenet-eth-lighthouse,cerc/ipld-eth-db,cerc/ipld-eth-server,cerc/ipld-eth-beacon-db,cerc/ipld-eth-beacon-indexer,cerc/eth-probe,cerc/keycloak +$ laconic-so build-containers --include cerc/go-ethereum,cerc/lighthouse,cerc/fixturenet-eth-geth,cerc/fixturenet-eth-lighthouse,cerc/ipld-eth-db,cerc/ipld-eth-server,cerc/ipld-eth-beacon-db,cerc/ipld-eth-beacon-indexer,cerc/eth-probe,cerc/keycloak,cerc/tx-spammer # Deploy -$ laconic-so deploy-system --include db,fixturenet-eth,ipld-eth-server,ipld-eth-beacon-db,ipld-eth-beacon-indexer,eth-probe,keycloak up +$ laconic-so deploy-system --include db,fixturenet-eth,ipld-eth-server,ipld-eth-beacon-db,ipld-eth-beacon-indexer,eth-probe,keycloak,tx-spammer up # Status @@ -65,24 +75,24 @@ Waiting for beacon altair.... DONE! Waiting for beacon bellatrix pre-merge.... DONE! Waiting for beacon bellatrix merge.... DONE! -$ docker ps -f 'name=laconic' -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -fe60af64140c cerc/ipld-eth-beacon-indexer:local "./entrypoint.sh" 4 minutes ago Up 3 minutes laconic-7ca8f4a970d7999a235e0ee27588a5ab-ipld-eth-beacon-indexer-1 -015583b318c2 cerc/eth-probe:local "/app/run.sh" 4 minutes ago Up 3 minutes laconic-7ca8f4a970d7999a235e0ee27588a5ab-eth-probe-probe-1 -180b03993b1e nginx:1.23-alpine "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 0.0.0.0:54162->80/tcp laconic-7ca8f4a970d7999a235e0ee27588a5ab-keycloak-nginx-1 -2e963e3c4b44 cerc/ipld-eth-server:local "/app/entrypoint.sh" 4 minutes ago Up 4 minutes 127.0.0.1:8081-8082->8081-8082/tcp laconic-7ca8f4a970d7999a235e0ee27588a5ab-ipld-eth-server-1 -913cefc5cecf cerc/fixturenet-eth-lighthouse:local "/opt/testnet/run.sh" 4 minutes ago Up 4 minutes (healthy) 0.0.0.0:54161->8001/tcp laconic-7ca8f4a970d7999a235e0ee27588a5ab-fixturenet-eth-lighthouse-1-1 -c0659d0204ff cerc/fixturenet-eth-lighthouse:local "/opt/testnet/run.sh" 4 minutes ago Up 3 minutes (healthy) laconic-7ca8f4a970d7999a235e0ee27588a5ab-fixturenet-eth-lighthouse-2-1 -1636ed1013a6 cerc/keycloak:local "/opt/keycloak/bin/k…" 4 minutes ago Up 4 minutes 8443/tcp, 0.0.0.0:54160->8080/tcp laconic-7ca8f4a970d7999a235e0ee27588a5ab-keycloak-1 -439b017d75c1 cerc/ipld-eth-db:local "/app/startup_script…" 4 minutes ago Up 4 minutes laconic-7ca8f4a970d7999a235e0ee27588a5ab-migrations-1 -0a2c740a8e12 cerc/eth-probe:local "/app/run.sh" 4 minutes ago Up 4 minutes (healthy) laconic-7ca8f4a970d7999a235e0ee27588a5ab-eth-probe-mq-1 -35a816e0bac1 cerc/fixturenet-eth-geth:local "/opt/testnet/run.sh" 4 minutes ago Up 4 minutes (healthy) 8546/tcp, 30303/tcp, 30303/udp, 0.0.0.0:54154->8545/tcp laconic-7ca8f4a970d7999a235e0ee27588a5ab-fixturenet-eth-geth-1-1 -6691e5988519 cerc/fixturenet-eth-geth:local "/opt/testnet/run.sh" 4 minutes ago Up 4 minutes (healthy) 8545-8546/tcp, 30303/tcp, 30303/udp laconic-7ca8f4a970d7999a235e0ee27588a5ab-fixturenet-eth-geth-2-1 -06602dc7e3d0 timescale/timescaledb:latest-pg14 "docker-entrypoint.s…" 4 minutes ago Up 4 minutes (healthy) 0.0.0.0:54153->5432/tcp laconic-7ca8f4a970d7999a235e0ee27588a5ab-eth-probe-db-1 -91d73ec45b97 cerc/ipld-eth-beacon-db:local "docker-entrypoint.s…" 4 minutes ago Up 4 minutes (healthy) 127.0.0.1:8076->5432/tcp laconic-7ca8f4a970d7999a235e0ee27588a5ab-ipld-eth-beacon-db-1 -48459978329c postgres:14-alpine "docker-entrypoint.s…" 4 minutes ago Up 4 minutes (healthy) 0.0.0.0:54152->5432/tcp laconic-7ca8f4a970d7999a235e0ee27588a5ab-keycloak-db-1 -f48169806b54 timescale/timescaledb:2.8.1-pg14 "docker-entrypoint.s…" 4 minutes ago Up 4 minutes (healthy) 127.0.0.1:8077->5432/tcp laconic-7ca8f4a970d7999a235e0ee27588a5ab-ipld-eth-db-1 -56686c4e004f cerc/fixturenet-eth-geth:local "/opt/testnet/run.sh" 4 minutes ago Up 4 minutes 8545-8546/tcp, 30303/udp, 0.0.0.0:54151->9898/tcp, 0.0.0.0:54150->30303/tcp laconic-7ca8f4a970d7999a235e0ee27588a5ab-fixturenet-eth-bootnode-geth-1 -95f073c5e956 cerc/fixturenet-eth-lighthouse:local "/opt/testnet/run.sh" 4 minutes ago Up 4 minutes laconic-7ca8f4a970d7999a235e0ee27588a5ab-fixturenet-eth-bootnode-lighthouse-1 -``` - +$ docker ps -f 'name=laconic' --format 'table {{.Names}}\t{{.Ports}}' | cut -d'-' -f3- | sort +NAMES PORTS +eth-probe-db-1 0.0.0.0:55849->5432/tcp +eth-probe-mq-1 +eth-probe-probe-1 +fixturenet-eth-bootnode-geth-1 8545-8546/tcp, 30303/udp, 0.0.0.0:55847->9898/tcp, 0.0.0.0:55848->30303/tcp +fixturenet-eth-bootnode-lighthouse-1 +fixturenet-eth-geth-1-1 8546/tcp, 30303/tcp, 30303/udp, 0.0.0.0:55851->8545/tcp +fixturenet-eth-geth-2-1 8545-8546/tcp, 30303/tcp, 30303/udp +fixturenet-eth-lighthouse-1-1 0.0.0.0:55858->8001/tcp +fixturenet-eth-lighthouse-2-1 +ipld-eth-beacon-db-1 127.0.0.1:8076->5432/tcp +ipld-eth-beacon-indexer-1 +ipld-eth-db-1 127.0.0.1:8077->5432/tcp +ipld-eth-server-1 127.0.0.1:8081-8082->8081-8082/tcp +keycloak-1 8443/tcp, 0.0.0.0:55857->8080/tcp +keycloak-db-1 0.0.0.0:55850->5432/tcp +keycloak-nginx-1 0.0.0.0:55859->80/tcp +migrations-1 +tx-spammer-1 +``` \ No newline at end of file From a7221ddc24130b1ae554a3b7c87b287a2f64909f Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Thu, 22 Dec 2022 00:03:39 -0600 Subject: [PATCH 0155/1010] Add a local stack for ERC20 watcher (#80) * Add a healthcheck for ipld-eth-server * Update ipld-eth-server ports in mobymask watcher config * Update clique period to 5s in geth-foundry config * Add a stack for erc20 watcher * Add a demo for erc20 watcher * Upgrade watcher-ts version * Update instructions * Pass option to pull while setting up repos --- app/data/container-image-list.txt | 1 + app/data/pod-list.txt | 1 + app/deploy_system.py | 2 +- compose/docker-compose-ipld-eth-server.yml | 7 +- compose/docker-compose-watcher-erc20.yml | 49 ++++++ config/watcher-erc20/erc20-watcher.toml | 41 +++++ config/watcher-mobymask/mobymask-watcher.toml | 4 +- .../genesis-automine.json | 2 +- container-build/cerc-watcher-erc20/Dockerfile | 13 ++ container-build/cerc-watcher-erc20/build.sh | 7 + stacks/erc20/README.md | 157 ++++++++++++++++++ stacks/erc20/stack.yml | 18 ++ 12 files changed, 297 insertions(+), 5 deletions(-) create mode 100644 compose/docker-compose-watcher-erc20.yml create mode 100644 config/watcher-erc20/erc20-watcher.toml create mode 100644 container-build/cerc-watcher-erc20/Dockerfile create mode 100755 container-build/cerc-watcher-erc20/build.sh create mode 100644 stacks/erc20/README.md create mode 100644 stacks/erc20/stack.yml diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index 12db6164..19ee8da6 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -13,6 +13,7 @@ cerc/laconic-cns-cli cerc/fixturenet-eth-geth cerc/fixturenet-eth-lighthouse cerc/watcher-mobymask +cerc/watcher-erc20 cerc/test-container cerc/eth-probe cerc/builder-js diff --git a/app/data/pod-list.txt b/app/data/pod-list.txt index 659eeb10..0e02bc4c 100644 --- a/app/data/pod-list.txt +++ b/app/data/pod-list.txt @@ -11,6 +11,7 @@ laconicd fixturenet-laconicd fixturenet-eth watcher-mobymask +watcher-erc20 test eth-probe keycloak diff --git a/app/deploy_system.py b/app/deploy_system.py index b3fb618a..91232094 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -73,7 +73,7 @@ def command(ctx, include, exclude, cluster, command, services): docker = DockerClient(compose_files=compose_files, compose_project_name=cluster) services_list = list(services) or None - + if not dry_run: if command == "up": if verbose: diff --git a/compose/docker-compose-ipld-eth-server.yml b/compose/docker-compose-ipld-eth-server.yml index 21dfd2b2..ee9c8885 100644 --- a/compose/docker-compose-ipld-eth-server.yml +++ b/compose/docker-compose-ipld-eth-server.yml @@ -30,4 +30,9 @@ services: ports: - "127.0.0.1:8081:8081" - "127.0.0.1:8082:8082" - + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "8081"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s diff --git a/compose/docker-compose-watcher-erc20.yml b/compose/docker-compose-watcher-erc20.yml new file mode 100644 index 00000000..18beacb0 --- /dev/null +++ b/compose/docker-compose-watcher-erc20.yml @@ -0,0 +1,49 @@ +version: '3.2' + +services: + + watcher-db: + restart: unless-stopped + image: postgres:14-alpine + environment: + - POSTGRES_USER=vdbm + - POSTGRES_MULTIPLE_DATABASES=erc20-watcher,erc20-watcher-job-queue + - POSTGRES_EXTENSION=erc20-watcher-job-queue:pgcrypto + - POSTGRES_PASSWORD=password + volumes: + - ../config/postgresql/multiple-postgressql-databases.sh:/docker-entrypoint-initdb.d/multiple-postgressql-databases.sh + - watcher_db_data:/var/lib/postgresql/data + ports: + - "0.0.0.0:15432:5432" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "5432"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 10s + + erc20-watcher: + restart: unless-stopped + depends_on: + ipld-eth-server: + condition: service_healthy + watcher-db: + condition: service_healthy + image: cerc/watcher-erc20:local + environment: + - ETH_RPC_URL=http://go-ethereum:8545 + command: ["sh", "-c", "yarn server"] + volumes: + - ../config/watcher-erc20/erc20-watcher.toml:/app/packages/erc20-watcher/environments/local.toml + ports: + - "0.0.0.0:3001:3001" + - "0.0.0.0:9001:9001" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "3001"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s + +volumes: + watcher_db_data: diff --git a/config/watcher-erc20/erc20-watcher.toml b/config/watcher-erc20/erc20-watcher.toml new file mode 100644 index 00000000..5b8b4ce5 --- /dev/null +++ b/config/watcher-erc20/erc20-watcher.toml @@ -0,0 +1,41 @@ +[server] + host = "0.0.0.0" + port = 3001 + mode = "storage" + kind = "lazy" + +[metrics] + host = "127.0.0.1" + port = 9000 + [metrics.gql] + port = 9001 + +[database] + type = "postgres" + host = "watcher-db" + port = 5432 + database = "erc20-watcher" + username = "vdbm" + password = "password" + synchronize = true + logging = false + maxQueryExecutionTime = 100 + +[upstream] + [upstream.ethServer] + gqlApiEndpoint = "http://ipld-eth-server:8082/graphql" + rpcProviderEndpoint = "http://ipld-eth-server:8081" + + [upstream.cache] + name = "requests" + enabled = false + deleteOnStart = false + +[jobQueue] + dbConnectionString = "postgres://vdbm:password@watcher-db:5432/erc20-watcher-job-queue" + maxCompletionLagInSecs = 300 + jobDelayInMilliSecs = 100 + eventsInBatch = 50 + blockDelayInMilliSecs = 2000 + prefetchBlocksInMem = true + prefetchBlockCount = 10 diff --git a/config/watcher-mobymask/mobymask-watcher.toml b/config/watcher-mobymask/mobymask-watcher.toml index 4dba25b9..3e9b2db5 100644 --- a/config/watcher-mobymask/mobymask-watcher.toml +++ b/config/watcher-mobymask/mobymask-watcher.toml @@ -37,8 +37,8 @@ [upstream] [upstream.ethServer] - gqlApiEndpoint = "http://ipld-eth-server:8083/graphql" - rpcProviderEndpoint = "http://ipld-eth-server:8082" + gqlApiEndpoint = "http://ipld-eth-server:8082/graphql" + rpcProviderEndpoint = "http://ipld-eth-server:8081" blockDelayInMilliSecs = 60000 [upstream.cache] diff --git a/container-build/cerc-go-ethereum-foundry/genesis-automine.json b/container-build/cerc-go-ethereum-foundry/genesis-automine.json index a00a614e..6cbf7f26 100644 --- a/container-build/cerc-go-ethereum-foundry/genesis-automine.json +++ b/container-build/cerc-go-ethereum-foundry/genesis-automine.json @@ -10,7 +10,7 @@ "petersburgBlock": 0, "istanbulBlock": 0, "clique": { - "period": 2, + "period": 5, "epoch": 3000 } }, diff --git a/container-build/cerc-watcher-erc20/Dockerfile b/container-build/cerc-watcher-erc20/Dockerfile new file mode 100644 index 00000000..5ec94987 --- /dev/null +++ b/container-build/cerc-watcher-erc20/Dockerfile @@ -0,0 +1,13 @@ +FROM node:16.17.1-alpine3.16 + +RUN apk --update --no-cache add git python3 alpine-sdk + +WORKDIR /app + +COPY . . + +RUN echo "Building watcher-ts" && \ + git checkout v0.2.19 && \ + yarn && yarn build + +WORKDIR /app/packages/erc20-watcher diff --git a/container-build/cerc-watcher-erc20/build.sh b/container-build/cerc-watcher-erc20/build.sh new file mode 100755 index 00000000..b800b73d --- /dev/null +++ b/container-build/cerc-watcher-erc20/build.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# Build cerc/watcher-erc20 + +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t cerc/watcher-erc20:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/watcher-ts diff --git a/stacks/erc20/README.md b/stacks/erc20/README.md new file mode 100644 index 00000000..eec3d9f4 --- /dev/null +++ b/stacks/erc20/README.md @@ -0,0 +1,157 @@ +# ERC20 Watcher + +Instructions to deploy a local ERC20 watcher stack (core + watcher) for demonstration and testing purposes using [laconic-stack-orchestrator](../../README.md#setup) + +## Setup + +* Clone / pull required repositories: + + ```bash + $ laconic-so setup-repositories --include cerc-io/go-ethereum,cerc-io/ipld-eth-db,cerc-io/ipld-eth-server,cerc-io/watcher-ts --pull + ``` + +* Build the core and watcher container images: + + ```bash + $ laconic-so build-containers --include cerc/go-ethereum,cerc/go-ethereum-foundry,cerc/ipld-eth-db,cerc/ipld-eth-server,cerc/watcher-erc20 + ``` + + This should create the required docker images in the local image registry. + +* Deploy the stack: + + ```bash + $ laconic-so deploy-system --include db,go-ethereum-foundry,ipld-eth-server,watcher-erc20 up + ``` + +## Demo + +* Find the watcher container's id using `docker ps` and export it for later use: + + ```bash + $ export CONTAINER_ID= + ``` + +* Deploy an ERC20 token: + + ```bash + $ docker exec $CONTAINER_ID yarn token:deploy:docker + ``` + + Export the address of the deployed token to a shell variable for later use: + + ```bash + $ export TOKEN_ADDRESS= + ``` + +* Open `http://localhost:3001/graphql` (GraphQL Playground) in a browser window + +* Connect MetaMask to `http://localhost:8545` (with chain ID `99`) + +* Add the deployed token as an asset in MetaMask and check that the initial balance is zero + +* Export your MetaMask account (second account) address to a shell variable for later use: + + ```bash + $ export RECIPIENT_ADDRESS= + ``` + +* To get the primary account's address, run: + + ```bash + $ docker exec $CONTAINER_ID yarn account:docker + ``` + +* To get the current block hash at any time, run: + + ```bash + $ docker exec $CONTAINER_ID yarn block:latest:docker + ``` + +* Fire a GQL query in the playground to get the name, symbol and total supply of the deployed token: + + ```graphql + query { + name( + blockHash: "LATEST_BLOCK_HASH" + token: "TOKEN_ADDRESS" + ) { + value + proof { + data + } + } + + symbol( + blockHash: "LATEST_BLOCK_HASH" + token: "TOKEN_ADDRESS" + ) { + value + proof { + data + } + } + + totalSupply( + blockHash: "LATEST_BLOCK_HASH" + token: "TOKEN_ADDRESS" + ) { + value + proof { + data + } + } + } + ``` + +* Fire the following query to get balances for the primary and the recipient account at the latest block hash: + + ```graphql + query { + fromBalanceOf: balanceOf( + blockHash: "LATEST_BLOCK_HASH" + token: "TOKEN_ADDRESS", + # primary account having all the balance initially + owner: "PRIMARY_ADDRESS" + ) { + value + proof { + data + } + } + toBalanceOf: balanceOf( + blockHash: "LATEST_BLOCK_HASH" + token: "TOKEN_ADDRESS", + owner: "RECIPIENT_ADDRESS" + ) { + value + proof { + data + } + } + } + ``` + + * The initial balance for the primary account should be `1000000000000000000000` + * The initial balance for the recipient should be `0` + +* Transfer tokens to the recipient account: + + ```bash + $ docker exec $CONTAINER_ID yarn token:transfer:docker --token $TOKEN_ADDRESS --to $RECIPIENT_ADDRESS --amount 100 + ``` + +* Fire the above GQL query again with the latest block hash to get updated balances for the primary (`from`) and the recipient (`to`) account: + + * The balance for the primary account should be reduced by the transfer amount (`100`) + * The balance for the recipient account should be equal to the transfer amount (`100`) + +* Transfer funds between different accounts using MetaMask and use the playground to query the balance before and after the transfer. + +## Clean up + +* To stop all the services running in background run: + + ```bash + $ laconic-so deploy-system --include db,go-ethereum-foundry,ipld-eth-server,watcher-erc20 down + ``` diff --git a/stacks/erc20/stack.yml b/stacks/erc20/stack.yml new file mode 100644 index 00000000..e9b0eb6d --- /dev/null +++ b/stacks/erc20/stack.yml @@ -0,0 +1,18 @@ +version: "1.0" +name: erc20-watcher +repos: + - cerc-io/go-ethereum + - cerc-io/ipld-eth-db + - cerc-io/ipld-eth-server + - cerc-io/watcher-ts +containers: + - cerc/go-ethereum + - cerc/go-ethereum-foundry + - cerc/ipld-eth-db + - cerc/ipld-eth-server + - cerc/watcher-erc20 +pods: + - go-ethereum-foundry + - db + - ipld-eth-server + - watcher-erc20 From 27c3efabe2741d6eb908bc5986b07de75be2c4a7 Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Thu, 22 Dec 2022 13:13:59 +0530 Subject: [PATCH 0156/1010] Add a local stack for ERC721 watcher (#81) * Add a stack for erc721 watcher * Add a demo * Avoid watcher db service and volume name conflicts across watchers * Avoid host port conflicts across watchers * Avoid watcher-db port conflicts --- app/data/container-image-list.txt | 1 + app/data/pod-list.txt | 1 + compose/docker-compose-watcher-erc20.yml | 16 +- compose/docker-compose-watcher-erc721.yml | 49 ++++ config/watcher-erc20/erc20-watcher.toml | 4 +- config/watcher-erc721/erc721-watcher.toml | 56 +++++ .../cerc-watcher-erc721/Dockerfile | 13 ++ container-build/cerc-watcher-erc721/build.sh | 7 + stacks/erc721/README.md | 214 ++++++++++++++++++ stacks/erc721/stack.yml | 18 ++ 10 files changed, 369 insertions(+), 10 deletions(-) create mode 100644 compose/docker-compose-watcher-erc721.yml create mode 100644 config/watcher-erc721/erc721-watcher.toml create mode 100644 container-build/cerc-watcher-erc721/Dockerfile create mode 100755 container-build/cerc-watcher-erc721/build.sh create mode 100644 stacks/erc721/README.md create mode 100644 stacks/erc721/stack.yml diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index 19ee8da6..4c7c052b 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -14,6 +14,7 @@ cerc/fixturenet-eth-geth cerc/fixturenet-eth-lighthouse cerc/watcher-mobymask cerc/watcher-erc20 +cerc/watcher-erc721 cerc/test-container cerc/eth-probe cerc/builder-js diff --git a/app/data/pod-list.txt b/app/data/pod-list.txt index 0e02bc4c..42c46acf 100644 --- a/app/data/pod-list.txt +++ b/app/data/pod-list.txt @@ -12,6 +12,7 @@ fixturenet-laconicd fixturenet-eth watcher-mobymask watcher-erc20 +watcher-erc721 test eth-probe keycloak diff --git a/compose/docker-compose-watcher-erc20.yml b/compose/docker-compose-watcher-erc20.yml index 18beacb0..82e76120 100644 --- a/compose/docker-compose-watcher-erc20.yml +++ b/compose/docker-compose-watcher-erc20.yml @@ -2,7 +2,7 @@ version: '3.2' services: - watcher-db: + erc20-watcher-db: restart: unless-stopped image: postgres:14-alpine environment: @@ -12,9 +12,9 @@ services: - POSTGRES_PASSWORD=password volumes: - ../config/postgresql/multiple-postgressql-databases.sh:/docker-entrypoint-initdb.d/multiple-postgressql-databases.sh - - watcher_db_data:/var/lib/postgresql/data + - erc20_watcher_db_data:/var/lib/postgresql/data ports: - - "0.0.0.0:15432:5432" + - "0.0.0.0:15433:5432" healthcheck: test: ["CMD", "nc", "-v", "localhost", "5432"] interval: 20s @@ -27,7 +27,7 @@ services: depends_on: ipld-eth-server: condition: service_healthy - watcher-db: + erc20-watcher-db: condition: service_healthy image: cerc/watcher-erc20:local environment: @@ -36,14 +36,14 @@ services: volumes: - ../config/watcher-erc20/erc20-watcher.toml:/app/packages/erc20-watcher/environments/local.toml ports: - - "0.0.0.0:3001:3001" - - "0.0.0.0:9001:9001" + - "0.0.0.0:3002:3001" + - "0.0.0.0:9002:9001" healthcheck: - test: ["CMD", "nc", "-v", "localhost", "3001"] + test: ["CMD", "nc", "-v", "localhost", "3002"] interval: 20s timeout: 5s retries: 15 start_period: 5s volumes: - watcher_db_data: + erc20_watcher_db_data: diff --git a/compose/docker-compose-watcher-erc721.yml b/compose/docker-compose-watcher-erc721.yml new file mode 100644 index 00000000..cdfcdbc7 --- /dev/null +++ b/compose/docker-compose-watcher-erc721.yml @@ -0,0 +1,49 @@ +version: '3.2' + +services: + + erc721-watcher-db: + restart: unless-stopped + image: postgres:14-alpine + environment: + - POSTGRES_USER=vdbm + - POSTGRES_MULTIPLE_DATABASES=erc721-watcher,erc721-watcher-job-queue + - POSTGRES_EXTENSION=erc721-watcher-job-queue:pgcrypto + - POSTGRES_PASSWORD=password + volumes: + - ../config/postgresql/multiple-postgressql-databases.sh:/docker-entrypoint-initdb.d/multiple-postgressql-databases.sh + - erc721_watcher_db_data:/var/lib/postgresql/data + ports: + - "0.0.0.0:15434:5432" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "5432"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 10s + + erc721-watcher: + restart: unless-stopped + depends_on: + ipld-eth-server: + condition: service_healthy + erc721-watcher-db: + condition: service_healthy + image: cerc/watcher-erc721:local + environment: + - ETH_RPC_URL=http://go-ethereum:8545 + command: ["sh", "-c", "yarn server"] + volumes: + - ../config/watcher-erc721/erc721-watcher.toml:/app/packages/erc721-watcher/environments/local.toml + ports: + - "0.0.0.0:3009:3009" + - "0.0.0.0:9003:9001" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "3009"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s + +volumes: + erc721_watcher_db_data: diff --git a/config/watcher-erc20/erc20-watcher.toml b/config/watcher-erc20/erc20-watcher.toml index 5b8b4ce5..20773321 100644 --- a/config/watcher-erc20/erc20-watcher.toml +++ b/config/watcher-erc20/erc20-watcher.toml @@ -12,7 +12,7 @@ [database] type = "postgres" - host = "watcher-db" + host = "erc20-watcher-db" port = 5432 database = "erc20-watcher" username = "vdbm" @@ -32,7 +32,7 @@ deleteOnStart = false [jobQueue] - dbConnectionString = "postgres://vdbm:password@watcher-db:5432/erc20-watcher-job-queue" + dbConnectionString = "postgres://vdbm:password@erc20-watcher-db:5432/erc20-watcher-job-queue" maxCompletionLagInSecs = 300 jobDelayInMilliSecs = 100 eventsInBatch = 50 diff --git a/config/watcher-erc721/erc721-watcher.toml b/config/watcher-erc721/erc721-watcher.toml new file mode 100644 index 00000000..8e877411 --- /dev/null +++ b/config/watcher-erc721/erc721-watcher.toml @@ -0,0 +1,56 @@ +[server] + host = "0.0.0.0" + port = 3009 + kind = "lazy" + + # Checkpointing state. + checkpointing = true + + # Checkpoint interval in number of blocks. + checkpointInterval = 2000 + + # Enable state creation + enableState = true + + # Boolean to filter logs by contract. + filterLogs = false + + # Max block range for which to return events in eventsInRange GQL query. + # Use -1 for skipping check on block range. + maxEventsBlockRange = 1000 + +[metrics] + host = "127.0.0.1" + port = 9000 + [metrics.gql] + port = 9001 + +[database] + type = "postgres" + host = "erc721-watcher-db" + port = 5432 + database = "erc721-watcher" + username = "vdbm" + password = "password" + synchronize = true + logging = false + maxQueryExecutionTime = 100 + +[upstream] + [upstream.ethServer] + gqlApiEndpoint = "http://ipld-eth-server:8082/graphql" + rpcProviderEndpoint = "http://ipld-eth-server:8081" + + [upstream.cache] + name = "requests" + enabled = false + deleteOnStart = false + +[jobQueue] + dbConnectionString = "postgres://vdbm:password@erc721-watcher-db:5432/erc721-watcher-job-queue" + maxCompletionLagInSecs = 300 + jobDelayInMilliSecs = 100 + eventsInBatch = 50 + blockDelayInMilliSecs = 2000 + prefetchBlocksInMem = true + prefetchBlockCount = 10 diff --git a/container-build/cerc-watcher-erc721/Dockerfile b/container-build/cerc-watcher-erc721/Dockerfile new file mode 100644 index 00000000..6358df9a --- /dev/null +++ b/container-build/cerc-watcher-erc721/Dockerfile @@ -0,0 +1,13 @@ +FROM node:16.17.1-alpine3.16 + +RUN apk --update --no-cache add git python3 alpine-sdk + +WORKDIR /app + +COPY . . + +RUN echo "Building watcher-ts" && \ + git checkout v0.2.19 && \ + yarn && yarn build + +WORKDIR /app/packages/erc721-watcher diff --git a/container-build/cerc-watcher-erc721/build.sh b/container-build/cerc-watcher-erc721/build.sh new file mode 100755 index 00000000..b9c9c0b8 --- /dev/null +++ b/container-build/cerc-watcher-erc721/build.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# Build cerc/watcher-erc721 + +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t cerc/watcher-erc721:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/watcher-ts diff --git a/stacks/erc721/README.md b/stacks/erc721/README.md new file mode 100644 index 00000000..ed5f9c80 --- /dev/null +++ b/stacks/erc721/README.md @@ -0,0 +1,214 @@ +# ERC721 Watcher + +Instructions to deploy a local ERC721 watcher stack (core + watcher) for demonstration and testing purposes using [laconic-stack-orchestrator](../../README.md#setup) + +## Setup + +* Clone / pull required repositories: + + ```bash + $ laconic-so setup-repositories --include cerc-io/go-ethereum,cerc-io/ipld-eth-db,cerc-io/ipld-eth-server,cerc-io/watcher-ts --pull + ``` + +* Build the core and watcher container images: + + ```bash + $ laconic-so build-containers --include cerc/go-ethereum,cerc/go-ethereum-foundry,cerc/ipld-eth-db,cerc/ipld-eth-server,cerc/watcher-erc721 + ``` + + This should create the required docker images in the local image registry. + +* Deploy the stack: + + ```bash + $ laconic-so deploy-system --include db,go-ethereum-foundry,ipld-eth-server,watcher-erc721 up + ``` + +## Demo + +* Find the watcher container's id using `docker ps` and export it for later use: + + ```bash + $ export CONTAINER_ID= + ``` + +* Deploy an ERC721 token: + + ```bash + $ docker exec $CONTAINER_ID yarn nft:deploy:docker + ``` + + Export the address of the deployed token to a shell variable for later use: + + ```bash + $ export NFT_ADDRESS= + ``` + +* Open `http://localhost:3009/graphql` (GraphQL Playground) in a browser window + +* Connect MetaMask to `http://localhost:8545` (with chain ID `99`) + +* Export your MetaMask account (second account) address to a shell variable for later use: + + ```bash + $ export RECIPIENT_ADDRESS= + ``` + +* To get the primary account's address, run: + + ```bash + $ docker exec $CONTAINER_ID yarn account:docker + ``` + + Export it to shell variable for later use: + + ```bash + $ export PRIMARY_ADDRESS= + ``` + +* To get the current block hash at any time, run: + + ```bash + $ docker exec $CONTAINER_ID yarn block:latest:docker + ``` + +* Fire the following GQL query (uses `eth_call`) in the playground: + + ```graphql + query { + name( + blockHash: "LATEST_BLOCK_HASH" + contractAddress: "NFT_ADDRESS" + ) { + value + proof { + data + } + } + + symbol( + blockHash: "LATEST_BLOCK_HASH" + contractAddress: "NFT_ADDRESS" + ) { + value + proof { + data + } + } + + balanceOf( + blockHash: "LATEST_BLOCK_HASH" + contractAddress: "NFT_ADDRESS" + owner: "PRIMARY_ADDRESS" + ) { + value + proof { + data + } + } + } + ``` + + Balance for the `PRIMARY_ADDRESS` should be `0` as the token is yet to be minted. + +* Fire the following GQL query (uses `storage` calls) in the playground: + + ```graphql + query { + _name( + blockHash: "LATEST_BLOCK_HASH" + contractAddress: "NFT_ADDRESS" + ) { + value + proof { + data + } + } + + _symbol( + blockHash: "LATEST_BLOCK_HASH" + contractAddress: "NFT_ADDRESS" + ) { + value + proof { + data + } + } + + _balances( + blockHash: "LATEST_BLOCK_HASH" + contractAddress: "NFT_ADDRESS" + key0: "PRIMARY_ADDRESS" + ) { + value + proof { + data + } + } + } + ``` + +* Mint the token: + + ```bash + $ docker exec $CONTAINER_ID yarn nft:mint:docker --nft $NFT_ADDRESS --to $PRIMARY_ADDRESS --token-id 1 + ``` + + Fire the GQL query above again with latest block hash. The balance should increase to `1`. + +* Get the latest block hash and run the following GQL query in the playground for `balanceOf` and `ownerOf` (`eth_call`): + + ```graphql + query { + fromBalanceOf: balanceOf( + blockHash: "LATEST_BLOCK_HASH" + contractAddress: "NFT_ADDRESS" + owner: "PRIMARY_ADDRESS" + ) { + value + proof { + data + } + } + + toBalanceOf: balanceOf( + blockHash: "LATEST_BLOCK_HASH" + contractAddress: "NFT_ADDRESS" + owner: "RECIPIENT_ADDRESS" + ) { + value + proof { + data + } + } + + ownerOf( + blockHash: "LATEST_BLOCK_HASH" + contractAddress: "NFT_ADDRESS" + tokenId: 1 + ) { + value + proof { + data + } + } + } + ``` + + Balance should be `1` for the `PRIMARY_ADDRESS`, `0` for the `RECIPIENT_ADDRESS` and owner value of the token should be equal to the `PRIMARY_ADDRESS`. + +* Transfer the token: + + ```bash + $ docker exec $CONTAINER_ID yarn nft:transfer:docker --nft $NFT_ADDRESS --from $PRIMARY_ADDRESS --to $RECIPIENT_ADDRESS --token-id 1 + ``` + + Fire the GQL query above again with the latest block hash. The token should be transferred to the recipient. + +## Clean up + +* To stop all the services running in background: + + ```bash + $ laconic-so deploy-system --include db,go-ethereum-foundry,ipld-eth-server,watcher-erc721 down + ``` diff --git a/stacks/erc721/stack.yml b/stacks/erc721/stack.yml new file mode 100644 index 00000000..85072d4f --- /dev/null +++ b/stacks/erc721/stack.yml @@ -0,0 +1,18 @@ +version: "1.0" +name: erc721-watcher +repos: + - cerc-io/go-ethereum + - cerc-io/ipld-eth-db + - cerc-io/ipld-eth-server + - cerc-io/watcher-ts +containers: + - cerc/go-ethereum + - cerc/go-ethereum-foundry + - cerc/ipld-eth-db + - cerc/ipld-eth-server + - cerc/watcher-erc721 +pods: + - go-ethereum-foundry + - db + - ipld-eth-server + - watcher-erc721 From d51508b01de197ec8577572ccd4d36731b95f9ce Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Thu, 22 Dec 2022 19:30:56 +0530 Subject: [PATCH 0157/1010] [WIP] Add a Uniswap v3 watcher-only stack (#82) * Add a stack for uniswap watcher with info app * Add deployment instructions * Use docker interactive option while loading the db dumps --- app/data/container-image-list.txt | 2 + app/data/pod-list.txt | 1 + app/data/repository-list.txt | 2 + compose/docker-compose-watcher-uniswap-v3.yml | 170 ++++++++++++++++++ .../postgresql/create-pg-stat-statements.sql | 1 + config/watcher-uniswap-v3/erc20-watcher.toml | 39 ++++ config/watcher-uniswap-v3/run.sh | 10 ++ .../watcher-uniswap-v3/uni-info-watcher.toml | 90 ++++++++++ config/watcher-uniswap-v3/uni-watcher.toml | 41 +++++ config/watcher-uniswap-v3/watch-contract.sh | 10 ++ .../cerc-uniswap-v3-info/Dockerfile | 13 ++ container-build/cerc-uniswap-v3-info/build.sh | 7 + .../cerc-watcher-uniswap-v3/Dockerfile | 11 ++ .../cerc-watcher-uniswap-v3/build.sh | 7 + stacks/erc20/README.md | 2 +- stacks/uniswap-v3/README.md | 83 +++++++++ stacks/uniswap-v3/stack.yml | 10 ++ 17 files changed, 498 insertions(+), 1 deletion(-) create mode 100644 compose/docker-compose-watcher-uniswap-v3.yml create mode 100644 config/postgresql/create-pg-stat-statements.sql create mode 100644 config/watcher-uniswap-v3/erc20-watcher.toml create mode 100755 config/watcher-uniswap-v3/run.sh create mode 100644 config/watcher-uniswap-v3/uni-info-watcher.toml create mode 100644 config/watcher-uniswap-v3/uni-watcher.toml create mode 100755 config/watcher-uniswap-v3/watch-contract.sh create mode 100644 container-build/cerc-uniswap-v3-info/Dockerfile create mode 100755 container-build/cerc-uniswap-v3-info/build.sh create mode 100644 container-build/cerc-watcher-uniswap-v3/Dockerfile create mode 100755 container-build/cerc-watcher-uniswap-v3/build.sh create mode 100644 stacks/uniswap-v3/README.md create mode 100644 stacks/uniswap-v3/stack.yml diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index 4c7c052b..c697fe21 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -15,6 +15,8 @@ cerc/fixturenet-eth-lighthouse cerc/watcher-mobymask cerc/watcher-erc20 cerc/watcher-erc721 +cerc/watcher-uniswap-v3 +cerc/uniswap-v3-info cerc/test-container cerc/eth-probe cerc/builder-js diff --git a/app/data/pod-list.txt b/app/data/pod-list.txt index 42c46acf..e5cadd5a 100644 --- a/app/data/pod-list.txt +++ b/app/data/pod-list.txt @@ -13,6 +13,7 @@ fixturenet-eth watcher-mobymask watcher-erc20 watcher-erc721 +watcher-uniswap-v3 test eth-probe keycloak diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index c73ce29b..cdf40b25 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -11,6 +11,8 @@ cerc-io/laconic-sdk cerc-io/laconic-registry-cli cerc-io/mobymask-watcher cerc-io/watcher-ts +vulcanize/uniswap-watcher-ts +vulcanize/uniswap-v3-info vulcanize/assemblyscript cerc-io/eth-probe cerc-io/tx-spammer diff --git a/compose/docker-compose-watcher-uniswap-v3.yml b/compose/docker-compose-watcher-uniswap-v3.yml new file mode 100644 index 00000000..b98f6a70 --- /dev/null +++ b/compose/docker-compose-watcher-uniswap-v3.yml @@ -0,0 +1,170 @@ +version: '3.2' + +services: + + uniswap-watcher-db: + restart: unless-stopped + image: postgres:14-alpine + environment: + - POSTGRES_USER=vdbm + - POSTGRES_MULTIPLE_DATABASES=erc20-watcher,uni-watcher,uni-info-watcher,erc20-watcher-job-queue,uni-watcher-job-queue,uni-info-watcher-job-queue + - POSTGRES_EXTENSION=erc20-watcher-job-queue:pgcrypto,uni-watcher-job-queue:pgcrypto,uni-info-watcher-job-queue:pgcrypto + - POSTGRES_PASSWORD=password + command: ["postgres", "-c", "shared_preload_libraries=pg_stat_statements", "-c", "pg_stat_statements.track=all", "-c", "work_mem=2GB"] + volumes: + - ../config/postgresql/multiple-postgressql-databases.sh:/docker-entrypoint-initdb.d/multiple-postgressql-databases.sh + - ../config/postgresql/create-pg-stat-statements.sql:/docker-entrypoint-initdb.d/create-pg-stat-statements.sql + - uniswap_watcher_db_data:/var/lib/postgresql/data + ports: + - "0.0.0.0:15435:5432" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "5432"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 10s + shm_size: '8GB' + + erc20-watcher-server: + restart: unless-stopped + depends_on: + uniswap-watcher-db: + condition: service_healthy + image: cerc/watcher-uniswap-v3:local + working_dir: /app/packages/erc20-watcher + environment: + - DEBUG=vulcanize:* + command: ["node", "--enable-source-maps", "dist/server.js"] + volumes: + - ../config/watcher-uniswap-v3/erc20-watcher.toml:/app/packages/erc20-watcher/environments/local.toml + ports: + - "0.0.0.0:3005:3001" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "3001"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s + extra_hosts: + - "host.docker.internal:host-gateway" + + uni-watcher-job-runner: + restart: unless-stopped + depends_on: + uniswap-watcher-db: + condition: service_healthy + image: cerc/watcher-uniswap-v3:local + working_dir: /app/packages/uni-watcher + environment: + - DEBUG=vulcanize:* + command: ["sh", "-c", "./watch-contract.sh && node --enable-source-maps dist/job-runner.js"] + volumes: + - ../config/watcher-uniswap-v3/uni-watcher.toml:/app/packages/uni-watcher/environments/local.toml + - ../config/watcher-uniswap-v3/watch-contract.sh:/app/packages/uni-watcher/watch-contract.sh + ports: + - "0.0.0.0:9004:9000" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "9000"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s + extra_hosts: + - "host.docker.internal:host-gateway" + + uni-watcher-server: + restart: unless-stopped + depends_on: + uniswap-watcher-db: + condition: service_healthy + uni-watcher-job-runner: + condition: service_healthy + image: cerc/watcher-uniswap-v3:local + environment: + - UNISWAP_START_BLOCK=12369621 + - DEBUG=vulcanize:* + working_dir: /app/packages/uni-watcher + command: ["./run.sh"] + volumes: + - ../config/watcher-uniswap-v3/uni-watcher.toml:/app/packages/uni-watcher/environments/local.toml + - ../config/watcher-uniswap-v3/run.sh:/app/packages/uni-watcher/run.sh + ports: + - "0.0.0.0:3003:3003" + - "0.0.0.0:9005:9001" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "3003"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s + extra_hosts: + - "host.docker.internal:host-gateway" + + uni-info-watcher-job-runner: + restart: unless-stopped + depends_on: + uniswap-watcher-db: + condition: service_healthy + erc20-watcher-server: + condition: service_healthy + uni-watcher-server: + condition: service_healthy + image: cerc/watcher-uniswap-v3:local + working_dir: /app/packages/uni-info-watcher + environment: + - DEBUG=vulcanize:* + command: ["node", "--enable-source-maps", "dist/job-runner.js"] + volumes: + - ../config/watcher-uniswap-v3/uni-info-watcher.toml:/app/packages/uni-info-watcher/environments/local.toml + ports: + - "0.0.0.0:9006:9002" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "9002"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s + extra_hosts: + - "host.docker.internal:host-gateway" + + uni-info-watcher-server: + restart: unless-stopped + depends_on: + uniswap-watcher-db: + condition: service_healthy + erc20-watcher-server: + condition: service_healthy + uni-watcher-server: + condition: service_healthy + uni-info-watcher-job-runner: + condition: service_healthy + image: cerc/watcher-uniswap-v3:local + environment: + - UNISWAP_START_BLOCK=12369621 + working_dir: /app/packages/uni-info-watcher + command: ["./run.sh"] + volumes: + - ../config/watcher-uniswap-v3/uni-info-watcher.toml:/app/packages/uni-info-watcher/environments/local.toml + - ../config/watcher-uniswap-v3/run.sh:/app/packages/uni-info-watcher/run.sh + ports: + - "0.0.0.0:3004:3004" + - "0.0.0.0:9007:9003" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "3004"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s + extra_hosts: + - "host.docker.internal:host-gateway" + + uniswap-v3-info: + depends_on: + uni-info-watcher-server: + condition: service_healthy + image: cerc/uniswap-v3-info:local + ports: + - "0.0.0.0:3006:3000" + +volumes: + uniswap_watcher_db_data: diff --git a/config/postgresql/create-pg-stat-statements.sql b/config/postgresql/create-pg-stat-statements.sql new file mode 100644 index 00000000..d3c6679b --- /dev/null +++ b/config/postgresql/create-pg-stat-statements.sql @@ -0,0 +1 @@ +CREATE EXTENSION pg_stat_statements; diff --git a/config/watcher-uniswap-v3/erc20-watcher.toml b/config/watcher-uniswap-v3/erc20-watcher.toml new file mode 100644 index 00000000..3e258eeb --- /dev/null +++ b/config/watcher-uniswap-v3/erc20-watcher.toml @@ -0,0 +1,39 @@ +[server] + host = "0.0.0.0" + port = 3001 + mode = "eth_call" + kind = "lazy" + +[metrics] + host = "127.0.0.1" + port = 9000 + [metrics.gql] + port = 9001 + +[database] + type = "postgres" + host = "uniswap-watcher-db" + port = 5432 + database = "erc20-watcher" + username = "vdbm" + password = "password" + synchronize = true + logging = false + maxQueryExecutionTime = 100 + +[upstream] + [upstream.ethServer] + gqlApiEndpoint = "http://ipld-eth-server.example.com:8083/graphql" + rpcProviderEndpoint = "http://ipld-eth-server.example.com:8082" + + [upstream.cache] + name = "requests" + enabled = false + deleteOnStart = false + +[jobQueue] + dbConnectionString = "postgres://vdbm:password@uniswap-watcher-db:5432/erc20-watcher-job-queue" + maxCompletionLagInSecs = 300 + jobDelayInMilliSecs = 100 + eventsInBatch = 50 + blockDelayInMilliSecs = 2000 diff --git a/config/watcher-uniswap-v3/run.sh b/config/watcher-uniswap-v3/run.sh new file mode 100755 index 00000000..d8dcffb8 --- /dev/null +++ b/config/watcher-uniswap-v3/run.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +set -e +set -u + +echo "Initializing watcher..." +yarn fill --start-block $UNISWAP_START_BLOCK --end-block $((UNISWAP_START_BLOCK + 1)) + +echo "Running active server" +DEBUG=vulcanize:* exec node --enable-source-maps dist/server.js diff --git a/config/watcher-uniswap-v3/uni-info-watcher.toml b/config/watcher-uniswap-v3/uni-info-watcher.toml new file mode 100644 index 00000000..2f092845 --- /dev/null +++ b/config/watcher-uniswap-v3/uni-info-watcher.toml @@ -0,0 +1,90 @@ +[server] + host = "0.0.0.0" + port = 3004 + mode = "prod" + kind = "active" + + # Checkpointing state. + checkpointing = true + + # Checkpoint interval in number of blocks. + checkpointInterval = 50000 + + # Enable state creation + enableState = false + + # Max block range for which to return events in eventsInRange GQL query. + # Use -1 for skipping check on block range. + maxEventsBlockRange = 1000 + + # Interval in number of blocks at which to clear entities cache. + clearEntitiesCacheInterval = 1000 + + # Boolean to skip updating entity fields required in state creation and not required in the frontend. + skipStateFieldsUpdate = false + + # Boolean to load GQL query nested entity relations sequentially. + loadRelationsSequential = false + + # Max GQL API requests to process simultaneously (defaults to 1). + maxSimultaneousRequests = 1 + + # GQL cache settings + [server.gqlCache] + enabled = true + + # Max in-memory cache size (in bytes) (default 8 MB) + # maxCacheSize + + # GQL cache-control max-age settings (in seconds) + maxAge = 15 + timeTravelMaxAge = 86400 # 1 day + +[metrics] + host = "0.0.0.0" + port = 9002 + [metrics.gql] + port = 9003 + +[database] + type = "postgres" + host = "uniswap-watcher-db" + port = 5432 + database = "uni-info-watcher" + username = "vdbm" + password = "password" + synchronize = true + logging = false + maxQueryExecutionTime = 100 + + [database.extra] + # maximum number of clients the pool should contain + max = 20 + +[upstream] + [upstream.ethServer] + gqlApiEndpoint = "http://ipld-eth-server.example.com:8083/graphql" + rpcProviderEndpoint = "http://ipld-eth-server.example.com:8082" + + [upstream.cache] + name = "requests" + enabled = false + deleteOnStart = false + + [upstream.uniWatcher] + gqlEndpoint = "http://uni-watcher-server:3003/graphql" + gqlSubscriptionEndpoint = "ws://uni-watcher-server:3003/graphql" + + [upstream.tokenWatcher] + gqlEndpoint = "http://erc20-watcher-server:3001/graphql" + gqlSubscriptionEndpoint = "ws://erc20-watcher-server:3001/graphql" + +[jobQueue] + dbConnectionString = "postgres://vdbm:password@uniswap-watcher-db:5432/uni-info-watcher-job-queue" + maxCompletionLagInSecs = 300 + jobDelayInMilliSecs = 1000 + eventsInBatch = 50 + subgraphEventsOrder = true + blockDelayInMilliSecs = 2000 + prefetchBlocksInMem = true + prefetchBlockCount = 10 diff --git a/config/watcher-uniswap-v3/uni-watcher.toml b/config/watcher-uniswap-v3/uni-watcher.toml new file mode 100644 index 00000000..bc583e9b --- /dev/null +++ b/config/watcher-uniswap-v3/uni-watcher.toml @@ -0,0 +1,41 @@ +[server] + host = "0.0.0.0" + port = 3003 + kind = "active" + +[metrics] + host = "0.0.0.0" + port = 9000 + [metrics.gql] + port = 9001 + +[database] + type = "postgres" + host = "uniswap-watcher-db" + port = 5432 + database = "uni-watcher" + username = "vdbm" + password = "password" + synchronize = true + logging = false + maxQueryExecutionTime = 100 + +[upstream] + [upstream.ethServer] + gqlApiEndpoint = "http://ipld-eth-server.example.com:8083/graphql" + rpcProviderEndpoint = "http://ipld-eth-server.example.com:8082" + + [upstream.cache] + name = "requests" + enabled = false + deleteOnStart = false + +[jobQueue] + dbConnectionString = "postgres://vdbm:password@uniswap-watcher-db:5432/uni-watcher-job-queue" + maxCompletionLagInSecs = 300 + jobDelayInMilliSecs = 0 + eventsInBatch = 50 + lazyUpdateBlockProgress = true + blockDelayInMilliSecs = 2000 + prefetchBlocksInMem = true + prefetchBlockCount = 10 diff --git a/config/watcher-uniswap-v3/watch-contract.sh b/config/watcher-uniswap-v3/watch-contract.sh new file mode 100755 index 00000000..aaed7e1d --- /dev/null +++ b/config/watcher-uniswap-v3/watch-contract.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +set -e +set -u + +echo "Watching factory contract 0x1F98431c8aD98523631AE4a59f267346ea31F984" +yarn watch:contract --address 0x1F98431c8aD98523631AE4a59f267346ea31F984 --kind factory --startingBlock 12369621 --checkpoint + +echo "Watching nfpm contract 0xC36442b4a4522E871399CD717aBDD847Ab11FE88" +yarn watch:contract --address 0xC36442b4a4522E871399CD717aBDD847Ab11FE88 --kind nfpm --startingBlock 12369651 --checkpoint diff --git a/container-build/cerc-uniswap-v3-info/Dockerfile b/container-build/cerc-uniswap-v3-info/Dockerfile new file mode 100644 index 00000000..a01e2ed2 --- /dev/null +++ b/container-build/cerc-uniswap-v3-info/Dockerfile @@ -0,0 +1,13 @@ +FROM node:15.3.0-alpine3.10 + +RUN apk --update --no-cache add make git + +WORKDIR /app + +COPY . . + +RUN echo "Building uniswap-v3-info" && \ + git checkout v0.1.1 && \ + yarn + +CMD ["sh", "-c", "yarn start"] diff --git a/container-build/cerc-uniswap-v3-info/build.sh b/container-build/cerc-uniswap-v3-info/build.sh new file mode 100755 index 00000000..bda1bb5e --- /dev/null +++ b/container-build/cerc-uniswap-v3-info/build.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# Build cerc/uniswap-v3-info + +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t cerc/uniswap-v3-info:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/uniswap-v3-info diff --git a/container-build/cerc-watcher-uniswap-v3/Dockerfile b/container-build/cerc-watcher-uniswap-v3/Dockerfile new file mode 100644 index 00000000..f400755b --- /dev/null +++ b/container-build/cerc-watcher-uniswap-v3/Dockerfile @@ -0,0 +1,11 @@ +FROM node:16.17.1-alpine3.16 + +RUN apk --update --no-cache add git python3 alpine-sdk + +WORKDIR /app + +COPY . . + +RUN echo "Building uniswap-watcher-ts" && \ + git checkout v0.3.4 && \ + yarn && yarn build && yarn build:contracts diff --git a/container-build/cerc-watcher-uniswap-v3/build.sh b/container-build/cerc-watcher-uniswap-v3/build.sh new file mode 100755 index 00000000..432feb02 --- /dev/null +++ b/container-build/cerc-watcher-uniswap-v3/build.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# Build cerc/watcher-uniswap-v3 + +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t cerc/watcher-uniswap-v3:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/uniswap-watcher-ts diff --git a/stacks/erc20/README.md b/stacks/erc20/README.md index eec3d9f4..3405b703 100644 --- a/stacks/erc20/README.md +++ b/stacks/erc20/README.md @@ -44,7 +44,7 @@ Instructions to deploy a local ERC20 watcher stack (core + watcher) for demonstr $ export TOKEN_ADDRESS= ``` -* Open `http://localhost:3001/graphql` (GraphQL Playground) in a browser window +* Open `http://localhost:3002/graphql` (GraphQL Playground) in a browser window * Connect MetaMask to `http://localhost:8545` (with chain ID `99`) diff --git a/stacks/uniswap-v3/README.md b/stacks/uniswap-v3/README.md new file mode 100644 index 00000000..99f55050 --- /dev/null +++ b/stacks/uniswap-v3/README.md @@ -0,0 +1,83 @@ +# Uniswap v3 + +Instructions to deploy Uniswap v3 watcher stack (watcher + uniswap-v3-info frontend app) using [laconic-stack-orchestrator](../../README.md#setup) + +## Prerequisites + +* Access to [uniswap-watcher-ts](https://github.com/vulcanize/uniswap-watcher-ts). + +* This deployment expects core services to be running; specifically, it requires `ipld-eth-server` RPC and GQL endpoints. Update the `upstream.ethServer` endpoints in the [watcher config files](../../config/watcher-uniswap-v3) accordingly: + + ```toml + [upstream] + [upstream.ethServer] + gqlApiEndpoint = "http://ipld-eth-server.example.com:8083/graphql" + rpcProviderEndpoint = "http://ipld-eth-server.example.com:8082" + ``` + +* `uni-watcher` and `uni-info-watcher` database dumps (optional). + +## Setup + +* Clone / pull required repositories: + + ```bash + $ laconic-so setup-repositories --include vulcanize/uniswap-watcher-ts,vulcanize/uniswap-v3-info --git-ssh --pull + ``` + +* Build watcher and info app container images: + + ```bash + $ laconic-so build-containers --include cerc/watcher-uniswap-v3,cerc/uniswap-v3-info + ``` + + This should create the required docker images in the local image registry. + +## Deploy + +* (Optional) Initialize the watcher database with existing database dumps if available: + + * Start the watcher database to be initialized: + + ```bash + $ laconic-so deploy-system --include watcher-uniswap-v3 up uniswap-watcher-db + ``` + + * Find the watcher database container's id using `docker ps` and export it for further usage: + + ```bash + $ export CONTAINER_ID= + ``` + + * Load watcher database dumps: + + ```bash + # uni-watcher database + $ docker exec -i $CONTAINER_ID psql -U vdbm uni-watcher < UNI_WATCHER_DB_DUMP_FILE_PATH.sql + + # uni-info-watcher database + $ docker exec -i $CONTAINER_ID psql -U vdbm uni-info-watcher < UNI_INFO_WATCHER_DB_DUMP_FILE_PATH.sql + ``` + +* Start all the watcher and info app services: + + ```bash + $ laconic-so deploy-system --include watcher-uniswap-v3 up + ``` + +* Check that all the services are up and healthy: + + ```bash + $ docker ps + ``` + + * The `uni-info-watcher` GraphQL Playground can be accessed at `http://localhost:3004/graphql` + * The frontend app can be accessed at `http://localhost:3006` + +## Clean up + +* To stop all the services running in background: + + ```bash + $ laconic-so deploy-system --include watcher-uniswap-v3 down + ``` diff --git a/stacks/uniswap-v3/stack.yml b/stacks/uniswap-v3/stack.yml new file mode 100644 index 00000000..8eec8f87 --- /dev/null +++ b/stacks/uniswap-v3/stack.yml @@ -0,0 +1,10 @@ +version: "1.0" +name: uniswap-v3 +repos: + - vulcanize/uniswap-watcher-ts + - vulcanize/uniswap-v3-info +containers: + - cerc/watcher-uniswap-v3 + - cerc/uniswap-v3-info +pods: + - watcher-uniswap-v3 From 3b031329b4f0e80d439ac378674fcbd16117b843 Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Thu, 22 Dec 2022 19:43:13 +0530 Subject: [PATCH 0158/1010] Upgrade watcher-ts version in the mobymask stack (#83) * Upgrade watcher-ts version in mobymask setup * Change watcher db service name * Add a clean-up step --- compose/docker-compose-watcher-mobymask.yml | 16 ++++---- config/watcher-mobymask/mobymask-watcher.toml | 8 ++-- .../cerc-watcher-mobymask/Dockerfile | 23 +++-------- .../cerc-watcher-mobymask/build.sh | 5 ++- stacks/mobymask/README.md | 41 +++++++++++++------ stacks/mobymask/stack.yml | 3 +- 6 files changed, 48 insertions(+), 48 deletions(-) diff --git a/compose/docker-compose-watcher-mobymask.yml b/compose/docker-compose-watcher-mobymask.yml index 6ce410cc..f54e1454 100644 --- a/compose/docker-compose-watcher-mobymask.yml +++ b/compose/docker-compose-watcher-mobymask.yml @@ -4,7 +4,7 @@ version: '3.2' services: - watcher-db: + mobymask-watcher-db: restart: unless-stopped image: postgres:14-alpine environment: @@ -14,7 +14,7 @@ services: - POSTGRES_PASSWORD=password volumes: - ../config/postgresql/multiple-postgressql-databases.sh:/docker-entrypoint-initdb.d/multiple-postgressql-databases.sh - - watcher_db_data:/var/lib/postgresql/data + - mobymask_watcher_db_data:/var/lib/postgresql/data ports: - "0.0.0.0:15432:5432" healthcheck: @@ -27,12 +27,12 @@ services: mobymask-watcher-server: restart: unless-stopped depends_on: - watcher-db: + mobymask-watcher-db: condition: service_healthy image: cerc/watcher-mobymask:local command: ["sh", "-c", "yarn server"] volumes: - - ../config/watcher-mobymask/mobymask-watcher.toml:/app/watcher-ts/packages/mobymask-watcher/environments/local.toml + - ../config/watcher-mobymask/mobymask-watcher.toml:/app/packages/mobymask-watcher/environments/local.toml ports: - "0.0.0.0:3001:3001" - "0.0.0.0:9001:9001" @@ -50,18 +50,16 @@ services: depends_on: mobymask-watcher-server: condition: service_healthy - watcher-db: + mobymask-watcher-db: condition: service_healthy image: cerc/watcher-mobymask:local command: ["sh", "-c", "yarn job-runner"] volumes: - - ../config/watcher-mobymask/mobymask-watcher.toml:/app/watcher-ts/packages/mobymask-watcher/environments/local.toml + - ../config/watcher-mobymask/mobymask-watcher.toml:/app/packages/mobymask-watcher/environments/local.toml ports: - "0.0.0.0:9000:9000" extra_hosts: - "ipld-eth-server:host-gateway" volumes: - indexer_db_data: - watcher_db_data: - \ No newline at end of file + mobymask_watcher_db_data: diff --git a/config/watcher-mobymask/mobymask-watcher.toml b/config/watcher-mobymask/mobymask-watcher.toml index 3e9b2db5..dd91cf8f 100644 --- a/config/watcher-mobymask/mobymask-watcher.toml +++ b/config/watcher-mobymask/mobymask-watcher.toml @@ -27,7 +27,7 @@ [database] type = "postgres" - host = "watcher-db" + host = "mobymask-watcher-db" port = 5432 database = "mobymask-watcher" username = "vdbm" @@ -37,8 +37,8 @@ [upstream] [upstream.ethServer] - gqlApiEndpoint = "http://ipld-eth-server:8082/graphql" - rpcProviderEndpoint = "http://ipld-eth-server:8081" + gqlApiEndpoint = "http://ipld-eth-server:8083/graphql" + rpcProviderEndpoint = "http://ipld-eth-server:8082" blockDelayInMilliSecs = 60000 [upstream.cache] @@ -47,7 +47,7 @@ deleteOnStart = false [jobQueue] - dbConnectionString = "postgres://vdbm:password@watcher-db/mobymask-watcher-job-queue" + dbConnectionString = "postgres://vdbm:password@mobymask-watcher-db/mobymask-watcher-job-queue" maxCompletionLagInSecs = 300 jobDelayInMilliSecs = 100 eventsInBatch = 50 diff --git a/container-build/cerc-watcher-mobymask/Dockerfile b/container-build/cerc-watcher-mobymask/Dockerfile index b27c6f96..7994237a 100644 --- a/container-build/cerc-watcher-mobymask/Dockerfile +++ b/container-build/cerc-watcher-mobymask/Dockerfile @@ -5,23 +5,10 @@ RUN apk --update --no-cache add git python3 alpine-sdk WORKDIR /app -COPY assemblyscript assemblyscript -COPY watcher-ts watcher-ts +COPY . . -# TODO: needs branch ng-integrate-asyncify -# We use a mixture of npm and yarn below because the upstream -# project checked in an npm package-log.json file -RUN echo "Building assemblyscript" && \ - cd assemblyscript && \ - npm install && npm run build && yarn link +RUN echo "Building watcher-ts" && \ + git checkout v0.2.19 && \ + yarn && yarn build -# TODO: needs branch v0.2.13 -# The shenanigans below is due to yarn and lerna being a dumpster-fire -RUN echo "Linking watcher-ts to local assemblyscript" && \ - cd watcher-ts/packages/graph-node && yarn remove @vulcanize/assemblyscript && \ - yarn add https://github.com/vulcanize/assemblyscript.git#ng-integrate-asyncify - -RUN echo "Building watcher-tst" && \ - cd watcher-ts && yarn && yarn link "@vulcanize/assemblyscript" && yarn build - -WORKDIR /app/watcher-ts/packages/mobymask-watcher +WORKDIR /app/packages/mobymask-watcher diff --git a/container-build/cerc-watcher-mobymask/build.sh b/container-build/cerc-watcher-mobymask/build.sh index a4a97cdd..f965c770 100755 --- a/container-build/cerc-watcher-mobymask/build.sh +++ b/container-build/cerc-watcher-mobymask/build.sh @@ -4,5 +4,6 @@ # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -# TODO: add a mechanism to pass two repos into a container rather than the parent directory as below -docker build -t cerc/watcher-mobymask:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR} +docker build -t cerc/watcher-mobymask:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/watcher-ts + +# TODO: add a mechanism to pass two repos into a container rather than the parent directory diff --git a/stacks/mobymask/README.md b/stacks/mobymask/README.md index 8b197754..d048ba38 100644 --- a/stacks/mobymask/README.md +++ b/stacks/mobymask/README.md @@ -3,36 +3,51 @@ The MobyMask watcher is a Laconic Network component that provides efficient access to MobyMask contract data from Ethereum, along with evidence allowing users to verify the correctness of that data. The watcher source code is available in [this repository](https://github.com/cerc-io/watcher-ts/tree/main/packages/mobymask-watcher) and a developer-oriented Docker Compose setup for the watcher can be found [here](https://github.com/cerc-io/mobymask-watcher). The watcher can be deployed automatically using the Laconic Stack Orchestrator tool as detailed below: ## Deploy the MobyMask Watcher + The instructions below show how to deploy a MobyMask watcher using laconic-stack-orchestrator (the installation of which is covered [here](https://github.com/cerc-io/stack-orchestrator#user-mode)). This deployment expects that ipld-eth-server's endpoints are available on the local machine at http://ipld-eth-server.example.com:8083/graphql and http://ipld-eth-server.example.com:8082. More advanced configurations are supported by modifying the watcher's [config file](../../config/watcher-mobymask/mobymask-watcher.toml). + ## Clone required repositories + ``` -$ laconic-so setup-repositories --include vulcanize/assemblyscript,cerc-io/watcher-ts -``` -Checkout required branches for the current release: -``` -$ cd ~/cerc/assemblyscript -$ git checkout ng-integrate-asyncify -$ cd ~/cerc/watcher-ts -$ git checkout v0.2.13 +$ laconic-so setup-repositories --include cerc-io/watcher-ts ``` + ## Build the watcher container + ``` -$ laconic-sh build-containers --include cerc/watcher-mobymask +$ laconic-so build-containers --include cerc/watcher-mobymask ``` + This should create a container with tag `cerc/watcher-mobymask` in the local image registry. + ## Deploy the stack -First the watcher database has to be initialized. Start only the watcher-db service: + +First the watcher database has to be initialized. Start only the mobymask-watcher-db service: + ``` -$ laconic-so deploy-system --include watcher-mobymask up watcher-db +$ laconic-so deploy-system --include watcher-mobymask up mobymask-watcher-db ``` + Next find the container's id using `docker ps` then run the following command to initialize the database: + ``` -$ docker exec -i psql -U vdbm mobymask-watcher < config/watcher-mobymask/mobymask-watcher-db.sql +$ docker exec -i psql -U vdbm mobymask-watcher < config/watcher-mobymask/mobymask-watcher-db.sql ``` + Finally start the remaining containers: + ``` -$ laconic-so deploy-system --include watcher-mobymask +$ laconic-so deploy-system --include watcher-mobymask up ``` + Correct operation should be verified by following the instructions [here](https://github.com/cerc-io/mobymask-watcher/tree/main/mainnet-watcher-only#run), checking GraphQL queries return valid results in the watcher's [playground](http://127.0.0.1:3001/graphql). + +## Clean up + +Stop all the services running in background: + +```bash +$ laconic-so deploy-system --include watcher-mobymask down +``` diff --git a/stacks/mobymask/stack.yml b/stacks/mobymask/stack.yml index 8925cf28..794ec4ab 100644 --- a/stacks/mobymask/stack.yml +++ b/stacks/mobymask/stack.yml @@ -1,8 +1,7 @@ version: "1.0" name: mobymask-watcher repos: - - cerc-io/watcher-ts/v0.2.13 - - vulcanize/assemblyscript/ng-integrate-asyncify + - cerc-io/watcher-ts/v0.2.19 containers: - cerc/watcher-mobymask pods: From 63378a5c7e71b37ec10cb53b3261a12f46160693 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 22 Dec 2022 12:52:23 -0700 Subject: [PATCH 0159/1010] Add redirect follow to curl command for github --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 49a7f2f5..32618100 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ User mode runs the orchestrator from a "binary" single-file release and does not 1. Download the latest release from [this page](https://github.com/cerc-io/stack-orchestrator/tags), into a suitable directory (e.g. `~/bin`): ``` $ cd ~/bin - $ curl https://github.com/cerc-io/stack-orchestrator/releases/download/v1.0.3-alpha/laconic-so + $ curl -L https://github.com/cerc-io/stack-orchestrator/releases/download/v1.0.3-alpha/laconic-so ``` 1. Ensure `laconic-so` is on the `PATH` 1. Verify operation: From b6f1fd029d25b86444b94e1b363b9fa31d4c7516 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 3 Jan 2023 21:10:53 -0700 Subject: [PATCH 0160/1010] Add npm package build with local dependencies script --- .../build-npm-package-local-dependencies.sh | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100755 container-build/cerc-builder-js/build-npm-package-local-dependencies.sh diff --git a/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh b/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh new file mode 100755 index 00000000..51b5ede8 --- /dev/null +++ b/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# Usage: build-npm-package-local-dependencies.sh +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi +if [[ $# -ne 2 ]]; then + echo "Illegal number of parameters" >&2 + exit 1 +fi +if [[ -z "${NPM_AUTH_TOKEN}" ]]; then + echo "NPM_AUTH_TOKEN is not set" >&2 + exit 1 +fi +local_npm_registry_url=$1 +package_publish_version=$2 +# TODO: make this a paramater and allow a list of scopes +npm_scope_for_local="@cerc-io" +# We need to configure the local registry +npm config set @cerc-io:registry ${local_npm_registry_url} +npm config set -- ${local_npm_registry_url}:_authToken ${NPM_AUTH_TOKEN} +# Find the set of dependencies from the specified scope +mapfile -t dependencies_from_scope < <(cat package.json | jq -r '.dependencies | with_entries(if (.key|test("^@cerc-io/.*$")) then ( {key: .key, value: .value } ) else empty end ) | keys[]') +echo "Fixing up dependencies" +for package in "${dependencies_from_scope[@]}" +do + yarn-local-registry-fixup.sh $package +done +echo "Running build" +build-npm-package.sh ${local_npm_registry_url} ${package_publish_version} From b10b6c19f912d83ff53d870ddbd719a4b1b9eaa2 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 3 Jan 2023 21:14:35 -0700 Subject: [PATCH 0161/1010] Use variable for local package scope --- .../cerc-builder-js/build-npm-package-local-dependencies.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh b/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh index 51b5ede8..84327528 100755 --- a/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh +++ b/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh @@ -16,10 +16,10 @@ package_publish_version=$2 # TODO: make this a paramater and allow a list of scopes npm_scope_for_local="@cerc-io" # We need to configure the local registry -npm config set @cerc-io:registry ${local_npm_registry_url} +npm config set ${npm_scope_for_local}:registry ${local_npm_registry_url} npm config set -- ${local_npm_registry_url}:_authToken ${NPM_AUTH_TOKEN} # Find the set of dependencies from the specified scope -mapfile -t dependencies_from_scope < <(cat package.json | jq -r '.dependencies | with_entries(if (.key|test("^@cerc-io/.*$")) then ( {key: .key, value: .value } ) else empty end ) | keys[]') +mapfile -t dependencies_from_scope < <(cat package.json | jq -r '.dependencies | with_entries(if (.key|test("^'${npm_scope_for_local}'/.*$")) then ( {key: .key, value: .value } ) else empty end ) | keys[]') echo "Fixing up dependencies" for package in "${dependencies_from_scope[@]}" do From 1b4b47e9a4608cd75baf33087f3f198115a0dedd Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 3 Jan 2023 21:16:20 -0700 Subject: [PATCH 0162/1010] Add more output --- .../cerc-builder-js/build-npm-package-local-dependencies.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh b/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh index 84327528..7edba0a9 100755 --- a/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh +++ b/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh @@ -23,6 +23,7 @@ mapfile -t dependencies_from_scope < <(cat package.json | jq -r '.dependencies | echo "Fixing up dependencies" for package in "${dependencies_from_scope[@]}" do + echo "Fixing up package ${package}" yarn-local-registry-fixup.sh $package done echo "Running build" From 47b7a47160ad81979412f00f3417568fc0127d4c Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 3 Jan 2023 21:17:30 -0700 Subject: [PATCH 0163/1010] Add comments --- .../cerc-builder-js/build-npm-package-local-dependencies.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh b/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh index 7edba0a9..3981e238 100755 --- a/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh +++ b/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh @@ -1,5 +1,7 @@ #!/bin/bash # Usage: build-npm-package-local-dependencies.sh +# Runs build-npm-package.sh after first fixing up yarn.lock to use a local +# npm registry for all packages in a spcific scope (currently @cerc-io) if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi From 1b0407ae3c21f3f7bcc102afe8b2eb91d1a90cda Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 3 Jan 2023 21:39:06 -0700 Subject: [PATCH 0164/1010] Add scripts to image --- container-build/cerc-builder-js/Dockerfile | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/container-build/cerc-builder-js/Dockerfile b/container-build/cerc-builder-js/Dockerfile index 8eab2705..9f460375 100644 --- a/container-build/cerc-builder-js/Dockerfile +++ b/container-build/cerc-builder-js/Dockerfile @@ -25,8 +25,8 @@ RUN \ && npm cache clean --force > /dev/null 2>&1 # [Optional] Uncomment this section to install additional OS packages. -# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ -# && apt-get -y install --no-install-recommends +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ + && apt-get -y install --no-install-recommends jq # [Optional] Uncomment if you want to install an additional version of node using nvm # ARG EXTRA_NODE_VERSION=10 @@ -35,8 +35,11 @@ RUN \ # [Optional] Uncomment if you want to install more global node modules # RUN su node -c "npm install -g " -COPY build-npm-package.sh . -COPY yarn-local-registry-fixup.sh . +RUN mkdir /scripts +COPY build-npm-package.sh /scripts +COPY yarn-local-registry-fixup.sh /scripts +COPY build-npm-package-local-dependencies.sh /scripts +ENV PATH="${PATH}:/scripts" COPY entrypoint.sh . ENTRYPOINT ["./entrypoint.sh"] From c059745af966935b30049a360ad069636372afcc Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 3 Jan 2023 22:37:44 -0700 Subject: [PATCH 0165/1010] Working builds --- .../build-npm-package-local-dependencies.sh | 2 +- .../cerc-builder-js/yarn-local-registry-fixup.sh | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh b/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh index 3981e238..cb2b52a4 100755 --- a/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh +++ b/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh @@ -26,7 +26,7 @@ echo "Fixing up dependencies" for package in "${dependencies_from_scope[@]}" do echo "Fixing up package ${package}" - yarn-local-registry-fixup.sh $package + yarn-local-registry-fixup.sh $package ${local_npm_registry_url} done echo "Running build" build-npm-package.sh ${local_npm_registry_url} ${package_publish_version} diff --git a/container-build/cerc-builder-js/yarn-local-registry-fixup.sh b/container-build/cerc-builder-js/yarn-local-registry-fixup.sh index 13264a23..e6d9b793 100755 --- a/container-build/cerc-builder-js/yarn-local-registry-fixup.sh +++ b/container-build/cerc-builder-js/yarn-local-registry-fixup.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Usage: yarn-local-registry-fixup.sh +# Usage: yarn-local-registry-fixup.sh # Assumes package.json and yarn.lock are in the cwd # The purpose of this script is to take a project cloned from git # and "fixup" its yarn.lock file such that specified dependency @@ -10,16 +10,24 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi -if [[ $# -ne 1 ]]; then +if [[ $# -ne 2 ]]; then echo "Illegal number of parameters" >&2 exit 1 fi target_package=$1 +local_npm_registry_url=$2 +# TODO: use jq rather than sed here: versioned_target_package=$(grep ${target_package} package.json | sed -e 's#[[:space:]]\{1,\}\"\('${target_package}'\)\":[[:space:]]\{1,\}\"\(.*\)\",#\1@\2#' ) # Use yarn info to get URL checksums etc from the new registry yarn_info_output=$(yarn info --json $versioned_target_package 2>/dev/null) # Code below parses out the values we need package_tarball=$(echo $yarn_info_output | jq -r .data.dist.tarball) +# When running inside a container, the registry can return a URL with the wrong host name due to proxying +# so we need to check if that has happened and fix the URL if so. +if ! [[ "${package_tarball}" =~ ^${local_npm_registry_url}.* ]]; then + # HACK: I've hard-wired the host names below. Replace with proper implementation + package_tarball=$( echo ${package_tarball} | sed -e 's/localhost/host.docker.internal/g' ) +fi package_integrity=$(echo $yarn_info_output | jq -r .data.dist.integrity) package_shasum=$(echo $yarn_info_output | jq -r .data.dist.shasum) package_resolved=${package_tarball}#${package_shasum} @@ -33,5 +41,6 @@ if [ -n "$CERC_SCRIPT_VERBOSE" ]; then echo "Resolved: ${package_resolved}" fi # Use magic sed regex to replace the values in yarn.lock +# Note: yarn.lock is not json so we can not use jq for this sed -i -e '/^\"'${escaped_target_package}'.*\":$/ , /^\".*$/ s/^\([[:space:]]\{1,\}resolved \).*$/\1'\"${escaped_package_resolved}\"'/' yarn.lock sed -i -e '/^\"'${escaped_target_package}'.*\":$/ , /^\".*$/ s/^\([[:space:]]\{1,\}integrity \).*$/\1'${package_integrity}'/' yarn.lock From a5b1f6e1072f1a9eb5e77b7ab25a4ff773a56930 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 3 Jan 2023 22:38:51 -0700 Subject: [PATCH 0166/1010] Update readme --- container-build/cerc-builder-js/README.md | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/container-build/cerc-builder-js/README.md b/container-build/cerc-builder-js/README.md index c1a93e32..865d39ef 100644 --- a/container-build/cerc-builder-js/README.md +++ b/container-build/cerc-builder-js/README.md @@ -8,18 +8,10 @@ using `yarn`. As a temporary measure while the necessary functionality is being added to Stack Orchestrator, it is possible to build packages manually by invoking `docker run` , for example as follows: -``` -$ docker run -it --add-host host.docker.internal:host-gateway \ - -v ${HOME}/cerc/laconic-sdk:/workspace cerc/builder-js \ - sh -c 'cd /workspace && NPM_AUTH_TOKEN=6613572a28ebebaee20ccd90064251fa8c2b94f6 \ - /build-npm-package.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 0.1.4' -``` - -or: ``` $ docker run --rm -it --add-host host.docker.internal:host-gateway \ -v ${HOME}/cerc/laconic-registry-cli:/workspace cerc/builder-js \ sh -c 'cd /workspace && NPM_AUTH_TOKEN=6613572a28ebebaee20ccd90064251fa8c2b94f6 \ - /build-npm-package.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 0.1.4' + build-npm-package-local-dependencies.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 0.1.8' ``` From 2ba3ffac8481dfe7a5dc62d3ce25610af93e1183 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 4 Jan 2023 07:39:01 -0700 Subject: [PATCH 0167/1010] Add lirewine scope --- container-build/cerc-builder-js/build-npm-package.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/container-build/cerc-builder-js/build-npm-package.sh b/container-build/cerc-builder-js/build-npm-package.sh index 9e5094b2..6161e23e 100755 --- a/container-build/cerc-builder-js/build-npm-package.sh +++ b/container-build/cerc-builder-js/build-npm-package.sh @@ -14,6 +14,7 @@ if [[ -z "${NPM_AUTH_TOKEN}" ]]; then fi local_npm_registry_url=$1 package_publish_version=$2 +npm config set @lirewine:registry ${local_npm_registry_url} npm config set @cerc-io:registry ${local_npm_registry_url} npm config set -- ${local_npm_registry_url}:_authToken ${NPM_AUTH_TOKEN} echo "Build and publish version ${package_publish_version}" From 778550754d747fc3ba060d1136a50c3340d254a7 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 4 Jan 2023 10:39:16 -0700 Subject: [PATCH 0168/1010] Fix ps display for containers with no mapped ports --- app/deploy_system.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/deploy_system.py b/app/deploy_system.py index 91232094..45f6b61e 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -92,9 +92,15 @@ def command(ctx, include, exclude, cluster, command, services): for container in container_list: print(f"id: {container.id}, name: {container.name}, ports: ", end="") ports = container.network_settings.ports + comma = "" for port_mapping in ports.keys(): - print(f"{ports[port_mapping][0]['HostIp']}:{ports[port_mapping][0]['HostPort']}->{port_mapping}", end=",") - # TODO: fix the extra comma + mapping = ports[port_mapping] + print(comma, end="") + if mapping is None: + print(f"{port_mapping}", end="") + else: + print(f"{mapping[0]['HostIp']}:{mapping[0]['HostPort']}->{port_mapping}", end="") + comma = ", " print() else: print("No containers running") From ee1ecbd21759be4e930d373d7070426436303331 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 4 Jan 2023 16:16:40 -0700 Subject: [PATCH 0169/1010] Initial implementation of npm-build --- app/build_npms.py | 93 +++++++++++++++++++++++++++++++++++ app/data/npm-package-list.txt | 1 + cli.py | 2 + 3 files changed, 96 insertions(+) create mode 100644 app/build_npms.py create mode 100644 app/data/npm-package-list.txt diff --git a/app/build_npms.py b/app/build_npms.py new file mode 100644 index 00000000..81b215ab --- /dev/null +++ b/app/build_npms.py @@ -0,0 +1,93 @@ +# Copyright © 2022 Cerc + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +# Builds or pulls containers for the system components + +# env vars: +# CERC_REPO_BASE_DIR defaults to ~/cerc + +import os +from decouple import config +import subprocess +import click +import pkg_resources +from python_on_whales import docker +from .util import include_exclude_check + +@click.command() +@click.option('--include', help="only build these packages") +@click.option('--exclude', help="don\'t build these packages") +@click.pass_context +def command(ctx, include, exclude): + '''build the set of npm packages required for a complete stack''' + + quiet = ctx.obj.quiet + verbose = ctx.obj.verbose + dry_run = ctx.obj.dry_run + local_stack = ctx.obj.local_stack + + if local_stack: + dev_root_path = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] + print(f'Local stack dev_root_path (CERC_REPO_BASE_DIR) overridden to: {dev_root_path}') + else: + dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) + + if not quiet: + print(f'Dev Root is: {dev_root_path}') + + if not os.path.isdir(dev_root_path): + print('Dev root directory doesn\'t exist, creating') + + with pkg_resources.resource_stream(__name__, "data/npm-package-list.txt") as package_list_file: + packages = package_list_file.read().decode().splitlines() + + if verbose: + print(f'Packages: {packages}') + + # To build a package we need to run the cerc/build-js container with a bind mount from the project directory + # and use docker run to execute the build script inside that container + # docker.run("cerc/builder-js", ["ls", "/host"], volumes=[("", "/workspace")]) + # sh -c 'cd /workspace && NPM_AUTH_TOKEN=6613572a28ebebaee20ccd90064251fa8c2b94f6 \ + # build-npm-package.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 1.0.0-beta.1' + # NPM_AUTH_TOKEN=6613572a28ebebaee20ccd90064251fa8c2b94f6 + # Set uid/gid + + def build_package(package): + if not quiet: + print(f"Building: {package}") + repo_dir = package + repo_full_path = os.path.join(dev_root_path, repo_dir) + build_command = ["sh", "-c", "'cd /workspace && build-npm-package.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 1.0.0-beta.1'"] + if not dry_run: + if verbose: + print(f"Executing: {build_command}") + build_result = docker.run("cerc/builder-js", + remove=True, + interactive=True, + tty=True, + envs={"NPM_AUTH_TOKEN": "6613572a28ebebaee20ccd90064251fa8c2b94f6"}, + add_hosts=[("host.docker.internal", "host-gateway")], + volumes=[(repo_full_path, "/workspace")]) + # TODO: check result in build_result.returncode + print(f"Result is: {build_result}") + else: + print("Skipped") + + for package in packages: + if include_exclude_check(package, include, exclude): + build_package(package) + else: + if verbose: + print(f"Excluding: {package}") diff --git a/app/data/npm-package-list.txt b/app/data/npm-package-list.txt new file mode 100644 index 00000000..6e0ead2d --- /dev/null +++ b/app/data/npm-package-list.txt @@ -0,0 +1 @@ +gem diff --git a/cli.py b/cli.py index 87de406d..b3890dd6 100644 --- a/cli.py +++ b/cli.py @@ -17,6 +17,7 @@ import click from app import setup_repositories from app import build_containers +from app import build_npms from app import deploy_system CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) @@ -44,4 +45,5 @@ def cli(ctx, quiet, verbose, dry_run, local_stack): cli.add_command(setup_repositories.command, "setup-repositories") cli.add_command(build_containers.command, "build-containers") +cli.add_command(build_npms.command, "build-npms") cli.add_command(deploy_system.command, "deploy-system") From 073d94e2886333a0a67328f5a5f2bd5481135c09 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 4 Jan 2023 20:43:13 -0700 Subject: [PATCH 0170/1010] Brand token env var --- app/build_npms.py | 18 ++++++------------ app/data/npm-package-list.txt | 3 +++ container-build/cerc-builder-js/README.md | 2 +- .../cerc-builder-js/build-npm-package.sh | 8 ++++---- 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/app/build_npms.py b/app/build_npms.py index 81b215ab..812fb5c6 100644 --- a/app/build_npms.py +++ b/app/build_npms.py @@ -20,7 +20,6 @@ import os from decouple import config -import subprocess import click import pkg_resources from python_on_whales import docker @@ -56,20 +55,12 @@ def command(ctx, include, exclude): if verbose: print(f'Packages: {packages}') - # To build a package we need to run the cerc/build-js container with a bind mount from the project directory - # and use docker run to execute the build script inside that container - # docker.run("cerc/builder-js", ["ls", "/host"], volumes=[("", "/workspace")]) - # sh -c 'cd /workspace && NPM_AUTH_TOKEN=6613572a28ebebaee20ccd90064251fa8c2b94f6 \ - # build-npm-package.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 1.0.0-beta.1' - # NPM_AUTH_TOKEN=6613572a28ebebaee20ccd90064251fa8c2b94f6 - # Set uid/gid - def build_package(package): if not quiet: print(f"Building: {package}") repo_dir = package repo_full_path = os.path.join(dev_root_path, repo_dir) - build_command = ["sh", "-c", "'cd /workspace && build-npm-package.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 1.0.0-beta.1'"] + build_command = ["sh", "-c", "cd /workspace && build-npm-package.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 1.0.15"] if not dry_run: if verbose: print(f"Executing: {build_command}") @@ -77,9 +68,12 @@ def command(ctx, include, exclude): remove=True, interactive=True, tty=True, - envs={"NPM_AUTH_TOKEN": "6613572a28ebebaee20ccd90064251fa8c2b94f6"}, + user=f"{os.getuid()}:{os.getgid()}", + envs={"CERC_NPM_AUTH_TOKEN": os.environ["CERC_NPM_AUTH_TOKEN"]}, add_hosts=[("host.docker.internal", "host-gateway")], - volumes=[(repo_full_path, "/workspace")]) + volumes=[(repo_full_path, "/workspace")], + command=build_command + ) # TODO: check result in build_result.returncode print(f"Result is: {build_result}") else: diff --git a/app/data/npm-package-list.txt b/app/data/npm-package-list.txt index 6e0ead2d..3adedb5a 100644 --- a/app/data/npm-package-list.txt +++ b/app/data/npm-package-list.txt @@ -1 +1,4 @@ gem +laconic-sdk +debug +laconic-registry-cli diff --git a/container-build/cerc-builder-js/README.md b/container-build/cerc-builder-js/README.md index 865d39ef..da784efa 100644 --- a/container-build/cerc-builder-js/README.md +++ b/container-build/cerc-builder-js/README.md @@ -12,6 +12,6 @@ it is possible to build packages manually by invoking `docker run` , for example ``` $ docker run --rm -it --add-host host.docker.internal:host-gateway \ -v ${HOME}/cerc/laconic-registry-cli:/workspace cerc/builder-js \ - sh -c 'cd /workspace && NPM_AUTH_TOKEN=6613572a28ebebaee20ccd90064251fa8c2b94f6 \ + sh -c 'cd /workspace && CERC_NPM_AUTH_TOKEN=6613572a28ebebaee20ccd90064251fa8c2b94f6 \ build-npm-package-local-dependencies.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 0.1.8' ``` diff --git a/container-build/cerc-builder-js/build-npm-package.sh b/container-build/cerc-builder-js/build-npm-package.sh index 6161e23e..88cc974b 100755 --- a/container-build/cerc-builder-js/build-npm-package.sh +++ b/container-build/cerc-builder-js/build-npm-package.sh @@ -1,6 +1,6 @@ #!/bin/bash # Usage: build-npm-package.sh -# Note: supply the registry auth token in NPM_AUTH_TOKEN +# Note: supply the registry auth token in CERC_NPM_AUTH_TOKEN if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi @@ -8,15 +8,15 @@ if [[ $# -ne 2 ]]; then echo "Illegal number of parameters" >&2 exit 1 fi -if [[ -z "${NPM_AUTH_TOKEN}" ]]; then - echo "NPM_AUTH_TOKEN is not set" >&2 +if [[ -z "${CERC_NPM_AUTH_TOKEN}" ]]; then + echo "CERC_NPM_AUTH_TOKEN is not set" >&2 exit 1 fi local_npm_registry_url=$1 package_publish_version=$2 npm config set @lirewine:registry ${local_npm_registry_url} npm config set @cerc-io:registry ${local_npm_registry_url} -npm config set -- ${local_npm_registry_url}:_authToken ${NPM_AUTH_TOKEN} +npm config set -- ${local_npm_registry_url}:_authToken ${CERC_NPM_AUTH_TOKEN} echo "Build and publish version ${package_publish_version}" yarn install yarn build From 68c6eaf0b43eae1ecc43c8f82e592696b11b2c74 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 4 Jan 2023 20:50:23 -0700 Subject: [PATCH 0171/1010] Use the right script --- app/build_npms.py | 3 ++- .../cerc-builder-js/build-npm-package-local-dependencies.sh | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/build_npms.py b/app/build_npms.py index 812fb5c6..4dbed550 100644 --- a/app/build_npms.py +++ b/app/build_npms.py @@ -60,7 +60,8 @@ def command(ctx, include, exclude): print(f"Building: {package}") repo_dir = package repo_full_path = os.path.join(dev_root_path, repo_dir) - build_command = ["sh", "-c", "cd /workspace && build-npm-package.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 1.0.15"] + # TODO: make the npm registry url configurable. + build_command = ["sh", "-c", "cd /workspace && build-npm-package-local-dependencies.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 1.0.16"] if not dry_run: if verbose: print(f"Executing: {build_command}") diff --git a/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh b/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh index cb2b52a4..6449bb87 100755 --- a/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh +++ b/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh @@ -9,8 +9,8 @@ if [[ $# -ne 2 ]]; then echo "Illegal number of parameters" >&2 exit 1 fi -if [[ -z "${NPM_AUTH_TOKEN}" ]]; then - echo "NPM_AUTH_TOKEN is not set" >&2 +if [[ -z "${CERC_NPM_AUTH_TOKEN}" ]]; then + echo "CERC_NPM_AUTH_TOKEN is not set" >&2 exit 1 fi local_npm_registry_url=$1 @@ -19,7 +19,7 @@ package_publish_version=$2 npm_scope_for_local="@cerc-io" # We need to configure the local registry npm config set ${npm_scope_for_local}:registry ${local_npm_registry_url} -npm config set -- ${local_npm_registry_url}:_authToken ${NPM_AUTH_TOKEN} +npm config set -- ${local_npm_registry_url}:_authToken ${CERC_NPM_AUTH_TOKEN} # Find the set of dependencies from the specified scope mapfile -t dependencies_from_scope < <(cat package.json | jq -r '.dependencies | with_entries(if (.key|test("^'${npm_scope_for_local}'/.*$")) then ( {key: .key, value: .value } ) else empty end ) | keys[]') echo "Fixing up dependencies" From 765db5937d5d859b5a38fca2158500f321f96543 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 4 Jan 2023 21:23:17 -0700 Subject: [PATCH 0172/1010] Default to from-repo package version --- app/build_npms.py | 4 ++-- .../build-npm-package-local-dependencies.sh | 2 +- container-build/cerc-builder-js/build-npm-package.sh | 8 ++++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app/build_npms.py b/app/build_npms.py index 4dbed550..f91fcf99 100644 --- a/app/build_npms.py +++ b/app/build_npms.py @@ -61,7 +61,7 @@ def command(ctx, include, exclude): repo_dir = package repo_full_path = os.path.join(dev_root_path, repo_dir) # TODO: make the npm registry url configurable. - build_command = ["sh", "-c", "cd /workspace && build-npm-package-local-dependencies.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 1.0.16"] + build_command = ["sh", "-c", "cd /workspace && build-npm-package-local-dependencies.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/"] if not dry_run: if verbose: print(f"Executing: {build_command}") @@ -70,7 +70,7 @@ def command(ctx, include, exclude): interactive=True, tty=True, user=f"{os.getuid()}:{os.getgid()}", - envs={"CERC_NPM_AUTH_TOKEN": os.environ["CERC_NPM_AUTH_TOKEN"]}, + envs={"CERC_NPM_AUTH_TOKEN": os.environ["CERC_NPM_AUTH_TOKEN"], "CERC_SCRIPT_DEBUG": "true"}, add_hosts=[("host.docker.internal", "host-gateway")], volumes=[(repo_full_path, "/workspace")], command=build_command diff --git a/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh b/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh index 6449bb87..2824e008 100755 --- a/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh +++ b/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh @@ -5,7 +5,7 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi -if [[ $# -ne 2 ]]; then +if ! [[ $# -eq 1 || $# -eq 2 ]]; then echo "Illegal number of parameters" >&2 exit 1 fi diff --git a/container-build/cerc-builder-js/build-npm-package.sh b/container-build/cerc-builder-js/build-npm-package.sh index 88cc974b..c0b8f5dd 100755 --- a/container-build/cerc-builder-js/build-npm-package.sh +++ b/container-build/cerc-builder-js/build-npm-package.sh @@ -4,7 +4,7 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi -if [[ $# -ne 2 ]]; then +if ! [[ $# -eq 1 || $# -eq 2 ]]; then echo "Illegal number of parameters" >&2 exit 1 fi @@ -12,8 +12,12 @@ if [[ -z "${CERC_NPM_AUTH_TOKEN}" ]]; then echo "CERC_NPM_AUTH_TOKEN is not set" >&2 exit 1 fi +if [[ $# -eq 2 ]]; then + package_publish_version=$2 +else + package_publish_version=$( cat package.json | jq -r .version ) +fi local_npm_registry_url=$1 -package_publish_version=$2 npm config set @lirewine:registry ${local_npm_registry_url} npm config set @cerc-io:registry ${local_npm_registry_url} npm config set -- ${local_npm_registry_url}:_authToken ${CERC_NPM_AUTH_TOKEN} From ff76cdad6147b61518657f127a49cb1402d31f31 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 5 Jan 2023 07:40:05 -0700 Subject: [PATCH 0173/1010] Back out debug code --- app/build_npms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build_npms.py b/app/build_npms.py index f91fcf99..255ca05c 100644 --- a/app/build_npms.py +++ b/app/build_npms.py @@ -70,7 +70,7 @@ def command(ctx, include, exclude): interactive=True, tty=True, user=f"{os.getuid()}:{os.getgid()}", - envs={"CERC_NPM_AUTH_TOKEN": os.environ["CERC_NPM_AUTH_TOKEN"], "CERC_SCRIPT_DEBUG": "true"}, + envs={"CERC_NPM_AUTH_TOKEN": os.environ["CERC_NPM_AUTH_TOKEN"]}, add_hosts=[("host.docker.internal", "host-gateway")], volumes=[(repo_full_path, "/workspace")], command=build_command From d77a42b36f71329a23500cc79918630136972d2e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 6 Jan 2023 10:20:18 -0700 Subject: [PATCH 0174/1010] Add test for package version already exists --- app/build_npms.py | 6 ++++-- cli.py | 8 +++++--- container-build/cerc-builder-js/build-npm-package.sh | 12 ++++++++++-- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/app/build_npms.py b/app/build_npms.py index 255ca05c..2bce43f3 100644 --- a/app/build_npms.py +++ b/app/build_npms.py @@ -36,6 +36,7 @@ def command(ctx, include, exclude): verbose = ctx.obj.verbose dry_run = ctx.obj.dry_run local_stack = ctx.obj.local_stack + debug = ctx.obj.debug if local_stack: dev_root_path = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] @@ -57,7 +58,7 @@ def command(ctx, include, exclude): def build_package(package): if not quiet: - print(f"Building: {package}") + print(f"Building npm package: {package}") repo_dir = package repo_full_path = os.path.join(dev_root_path, repo_dir) # TODO: make the npm registry url configurable. @@ -65,12 +66,13 @@ def command(ctx, include, exclude): if not dry_run: if verbose: print(f"Executing: {build_command}") + envs = {"CERC_NPM_AUTH_TOKEN": os.environ["CERC_NPM_AUTH_TOKEN"]} | ({"CERC_SCRIPT_DEBUG": "true"} if debug else {}) build_result = docker.run("cerc/builder-js", remove=True, interactive=True, tty=True, user=f"{os.getuid()}:{os.getgid()}", - envs={"CERC_NPM_AUTH_TOKEN": os.environ["CERC_NPM_AUTH_TOKEN"]}, + envs=envs, add_hosts=[("host.docker.internal", "host-gateway")], volumes=[(repo_full_path, "/workspace")], command=build_command diff --git a/cli.py b/cli.py index b3890dd6..1703a422 100644 --- a/cli.py +++ b/cli.py @@ -24,11 +24,12 @@ CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) class Options(object): - def __init__(self, quiet, verbose, dry_run, local_stack): + def __init__(self, quiet, verbose, dry_run, local_stack, debug): self.quiet = quiet self.verbose = verbose self.dry_run = dry_run self.local_stack = local_stack + self.debug = debug @click.group(context_settings=CONTEXT_SETTINGS) @@ -36,11 +37,12 @@ class Options(object): @click.option('--verbose', is_flag=True, default=False) @click.option('--dry-run', is_flag=True, default=False) @click.option('--local-stack', is_flag=True, default=False) +@click.option('--debug', is_flag=True, default=False) # See: https://click.palletsprojects.com/en/8.1.x/complex/#building-a-git-clone @click.pass_context -def cli(ctx, quiet, verbose, dry_run, local_stack): +def cli(ctx, quiet, verbose, dry_run, local_stack, debug): """Laconic Stack Orchestrator""" - ctx.obj = Options(quiet, verbose, dry_run, local_stack) + ctx.obj = Options(quiet, verbose, dry_run, local_stack, debug) cli.add_command(setup_repositories.command, "setup-repositories") diff --git a/container-build/cerc-builder-js/build-npm-package.sh b/container-build/cerc-builder-js/build-npm-package.sh index c0b8f5dd..89308bc8 100755 --- a/container-build/cerc-builder-js/build-npm-package.sh +++ b/container-build/cerc-builder-js/build-npm-package.sh @@ -1,7 +1,7 @@ #!/bin/bash # Usage: build-npm-package.sh # Note: supply the registry auth token in CERC_NPM_AUTH_TOKEN -if [ -n "$CERC_SCRIPT_DEBUG" ]; then +if [[ -n "$CERC_SCRIPT_DEBUG" ]]; then set -x fi if ! [[ $# -eq 1 || $# -eq 2 ]]; then @@ -17,11 +17,19 @@ if [[ $# -eq 2 ]]; then else package_publish_version=$( cat package.json | jq -r .version ) fi +# Get the name of this package from package.json since we weren't passed that +package_name=$( cat package.json | jq -r .name ) local_npm_registry_url=$1 npm config set @lirewine:registry ${local_npm_registry_url} npm config set @cerc-io:registry ${local_npm_registry_url} npm config set -- ${local_npm_registry_url}:_authToken ${CERC_NPM_AUTH_TOKEN} -echo "Build and publish version ${package_publish_version}" +# First check if the version of this package we're trying to build already exists in the registry +package_exists=$( yarn info --json ${package_name}@${package_publish_version} | jq -r .data.dist.tarball ) +if [[ -n "$package_exists" ]]; then + echo "${package_publish_version} of ${package_name} already exists in the registry, skipping build" + exit 0 +fi +echo "Build and publish ${package_name} version ${package_publish_version}" yarn install yarn build yarn publish --non-interactive --new-version ${package_publish_version} --no-git-tag-version From 92743d7390d3e1f9017b313eabf9cf49ddd8a901 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 6 Jan 2023 13:13:56 -0700 Subject: [PATCH 0175/1010] Rename directory --- .../Dockerfile | 0 .../{cerc-laconic-cns-cli => cerc-laconic-registry-cli}/build.sh | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename container-build/{cerc-laconic-cns-cli => cerc-laconic-registry-cli}/Dockerfile (100%) rename container-build/{cerc-laconic-cns-cli => cerc-laconic-registry-cli}/build.sh (100%) diff --git a/container-build/cerc-laconic-cns-cli/Dockerfile b/container-build/cerc-laconic-registry-cli/Dockerfile similarity index 100% rename from container-build/cerc-laconic-cns-cli/Dockerfile rename to container-build/cerc-laconic-registry-cli/Dockerfile diff --git a/container-build/cerc-laconic-cns-cli/build.sh b/container-build/cerc-laconic-registry-cli/build.sh similarity index 100% rename from container-build/cerc-laconic-cns-cli/build.sh rename to container-build/cerc-laconic-registry-cli/build.sh From 6e67a59251be24f97224206025573421af5392c3 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 6 Jan 2023 13:44:52 -0700 Subject: [PATCH 0176/1010] Initial implementation --- app/data/container-image-list.txt | 2 +- .../cerc-laconic-registry-cli/Dockerfile | 57 ++++++++++++++++--- .../cerc-laconic-registry-cli/build.sh | 6 +- 3 files changed, 54 insertions(+), 11 deletions(-) diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index c697fe21..48d5bc04 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -9,7 +9,7 @@ cerc/ipld-eth-beacon-db cerc/ipld-eth-beacon-indexer cerc/ipld-eth-server cerc/laconicd -cerc/laconic-cns-cli +cerc/laconic-registry-cli cerc/fixturenet-eth-geth cerc/fixturenet-eth-lighthouse cerc/watcher-mobymask diff --git a/container-build/cerc-laconic-registry-cli/Dockerfile b/container-build/cerc-laconic-registry-cli/Dockerfile index dab45c26..45ec0a8c 100644 --- a/container-build/cerc-laconic-registry-cli/Dockerfile +++ b/container-build/cerc-laconic-registry-cli/Dockerfile @@ -1,13 +1,54 @@ -# TODO: move this into the cerc-io/laconic-sdk (aka client) repo -FROM node:16.17.1-alpine3.16 +# Originally from: https://github.com/devcontainers/images/blob/main/src/javascript-node/.devcontainer/Dockerfile +# [Choice] Node.js version (use -bullseye variants on local arm64/Apple Silicon): 18, 16, 14, 18-bullseye, 16-bullseye, 14-bullseye, 18-buster, 16-buster, 14-buster +ARG VARIANT=16-bullseye +FROM node:${VARIANT} -ARG NPM_AUTH_TOKEN -WORKDIR /app +ARG USERNAME=node +ARG NPM_GLOBAL=/usr/local/share/npm-global -COPY . . +# This container pulls npm packages from a local registry configured via these env vars +ARG CERC_LOCAL_NPM_URL +ARG CERC_LOCAL_NPM_TOKEN -RUN echo //npm.pkg.github.com/:_authToken=$NPM_AUTH_TOKEN > ~/.npmrc +# Add NPM global to PATH. +ENV PATH=${NPM_GLOBAL}/bin:${PATH} -RUN apk --update --no-cache add git && yarn && yarn build +RUN \ + # Configure global npm install location, use group to adapt to UID/GID changes + if ! cat /etc/group | grep -e "^npm:" > /dev/null 2>&1; then groupadd -r npm; fi \ + && usermod -a -G npm ${USERNAME} \ + && umask 0002 \ + && mkdir -p ${NPM_GLOBAL} \ + && touch /usr/local/etc/npmrc \ + && chown ${USERNAME}:npm ${NPM_GLOBAL} /usr/local/etc/npmrc \ + && chmod g+s ${NPM_GLOBAL} \ + && npm config -g set prefix ${NPM_GLOBAL} \ + && su ${USERNAME} -c "npm config -g set prefix ${NPM_GLOBAL}" \ + # Install eslint + && su ${USERNAME} -c "umask 0002 && npm install -g eslint" \ + && npm cache clean --force > /dev/null 2>&1 -ENTRYPOINT ["/app/bin/laconic"] +# [Optional] Uncomment this section to install additional OS packages. +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ + && apt-get -y install --no-install-recommends jq + +# [Optional] Uncomment if you want to install an additional version of node using nvm +# ARG EXTRA_NODE_VERSION=10 +# RUN su node -c "source /usr/local/share/nvm/nvm.sh && nvm install ${EXTRA_NODE_VERSION}" + +# [Optional] Uncomment if you want to install more global node modules +# RUN su node -c "npm install -g " + +# Configure the local npm registry +RUN npm config set @lirewine:registry ${CERC_LOCAL_NPM_URL} \ + && npm config set @cerc-io:registry ${CERC_LOCAL_NPM_URL} \ + && npm config set @lirewine:registry ${CERC_LOCAL_NPM_URL} \ + && npm config set -- ${CERC_LOCAL_NPM_URL}:_authToken ${CERC_LOCAL_NPM_TOKEN} + +# TODO: the image at this point could be made a base image for several different CLI images +# that install different Node-based CLI commands + +# Globally install the cli package +RUN yarn global add @cerc-io/laconic-registry-cli + +ENTRYPOINT ["laconic"] diff --git a/container-build/cerc-laconic-registry-cli/build.sh b/container-build/cerc-laconic-registry-cli/build.sh index a4a8de41..43ec55a7 100755 --- a/container-build/cerc-laconic-registry-cli/build.sh +++ b/container-build/cerc-laconic-registry-cli/build.sh @@ -1,7 +1,9 @@ #!/usr/bin/env bash -# Build cerc/laconic-cns-cli +# Build cerc/laconic-registry-cli # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/laconic-cns-cli:local -f ${SCRIPT_DIR}/Dockerfile --build-arg NPM_AUTH_TOKEN=$(NPM_AUTH_TOKEN) ${CERC_REPO_BASE_DIR}/laconic-cns-cli +docker build -t cerc/laconic-registry-cli:local -f ${SCRIPT_DIR}/Dockerfile \ + --add-host host.docker.internal:host-gateway \ + --build-arg CERC_LOCAL_NPM_TOKEN --build-arg CERC_LOCAL_NPM_URL ${SCRIPT_DIR} From 318d70020e15bcd411d58e68fd2c366e7cd46ab7 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 6 Jan 2023 13:54:03 -0700 Subject: [PATCH 0177/1010] Add build environment --- app/build_containers.py | 6 ++++++ container-build/cerc-laconic-registry-cli/Dockerfile | 12 ++++++------ container-build/cerc-laconic-registry-cli/build.sh | 2 +- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/build_containers.py b/app/build_containers.py index f8edb0b3..43888b3d 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -64,6 +64,12 @@ def command(ctx, include, exclude): if verbose: print(f'Containers: {containers}') + # TODO: make this configurable + container_build_env = { + "CERC_NPM_URL": "http://host.docker.internal:3000/api/packages/cerc-io/npm/", + "CERC_NPM_AUTH_TOKEN": os.environ["CERC_NPM_AUTH_TOKEN"] + } + def process_container(container): if not quiet: print(f"Building: {container}") diff --git a/container-build/cerc-laconic-registry-cli/Dockerfile b/container-build/cerc-laconic-registry-cli/Dockerfile index 45ec0a8c..ba22a5c9 100644 --- a/container-build/cerc-laconic-registry-cli/Dockerfile +++ b/container-build/cerc-laconic-registry-cli/Dockerfile @@ -7,8 +7,8 @@ ARG USERNAME=node ARG NPM_GLOBAL=/usr/local/share/npm-global # This container pulls npm packages from a local registry configured via these env vars -ARG CERC_LOCAL_NPM_URL -ARG CERC_LOCAL_NPM_TOKEN +ARG CERC_NPM_URL +ARG CERC_NPM_AUTH_TOKEN # Add NPM global to PATH. ENV PATH=${NPM_GLOBAL}/bin:${PATH} @@ -40,10 +40,10 @@ RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ # RUN su node -c "npm install -g " # Configure the local npm registry -RUN npm config set @lirewine:registry ${CERC_LOCAL_NPM_URL} \ - && npm config set @cerc-io:registry ${CERC_LOCAL_NPM_URL} \ - && npm config set @lirewine:registry ${CERC_LOCAL_NPM_URL} \ - && npm config set -- ${CERC_LOCAL_NPM_URL}:_authToken ${CERC_LOCAL_NPM_TOKEN} +RUN npm config set @lirewine:registry ${CERC_NPM_URL} \ + && npm config set @cerc-io:registry ${CERC_NPM_URL} \ + && npm config set @lirewine:registry ${CERC_NPM_URL} \ + && npm config set -- ${CERC_NPM_URL}:_authToken ${CERC_NPM_AUTH_TOKEN} # TODO: the image at this point could be made a base image for several different CLI images # that install different Node-based CLI commands diff --git a/container-build/cerc-laconic-registry-cli/build.sh b/container-build/cerc-laconic-registry-cli/build.sh index 43ec55a7..fa29fa4b 100755 --- a/container-build/cerc-laconic-registry-cli/build.sh +++ b/container-build/cerc-laconic-registry-cli/build.sh @@ -6,4 +6,4 @@ SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) docker build -t cerc/laconic-registry-cli:local -f ${SCRIPT_DIR}/Dockerfile \ --add-host host.docker.internal:host-gateway \ - --build-arg CERC_LOCAL_NPM_TOKEN --build-arg CERC_LOCAL_NPM_URL ${SCRIPT_DIR} + --build-arg CERC_NPM_AUTH_TOKEN --build-arg CERC_NPM_URL ${SCRIPT_DIR} From 82755a27f2f34ea2a1916d562c7572a5949ffd6b Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 6 Jan 2023 15:57:14 -0700 Subject: [PATCH 0178/1010] Build a CLI container --- app/build_containers.py | 7 ++++--- app/build_npms.py | 4 ++-- container-build/cerc-builder-js/README.md | 4 ++-- container-build/cerc-builder-js/build-npm-package.sh | 2 +- .../cerc-builder-js/yarn-local-registry-fixup.sh | 3 ++- container-build/cerc-laconic-registry-cli/Dockerfile | 3 +++ container-build/cerc-laconic-registry-cli/build.sh | 2 +- 7 files changed, 15 insertions(+), 10 deletions(-) diff --git a/app/build_containers.py b/app/build_containers.py index 43888b3d..c74df1e9 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -66,8 +66,9 @@ def command(ctx, include, exclude): # TODO: make this configurable container_build_env = { - "CERC_NPM_URL": "http://host.docker.internal:3000/api/packages/cerc-io/npm/", - "CERC_NPM_AUTH_TOKEN": os.environ["CERC_NPM_AUTH_TOKEN"] + "CERC_NPM_URL": "http://gitea.local:3000/api/packages/cerc-io/npm/", + "CERC_NPM_AUTH_TOKEN": os.environ["CERC_NPM_AUTH_TOKEN"], + "CERC_REPO_BASE_DIR": dev_root_path } def process_container(container): @@ -91,7 +92,7 @@ def command(ctx, include, exclude): if not dry_run: if verbose: print(f"Executing: {build_command}") - build_result = subprocess.run(build_command, shell=True, env={'CERC_REPO_BASE_DIR': dev_root_path}) + build_result = subprocess.run(build_command, shell=True, env=container_build_env) # TODO: check result in build_result.returncode print(f"Result is: {build_result}") else: diff --git a/app/build_npms.py b/app/build_npms.py index 2bce43f3..e00c0734 100644 --- a/app/build_npms.py +++ b/app/build_npms.py @@ -62,7 +62,7 @@ def command(ctx, include, exclude): repo_dir = package repo_full_path = os.path.join(dev_root_path, repo_dir) # TODO: make the npm registry url configurable. - build_command = ["sh", "-c", "cd /workspace && build-npm-package-local-dependencies.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/"] + build_command = ["sh", "-c", "cd /workspace && build-npm-package-local-dependencies.sh http://gitea.local:3000/api/packages/cerc-io/npm/"] if not dry_run: if verbose: print(f"Executing: {build_command}") @@ -73,7 +73,7 @@ def command(ctx, include, exclude): tty=True, user=f"{os.getuid()}:{os.getgid()}", envs=envs, - add_hosts=[("host.docker.internal", "host-gateway")], + add_hosts=[("gitea.local", "host-gateway")], volumes=[(repo_full_path, "/workspace")], command=build_command ) diff --git a/container-build/cerc-builder-js/README.md b/container-build/cerc-builder-js/README.md index da784efa..e77136f8 100644 --- a/container-build/cerc-builder-js/README.md +++ b/container-build/cerc-builder-js/README.md @@ -10,8 +10,8 @@ it is possible to build packages manually by invoking `docker run` , for example ``` -$ docker run --rm -it --add-host host.docker.internal:host-gateway \ +$ docker run --rm -it --add-host gitea.local:host-gateway \ -v ${HOME}/cerc/laconic-registry-cli:/workspace cerc/builder-js \ sh -c 'cd /workspace && CERC_NPM_AUTH_TOKEN=6613572a28ebebaee20ccd90064251fa8c2b94f6 \ - build-npm-package-local-dependencies.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 0.1.8' + build-npm-package-local-dependencies.sh http://gitea.local:3000/api/packages/cerc-io/npm/ 0.1.8' ``` diff --git a/container-build/cerc-builder-js/build-npm-package.sh b/container-build/cerc-builder-js/build-npm-package.sh index 89308bc8..9c9ac580 100755 --- a/container-build/cerc-builder-js/build-npm-package.sh +++ b/container-build/cerc-builder-js/build-npm-package.sh @@ -25,7 +25,7 @@ npm config set @cerc-io:registry ${local_npm_registry_url} npm config set -- ${local_npm_registry_url}:_authToken ${CERC_NPM_AUTH_TOKEN} # First check if the version of this package we're trying to build already exists in the registry package_exists=$( yarn info --json ${package_name}@${package_publish_version} | jq -r .data.dist.tarball ) -if [[ -n "$package_exists" ]]; then +if [[ ! -z "$package_exists" && "$package_exists" != "null" ]]; then echo "${package_publish_version} of ${package_name} already exists in the registry, skipping build" exit 0 fi diff --git a/container-build/cerc-builder-js/yarn-local-registry-fixup.sh b/container-build/cerc-builder-js/yarn-local-registry-fixup.sh index e6d9b793..987fcbc2 100755 --- a/container-build/cerc-builder-js/yarn-local-registry-fixup.sh +++ b/container-build/cerc-builder-js/yarn-local-registry-fixup.sh @@ -26,7 +26,8 @@ package_tarball=$(echo $yarn_info_output | jq -r .data.dist.tarball) # so we need to check if that has happened and fix the URL if so. if ! [[ "${package_tarball}" =~ ^${local_npm_registry_url}.* ]]; then # HACK: I've hard-wired the host names below. Replace with proper implementation - package_tarball=$( echo ${package_tarball} | sed -e 's/localhost/host.docker.internal/g' ) + # TODO: remove the hack when proven no longer necessary + package_tarball=$( echo ${package_tarball} | sed -e 's/localhost/gitea.local/g' ) fi package_integrity=$(echo $yarn_info_output | jq -r .data.dist.integrity) package_shasum=$(echo $yarn_info_output | jq -r .data.dist.shasum) diff --git a/container-build/cerc-laconic-registry-cli/Dockerfile b/container-build/cerc-laconic-registry-cli/Dockerfile index ba22a5c9..3341da79 100644 --- a/container-build/cerc-laconic-registry-cli/Dockerfile +++ b/container-build/cerc-laconic-registry-cli/Dockerfile @@ -48,6 +48,9 @@ RUN npm config set @lirewine:registry ${CERC_NPM_URL} \ # TODO: the image at this point could be made a base image for several different CLI images # that install different Node-based CLI commands +# DEBUG, remove +RUN yarn info @cerc-io/laconic-registry-cli + # Globally install the cli package RUN yarn global add @cerc-io/laconic-registry-cli diff --git a/container-build/cerc-laconic-registry-cli/build.sh b/container-build/cerc-laconic-registry-cli/build.sh index fa29fa4b..ea157dac 100755 --- a/container-build/cerc-laconic-registry-cli/build.sh +++ b/container-build/cerc-laconic-registry-cli/build.sh @@ -5,5 +5,5 @@ SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) docker build -t cerc/laconic-registry-cli:local -f ${SCRIPT_DIR}/Dockerfile \ - --add-host host.docker.internal:host-gateway \ + --add-host gitea.local:host-gateway \ --build-arg CERC_NPM_AUTH_TOKEN --build-arg CERC_NPM_URL ${SCRIPT_DIR} From 9b2a58e3bdd964135874e74558679365f48961cc Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 6 Jan 2023 16:11:20 -0700 Subject: [PATCH 0179/1010] Rename compose file --- compose/{docker-compose-db.yml => docker-compose-ipld-eth-db.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename compose/{docker-compose-db.yml => docker-compose-ipld-eth-db.yml} (100%) diff --git a/compose/docker-compose-db.yml b/compose/docker-compose-ipld-eth-db.yml similarity index 100% rename from compose/docker-compose-db.yml rename to compose/docker-compose-ipld-eth-db.yml From c99687cc80f76fa610477b23a540632ec5e9ddc3 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sat, 7 Jan 2023 20:44:08 -0700 Subject: [PATCH 0180/1010] Switch to Python3 importlib --- app/build_containers.py | 8 +++++--- app/build_npms.py | 8 +++++--- app/data/__init__.py | 0 app/deploy_system.py | 8 +++++--- app/setup_repositories.py | 8 +++++--- 5 files changed, 20 insertions(+), 12 deletions(-) create mode 100644 app/data/__init__.py diff --git a/app/build_containers.py b/app/build_containers.py index c74df1e9..fde6c305 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -24,7 +24,7 @@ import os from decouple import config import subprocess import click -import pkg_resources +import importlib from .util import include_exclude_check # TODO: find a place for this @@ -58,8 +58,10 @@ def command(ctx, include, exclude): if not os.path.isdir(dev_root_path): print('Dev root directory doesn\'t exist, creating') - with pkg_resources.resource_stream(__name__, "data/container-image-list.txt") as container_list_file: - containers = container_list_file.read().decode().splitlines() + # See: https://stackoverflow.com/a/20885799/1701505 + from . import data + with importlib.resources.open_text(data, "container-image-list.txt") as container_list_file: + containers = container_list_file.read().splitlines() if verbose: print(f'Containers: {containers}') diff --git a/app/build_npms.py b/app/build_npms.py index e00c0734..905a54cd 100644 --- a/app/build_npms.py +++ b/app/build_npms.py @@ -21,7 +21,7 @@ import os from decouple import config import click -import pkg_resources +import importlib from python_on_whales import docker from .util import include_exclude_check @@ -50,8 +50,10 @@ def command(ctx, include, exclude): if not os.path.isdir(dev_root_path): print('Dev root directory doesn\'t exist, creating') - with pkg_resources.resource_stream(__name__, "data/npm-package-list.txt") as package_list_file: - packages = package_list_file.read().decode().splitlines() + # See: https://stackoverflow.com/a/20885799/1701505 + from . import data + with importlib.resources.open_text(data, "npm-package-list.txt") as package_list_file: + packages = package_list_file.read().splitlines() if verbose: print(f'Packages: {packages}') diff --git a/app/data/__init__.py b/app/data/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/deploy_system.py b/app/deploy_system.py index 45f6b61e..169e0d6b 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -20,7 +20,7 @@ import os import sys from python_on_whales import DockerClient import click -import pkg_resources +import importlib from .util import include_exclude_check @@ -49,8 +49,10 @@ def command(ctx, include, exclude, cluster, command, services): if verbose: print(f"Using cluster name: {cluster}") - with pkg_resources.resource_stream(__name__, "data/pod-list.txt") as pod_list_file: - pods = pod_list_file.read().decode().splitlines() + # See: https://stackoverflow.com/a/20885799/1701505 + from . import data + with importlib.resources.open_text(data, "pod-list.txt") as pod_list_file: + pods = pod_list_file.read().splitlines() if verbose: print(f"Pods: {pods}") diff --git a/app/setup_repositories.py b/app/setup_repositories.py index 3086cbb1..bb1c3c69 100644 --- a/app/setup_repositories.py +++ b/app/setup_repositories.py @@ -22,7 +22,7 @@ from decouple import config import git from tqdm import tqdm import click -import pkg_resources +import importlib from .util import include_exclude_check @@ -91,8 +91,10 @@ def command(ctx, include, exclude, git_ssh, check_only, pull, branches_file): print('Dev root directory doesn\'t exist, creating') os.makedirs(dev_root_path) - with pkg_resources.resource_stream(__name__, "data/repository-list.txt") as repository_list_file: - all_repos = repository_list_file.read().decode().splitlines() + # See: https://stackoverflow.com/a/20885799/1701505 + from . import data + with importlib.resources.open_text(data, "repository-list.txt") as repository_list_file: + all_repos = repository_list_file.read().splitlines() if verbose: print(f"Repos: {all_repos}") From 0435a71b5e6d76edcc7281c30d1d8ac9a31683e4 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sat, 7 Jan 2023 21:02:14 -0700 Subject: [PATCH 0181/1010] Refactor for shiv package --- app/build_containers.py | 9 ++++----- .../data/compose}/docker-compose-contract.yml | 0 .../data/compose}/docker-compose-eth-probe.yml | 0 .../docker-compose-eth-statediff-fill-service.yml | 0 .../data/compose}/docker-compose-fixturenet-eth.yml | 0 .../data/compose}/docker-compose-fixturenet-laconicd.yml | 0 .../data/compose}/docker-compose-go-ethereum-foundry.yml | 0 .../data/compose}/docker-compose-ipld-eth-beacon-db.yml | 0 .../compose}/docker-compose-ipld-eth-beacon-indexer.yml | 0 .../data/compose}/docker-compose-ipld-eth-db.yml | 0 .../data/compose}/docker-compose-ipld-eth-server.yml | 0 .../data/compose}/docker-compose-keycloak.yml | 0 .../data/compose}/docker-compose-laconicd.yml | 0 .../data/compose}/docker-compose-prometheus-grafana.yml | 0 {compose => app/data/compose}/docker-compose-test.yml | 0 .../data/compose}/docker-compose-tx-spammer.yml | 0 .../data/compose}/docker-compose-watcher-erc20.yml | 0 .../data/compose}/docker-compose-watcher-erc721.yml | 0 .../data/compose}/docker-compose-watcher-mobymask.yml | 0 .../data/compose}/docker-compose-watcher-uniswap-v3.yml | 0 .../data/config}/fixturenet-eth/fixturenet-eth.env | 0 .../config}/fixturenet-laconicd/create-fixturenet.sh | 0 .../data/config}/ipld-eth-beacon-indexer/indexer.env | 0 {config => app/data/config}/ipld-eth-server/chain.json | 0 .../data/config}/keycloak/import/cerc-realm.json | 0 {config => app/data/config}/keycloak/keycloak.env | 0 .../data/config}/keycloak/nginx/keycloak_proxy.conf | 0 .../config}/postgresql/create-pg-stat-statements.sql | 0 .../config}/postgresql/multiple-postgressql-databases.sh | 0 {config => app/data/config}/tx-spammer/tx-spammer.env | 0 .../data/config}/watcher-erc20/erc20-watcher.toml | 0 .../data/config}/watcher-erc721/erc721-watcher.toml | 0 .../config}/watcher-mobymask/mobymask-watcher-db.sql | 0 .../data/config}/watcher-mobymask/mobymask-watcher.toml | 0 .../data/config}/watcher-uniswap-v3/erc20-watcher.toml | 0 {config => app/data/config}/watcher-uniswap-v3/run.sh | 0 .../config}/watcher-uniswap-v3/uni-info-watcher.toml | 0 .../data/config}/watcher-uniswap-v3/uni-watcher.toml | 0 .../data/config}/watcher-uniswap-v3/watch-contract.sh | 0 .../data/container-build}/cerc-builder-js/Dockerfile | 0 .../data/container-build}/cerc-builder-js/README.md | 0 .../build-npm-package-local-dependencies.sh | 0 .../cerc-builder-js/build-npm-package.sh | 0 .../data/container-build}/cerc-builder-js/entrypoint.sh | 0 .../cerc-builder-js/yarn-local-registry-fixup.sh | 0 .../data/container-build}/cerc-eth-probe/build.sh | 0 .../cerc-eth-statediff-fill-service/build.sh | 0 .../container-build}/cerc-eth-statediff-service/build.sh | 0 .../container-build}/cerc-fixturenet-eth-geth/Dockerfile | 0 .../container-build}/cerc-fixturenet-eth-geth/build.sh | 0 .../cerc-fixturenet-eth-geth/genesis/Makefile | 0 .../genesis/accounts/import_keys.sh | 0 .../genesis/accounts/mnemonic_to_csv.py | 0 .../cerc-fixturenet-eth-geth/genesis/el/build_el.sh | 0 .../cerc-fixturenet-eth-geth/genesis/el/el-config.yaml | 0 .../container-build}/cerc-fixturenet-eth-geth/run-el.sh | 0 .../cerc-fixturenet-eth-lighthouse/Dockerfile | 0 .../cerc-fixturenet-eth-lighthouse/build.sh | 0 .../cerc-fixturenet-eth-lighthouse/genesis/Makefile | 0 .../genesis/cl/beacon_node.sh | 0 .../genesis/cl/bootnode.sh | 0 .../genesis/cl/build_cl.sh | 0 .../cerc-fixturenet-eth-lighthouse/genesis/cl/ready.sh | 0 .../genesis/cl/reset_genesis_time.sh | 0 .../genesis/cl/validator_client.sh | 0 .../cerc-fixturenet-eth-lighthouse/genesis/cl/vars.env | 0 .../cerc-fixturenet-eth-lighthouse/run-cl.sh | 0 .../cerc-fixturenet-eth-lighthouse/scripts/status.sh | 0 .../container-build}/cerc-go-ethereum-foundry/Dockerfile | 0 .../container-build}/cerc-go-ethereum-foundry/build.sh | 0 .../cerc-go-ethereum-foundry/deploy-local-network.sh | 0 .../cerc-go-ethereum-foundry/genesis-automine.json | 0 .../cerc-go-ethereum-foundry/genesis.json | 0 .../cerc-go-ethereum-foundry/start-private-network.sh | 0 .../cerc-go-ethereum-foundry/stateful/foundry.toml | 0 .../stateful/lib/ds-test/LICENSE | 0 .../stateful/lib/ds-test/Makefile | 0 .../stateful/lib/ds-test/default.nix | 0 .../stateful/lib/ds-test/demo/demo.sol | 0 .../stateful/lib/ds-test/src/test.sol | 0 .../cerc-go-ethereum-foundry/stateful/src/Stateful.sol | 0 .../stateful/src/test/Stateful.t.sol | 0 .../data/container-build}/cerc-go-ethereum/build.sh | 0 .../container-build}/cerc-ipld-eth-beacon-db/build.sh | 0 .../cerc-ipld-eth-beacon-indexer/build.sh | 0 .../data/container-build}/cerc-ipld-eth-db/build.sh | 0 .../data/container-build}/cerc-ipld-eth-server/build.sh | 0 .../data/container-build}/cerc-keycloak/Dockerfile | 0 .../data/container-build}/cerc-keycloak/build.sh | 0 .../cerc-laconic-registry-cli/Dockerfile | 0 .../container-build}/cerc-laconic-registry-cli/build.sh | 0 .../data/container-build}/cerc-laconicd/build.sh | 0 .../data/container-build}/cerc-lighthouse/Dockerfile | 0 .../data/container-build}/cerc-lighthouse/build.sh | 0 .../container-build}/cerc-lighthouse/start-lighthouse.sh | 0 .../data/container-build}/cerc-test-container/Dockerfile | 0 .../data/container-build}/cerc-test-container/build.sh | 0 .../data/container-build}/cerc-test-container/run.sh | 0 .../data/container-build}/cerc-test-contract/build.sh | 0 .../data/container-build}/cerc-tx-spammer/build.sh | 0 .../container-build}/cerc-uniswap-v3-info/Dockerfile | 0 .../data/container-build}/cerc-uniswap-v3-info/build.sh | 0 .../data/container-build}/cerc-watcher-erc20/Dockerfile | 0 .../data/container-build}/cerc-watcher-erc20/build.sh | 0 .../data/container-build}/cerc-watcher-erc721/Dockerfile | 0 .../data/container-build}/cerc-watcher-erc721/build.sh | 0 .../container-build}/cerc-watcher-mobymask/Dockerfile | 0 .../data/container-build}/cerc-watcher-mobymask/build.sh | 0 .../container-build}/cerc-watcher-uniswap-v3/Dockerfile | 0 .../container-build}/cerc-watcher-uniswap-v3/build.sh | 0 .../data/container-build}/default-build.sh | 0 {stacks => app/data/stacks}/erc20/README.md | 0 {stacks => app/data/stacks}/erc20/stack.yml | 0 {stacks => app/data/stacks}/erc721/README.md | 0 {stacks => app/data/stacks}/erc721/stack.yml | 0 {stacks => app/data/stacks}/fixturenet-eth/README.md | 0 {stacks => app/data/stacks}/fixturenet-eth/stack.yml | 0 {stacks => app/data/stacks}/laconicd/README.md | 0 {stacks => app/data/stacks}/laconicd/stack.yml | 0 {stacks => app/data/stacks}/mobymask/README.md | 0 {stacks => app/data/stacks}/mobymask/stack.yml | 0 {stacks => app/data/stacks}/uniswap-v3/README.md | 0 {stacks => app/data/stacks}/uniswap-v3/stack.yml | 0 app/deploy_system.py | 7 +++++-- 124 files changed, 9 insertions(+), 7 deletions(-) rename {compose => app/data/compose}/docker-compose-contract.yml (100%) rename {compose => app/data/compose}/docker-compose-eth-probe.yml (100%) rename {compose => app/data/compose}/docker-compose-eth-statediff-fill-service.yml (100%) rename {compose => app/data/compose}/docker-compose-fixturenet-eth.yml (100%) rename {compose => app/data/compose}/docker-compose-fixturenet-laconicd.yml (100%) rename {compose => app/data/compose}/docker-compose-go-ethereum-foundry.yml (100%) rename {compose => app/data/compose}/docker-compose-ipld-eth-beacon-db.yml (100%) rename {compose => app/data/compose}/docker-compose-ipld-eth-beacon-indexer.yml (100%) rename {compose => app/data/compose}/docker-compose-ipld-eth-db.yml (100%) rename {compose => app/data/compose}/docker-compose-ipld-eth-server.yml (100%) rename {compose => app/data/compose}/docker-compose-keycloak.yml (100%) rename {compose => app/data/compose}/docker-compose-laconicd.yml (100%) rename {compose => app/data/compose}/docker-compose-prometheus-grafana.yml (100%) rename {compose => app/data/compose}/docker-compose-test.yml (100%) rename {compose => app/data/compose}/docker-compose-tx-spammer.yml (100%) rename {compose => app/data/compose}/docker-compose-watcher-erc20.yml (100%) rename {compose => app/data/compose}/docker-compose-watcher-erc721.yml (100%) rename {compose => app/data/compose}/docker-compose-watcher-mobymask.yml (100%) rename {compose => app/data/compose}/docker-compose-watcher-uniswap-v3.yml (100%) rename {config => app/data/config}/fixturenet-eth/fixturenet-eth.env (100%) rename {config => app/data/config}/fixturenet-laconicd/create-fixturenet.sh (100%) rename {config => app/data/config}/ipld-eth-beacon-indexer/indexer.env (100%) rename {config => app/data/config}/ipld-eth-server/chain.json (100%) rename {config => app/data/config}/keycloak/import/cerc-realm.json (100%) rename {config => app/data/config}/keycloak/keycloak.env (100%) rename {config => app/data/config}/keycloak/nginx/keycloak_proxy.conf (100%) rename {config => app/data/config}/postgresql/create-pg-stat-statements.sql (100%) rename {config => app/data/config}/postgresql/multiple-postgressql-databases.sh (100%) rename {config => app/data/config}/tx-spammer/tx-spammer.env (100%) rename {config => app/data/config}/watcher-erc20/erc20-watcher.toml (100%) rename {config => app/data/config}/watcher-erc721/erc721-watcher.toml (100%) rename {config => app/data/config}/watcher-mobymask/mobymask-watcher-db.sql (100%) rename {config => app/data/config}/watcher-mobymask/mobymask-watcher.toml (100%) rename {config => app/data/config}/watcher-uniswap-v3/erc20-watcher.toml (100%) rename {config => app/data/config}/watcher-uniswap-v3/run.sh (100%) rename {config => app/data/config}/watcher-uniswap-v3/uni-info-watcher.toml (100%) rename {config => app/data/config}/watcher-uniswap-v3/uni-watcher.toml (100%) rename {config => app/data/config}/watcher-uniswap-v3/watch-contract.sh (100%) rename {container-build => app/data/container-build}/cerc-builder-js/Dockerfile (100%) rename {container-build => app/data/container-build}/cerc-builder-js/README.md (100%) rename {container-build => app/data/container-build}/cerc-builder-js/build-npm-package-local-dependencies.sh (100%) rename {container-build => app/data/container-build}/cerc-builder-js/build-npm-package.sh (100%) rename {container-build => app/data/container-build}/cerc-builder-js/entrypoint.sh (100%) rename {container-build => app/data/container-build}/cerc-builder-js/yarn-local-registry-fixup.sh (100%) rename {container-build => app/data/container-build}/cerc-eth-probe/build.sh (100%) rename {container-build => app/data/container-build}/cerc-eth-statediff-fill-service/build.sh (100%) rename {container-build => app/data/container-build}/cerc-eth-statediff-service/build.sh (100%) rename {container-build => app/data/container-build}/cerc-fixturenet-eth-geth/Dockerfile (100%) rename {container-build => app/data/container-build}/cerc-fixturenet-eth-geth/build.sh (100%) rename {container-build => app/data/container-build}/cerc-fixturenet-eth-geth/genesis/Makefile (100%) rename {container-build => app/data/container-build}/cerc-fixturenet-eth-geth/genesis/accounts/import_keys.sh (100%) rename {container-build => app/data/container-build}/cerc-fixturenet-eth-geth/genesis/accounts/mnemonic_to_csv.py (100%) rename {container-build => app/data/container-build}/cerc-fixturenet-eth-geth/genesis/el/build_el.sh (100%) rename {container-build => app/data/container-build}/cerc-fixturenet-eth-geth/genesis/el/el-config.yaml (100%) rename {container-build => app/data/container-build}/cerc-fixturenet-eth-geth/run-el.sh (100%) rename {container-build => app/data/container-build}/cerc-fixturenet-eth-lighthouse/Dockerfile (100%) rename {container-build => app/data/container-build}/cerc-fixturenet-eth-lighthouse/build.sh (100%) rename {container-build => app/data/container-build}/cerc-fixturenet-eth-lighthouse/genesis/Makefile (100%) rename {container-build => app/data/container-build}/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh (100%) rename {container-build => app/data/container-build}/cerc-fixturenet-eth-lighthouse/genesis/cl/bootnode.sh (100%) rename {container-build => app/data/container-build}/cerc-fixturenet-eth-lighthouse/genesis/cl/build_cl.sh (100%) rename {container-build => app/data/container-build}/cerc-fixturenet-eth-lighthouse/genesis/cl/ready.sh (100%) rename {container-build => app/data/container-build}/cerc-fixturenet-eth-lighthouse/genesis/cl/reset_genesis_time.sh (100%) rename {container-build => app/data/container-build}/cerc-fixturenet-eth-lighthouse/genesis/cl/validator_client.sh (100%) rename {container-build => app/data/container-build}/cerc-fixturenet-eth-lighthouse/genesis/cl/vars.env (100%) rename {container-build => app/data/container-build}/cerc-fixturenet-eth-lighthouse/run-cl.sh (100%) rename {container-build => app/data/container-build}/cerc-fixturenet-eth-lighthouse/scripts/status.sh (100%) rename {container-build => app/data/container-build}/cerc-go-ethereum-foundry/Dockerfile (100%) rename {container-build => app/data/container-build}/cerc-go-ethereum-foundry/build.sh (100%) rename {container-build => app/data/container-build}/cerc-go-ethereum-foundry/deploy-local-network.sh (100%) rename {container-build => app/data/container-build}/cerc-go-ethereum-foundry/genesis-automine.json (100%) rename {container-build => app/data/container-build}/cerc-go-ethereum-foundry/genesis.json (100%) rename {container-build => app/data/container-build}/cerc-go-ethereum-foundry/start-private-network.sh (100%) rename {container-build => app/data/container-build}/cerc-go-ethereum-foundry/stateful/foundry.toml (100%) rename {container-build => app/data/container-build}/cerc-go-ethereum-foundry/stateful/lib/ds-test/LICENSE (100%) rename {container-build => app/data/container-build}/cerc-go-ethereum-foundry/stateful/lib/ds-test/Makefile (100%) rename {container-build => app/data/container-build}/cerc-go-ethereum-foundry/stateful/lib/ds-test/default.nix (100%) rename {container-build => app/data/container-build}/cerc-go-ethereum-foundry/stateful/lib/ds-test/demo/demo.sol (100%) rename {container-build => app/data/container-build}/cerc-go-ethereum-foundry/stateful/lib/ds-test/src/test.sol (100%) rename {container-build => app/data/container-build}/cerc-go-ethereum-foundry/stateful/src/Stateful.sol (100%) rename {container-build => app/data/container-build}/cerc-go-ethereum-foundry/stateful/src/test/Stateful.t.sol (100%) rename {container-build => app/data/container-build}/cerc-go-ethereum/build.sh (100%) rename {container-build => app/data/container-build}/cerc-ipld-eth-beacon-db/build.sh (100%) rename {container-build => app/data/container-build}/cerc-ipld-eth-beacon-indexer/build.sh (100%) rename {container-build => app/data/container-build}/cerc-ipld-eth-db/build.sh (100%) rename {container-build => app/data/container-build}/cerc-ipld-eth-server/build.sh (100%) rename {container-build => app/data/container-build}/cerc-keycloak/Dockerfile (100%) rename {container-build => app/data/container-build}/cerc-keycloak/build.sh (100%) rename {container-build => app/data/container-build}/cerc-laconic-registry-cli/Dockerfile (100%) rename {container-build => app/data/container-build}/cerc-laconic-registry-cli/build.sh (100%) rename {container-build => app/data/container-build}/cerc-laconicd/build.sh (100%) rename {container-build => app/data/container-build}/cerc-lighthouse/Dockerfile (100%) rename {container-build => app/data/container-build}/cerc-lighthouse/build.sh (100%) rename {container-build => app/data/container-build}/cerc-lighthouse/start-lighthouse.sh (100%) rename {container-build => app/data/container-build}/cerc-test-container/Dockerfile (100%) rename {container-build => app/data/container-build}/cerc-test-container/build.sh (100%) rename {container-build => app/data/container-build}/cerc-test-container/run.sh (100%) rename {container-build => app/data/container-build}/cerc-test-contract/build.sh (100%) rename {container-build => app/data/container-build}/cerc-tx-spammer/build.sh (100%) rename {container-build => app/data/container-build}/cerc-uniswap-v3-info/Dockerfile (100%) rename {container-build => app/data/container-build}/cerc-uniswap-v3-info/build.sh (100%) rename {container-build => app/data/container-build}/cerc-watcher-erc20/Dockerfile (100%) rename {container-build => app/data/container-build}/cerc-watcher-erc20/build.sh (100%) rename {container-build => app/data/container-build}/cerc-watcher-erc721/Dockerfile (100%) rename {container-build => app/data/container-build}/cerc-watcher-erc721/build.sh (100%) rename {container-build => app/data/container-build}/cerc-watcher-mobymask/Dockerfile (100%) rename {container-build => app/data/container-build}/cerc-watcher-mobymask/build.sh (100%) rename {container-build => app/data/container-build}/cerc-watcher-uniswap-v3/Dockerfile (100%) rename {container-build => app/data/container-build}/cerc-watcher-uniswap-v3/build.sh (100%) rename {container-build => app/data/container-build}/default-build.sh (100%) rename {stacks => app/data/stacks}/erc20/README.md (100%) rename {stacks => app/data/stacks}/erc20/stack.yml (100%) rename {stacks => app/data/stacks}/erc721/README.md (100%) rename {stacks => app/data/stacks}/erc721/stack.yml (100%) rename {stacks => app/data/stacks}/fixturenet-eth/README.md (100%) rename {stacks => app/data/stacks}/fixturenet-eth/stack.yml (100%) rename {stacks => app/data/stacks}/laconicd/README.md (100%) rename {stacks => app/data/stacks}/laconicd/stack.yml (100%) rename {stacks => app/data/stacks}/mobymask/README.md (100%) rename {stacks => app/data/stacks}/mobymask/stack.yml (100%) rename {stacks => app/data/stacks}/uniswap-v3/README.md (100%) rename {stacks => app/data/stacks}/uniswap-v3/stack.yml (100%) diff --git a/app/build_containers.py b/app/build_containers.py index fde6c305..87c92867 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -43,8 +43,9 @@ def command(ctx, include, exclude): dry_run = ctx.obj.dry_run local_stack = ctx.obj.local_stack - # TODO: check this still works in the shiv package scenario - container_build_dir = os.path.join(os.getcwd(), "container-build") + # See: https://stackoverflow.com/a/20885799/1701505 + from . import data + container_build_dir = importlib.resources.path(data, "container-build") if local_stack: dev_root_path = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] @@ -58,8 +59,6 @@ def command(ctx, include, exclude): if not os.path.isdir(dev_root_path): print('Dev root directory doesn\'t exist, creating') - # See: https://stackoverflow.com/a/20885799/1701505 - from . import data with importlib.resources.open_text(data, "container-image-list.txt") as container_list_file: containers = container_list_file.read().splitlines() @@ -90,7 +89,7 @@ def command(ctx, include, exclude): # Check if we have a repo for this container. If not, set the context dir to the container-build subdir repo_full_path = os.path.join(dev_root_path, repo_dir) repo_dir_or_build_dir = repo_dir if os.path.exists(repo_full_path) else build_dir - build_command = os.path.join("container-build", "default-build.sh") + f" {container} {repo_dir_or_build_dir}" + build_command = os.path.join(container_build_dir, "default-build.sh") + f" {container} {repo_dir_or_build_dir}" if not dry_run: if verbose: print(f"Executing: {build_command}") diff --git a/compose/docker-compose-contract.yml b/app/data/compose/docker-compose-contract.yml similarity index 100% rename from compose/docker-compose-contract.yml rename to app/data/compose/docker-compose-contract.yml diff --git a/compose/docker-compose-eth-probe.yml b/app/data/compose/docker-compose-eth-probe.yml similarity index 100% rename from compose/docker-compose-eth-probe.yml rename to app/data/compose/docker-compose-eth-probe.yml diff --git a/compose/docker-compose-eth-statediff-fill-service.yml b/app/data/compose/docker-compose-eth-statediff-fill-service.yml similarity index 100% rename from compose/docker-compose-eth-statediff-fill-service.yml rename to app/data/compose/docker-compose-eth-statediff-fill-service.yml diff --git a/compose/docker-compose-fixturenet-eth.yml b/app/data/compose/docker-compose-fixturenet-eth.yml similarity index 100% rename from compose/docker-compose-fixturenet-eth.yml rename to app/data/compose/docker-compose-fixturenet-eth.yml diff --git a/compose/docker-compose-fixturenet-laconicd.yml b/app/data/compose/docker-compose-fixturenet-laconicd.yml similarity index 100% rename from compose/docker-compose-fixturenet-laconicd.yml rename to app/data/compose/docker-compose-fixturenet-laconicd.yml diff --git a/compose/docker-compose-go-ethereum-foundry.yml b/app/data/compose/docker-compose-go-ethereum-foundry.yml similarity index 100% rename from compose/docker-compose-go-ethereum-foundry.yml rename to app/data/compose/docker-compose-go-ethereum-foundry.yml diff --git a/compose/docker-compose-ipld-eth-beacon-db.yml b/app/data/compose/docker-compose-ipld-eth-beacon-db.yml similarity index 100% rename from compose/docker-compose-ipld-eth-beacon-db.yml rename to app/data/compose/docker-compose-ipld-eth-beacon-db.yml diff --git a/compose/docker-compose-ipld-eth-beacon-indexer.yml b/app/data/compose/docker-compose-ipld-eth-beacon-indexer.yml similarity index 100% rename from compose/docker-compose-ipld-eth-beacon-indexer.yml rename to app/data/compose/docker-compose-ipld-eth-beacon-indexer.yml diff --git a/compose/docker-compose-ipld-eth-db.yml b/app/data/compose/docker-compose-ipld-eth-db.yml similarity index 100% rename from compose/docker-compose-ipld-eth-db.yml rename to app/data/compose/docker-compose-ipld-eth-db.yml diff --git a/compose/docker-compose-ipld-eth-server.yml b/app/data/compose/docker-compose-ipld-eth-server.yml similarity index 100% rename from compose/docker-compose-ipld-eth-server.yml rename to app/data/compose/docker-compose-ipld-eth-server.yml diff --git a/compose/docker-compose-keycloak.yml b/app/data/compose/docker-compose-keycloak.yml similarity index 100% rename from compose/docker-compose-keycloak.yml rename to app/data/compose/docker-compose-keycloak.yml diff --git a/compose/docker-compose-laconicd.yml b/app/data/compose/docker-compose-laconicd.yml similarity index 100% rename from compose/docker-compose-laconicd.yml rename to app/data/compose/docker-compose-laconicd.yml diff --git a/compose/docker-compose-prometheus-grafana.yml b/app/data/compose/docker-compose-prometheus-grafana.yml similarity index 100% rename from compose/docker-compose-prometheus-grafana.yml rename to app/data/compose/docker-compose-prometheus-grafana.yml diff --git a/compose/docker-compose-test.yml b/app/data/compose/docker-compose-test.yml similarity index 100% rename from compose/docker-compose-test.yml rename to app/data/compose/docker-compose-test.yml diff --git a/compose/docker-compose-tx-spammer.yml b/app/data/compose/docker-compose-tx-spammer.yml similarity index 100% rename from compose/docker-compose-tx-spammer.yml rename to app/data/compose/docker-compose-tx-spammer.yml diff --git a/compose/docker-compose-watcher-erc20.yml b/app/data/compose/docker-compose-watcher-erc20.yml similarity index 100% rename from compose/docker-compose-watcher-erc20.yml rename to app/data/compose/docker-compose-watcher-erc20.yml diff --git a/compose/docker-compose-watcher-erc721.yml b/app/data/compose/docker-compose-watcher-erc721.yml similarity index 100% rename from compose/docker-compose-watcher-erc721.yml rename to app/data/compose/docker-compose-watcher-erc721.yml diff --git a/compose/docker-compose-watcher-mobymask.yml b/app/data/compose/docker-compose-watcher-mobymask.yml similarity index 100% rename from compose/docker-compose-watcher-mobymask.yml rename to app/data/compose/docker-compose-watcher-mobymask.yml diff --git a/compose/docker-compose-watcher-uniswap-v3.yml b/app/data/compose/docker-compose-watcher-uniswap-v3.yml similarity index 100% rename from compose/docker-compose-watcher-uniswap-v3.yml rename to app/data/compose/docker-compose-watcher-uniswap-v3.yml diff --git a/config/fixturenet-eth/fixturenet-eth.env b/app/data/config/fixturenet-eth/fixturenet-eth.env similarity index 100% rename from config/fixturenet-eth/fixturenet-eth.env rename to app/data/config/fixturenet-eth/fixturenet-eth.env diff --git a/config/fixturenet-laconicd/create-fixturenet.sh b/app/data/config/fixturenet-laconicd/create-fixturenet.sh similarity index 100% rename from config/fixturenet-laconicd/create-fixturenet.sh rename to app/data/config/fixturenet-laconicd/create-fixturenet.sh diff --git a/config/ipld-eth-beacon-indexer/indexer.env b/app/data/config/ipld-eth-beacon-indexer/indexer.env similarity index 100% rename from config/ipld-eth-beacon-indexer/indexer.env rename to app/data/config/ipld-eth-beacon-indexer/indexer.env diff --git a/config/ipld-eth-server/chain.json b/app/data/config/ipld-eth-server/chain.json similarity index 100% rename from config/ipld-eth-server/chain.json rename to app/data/config/ipld-eth-server/chain.json diff --git a/config/keycloak/import/cerc-realm.json b/app/data/config/keycloak/import/cerc-realm.json similarity index 100% rename from config/keycloak/import/cerc-realm.json rename to app/data/config/keycloak/import/cerc-realm.json diff --git a/config/keycloak/keycloak.env b/app/data/config/keycloak/keycloak.env similarity index 100% rename from config/keycloak/keycloak.env rename to app/data/config/keycloak/keycloak.env diff --git a/config/keycloak/nginx/keycloak_proxy.conf b/app/data/config/keycloak/nginx/keycloak_proxy.conf similarity index 100% rename from config/keycloak/nginx/keycloak_proxy.conf rename to app/data/config/keycloak/nginx/keycloak_proxy.conf diff --git a/config/postgresql/create-pg-stat-statements.sql b/app/data/config/postgresql/create-pg-stat-statements.sql similarity index 100% rename from config/postgresql/create-pg-stat-statements.sql rename to app/data/config/postgresql/create-pg-stat-statements.sql diff --git a/config/postgresql/multiple-postgressql-databases.sh b/app/data/config/postgresql/multiple-postgressql-databases.sh similarity index 100% rename from config/postgresql/multiple-postgressql-databases.sh rename to app/data/config/postgresql/multiple-postgressql-databases.sh diff --git a/config/tx-spammer/tx-spammer.env b/app/data/config/tx-spammer/tx-spammer.env similarity index 100% rename from config/tx-spammer/tx-spammer.env rename to app/data/config/tx-spammer/tx-spammer.env diff --git a/config/watcher-erc20/erc20-watcher.toml b/app/data/config/watcher-erc20/erc20-watcher.toml similarity index 100% rename from config/watcher-erc20/erc20-watcher.toml rename to app/data/config/watcher-erc20/erc20-watcher.toml diff --git a/config/watcher-erc721/erc721-watcher.toml b/app/data/config/watcher-erc721/erc721-watcher.toml similarity index 100% rename from config/watcher-erc721/erc721-watcher.toml rename to app/data/config/watcher-erc721/erc721-watcher.toml diff --git a/config/watcher-mobymask/mobymask-watcher-db.sql b/app/data/config/watcher-mobymask/mobymask-watcher-db.sql similarity index 100% rename from config/watcher-mobymask/mobymask-watcher-db.sql rename to app/data/config/watcher-mobymask/mobymask-watcher-db.sql diff --git a/config/watcher-mobymask/mobymask-watcher.toml b/app/data/config/watcher-mobymask/mobymask-watcher.toml similarity index 100% rename from config/watcher-mobymask/mobymask-watcher.toml rename to app/data/config/watcher-mobymask/mobymask-watcher.toml diff --git a/config/watcher-uniswap-v3/erc20-watcher.toml b/app/data/config/watcher-uniswap-v3/erc20-watcher.toml similarity index 100% rename from config/watcher-uniswap-v3/erc20-watcher.toml rename to app/data/config/watcher-uniswap-v3/erc20-watcher.toml diff --git a/config/watcher-uniswap-v3/run.sh b/app/data/config/watcher-uniswap-v3/run.sh similarity index 100% rename from config/watcher-uniswap-v3/run.sh rename to app/data/config/watcher-uniswap-v3/run.sh diff --git a/config/watcher-uniswap-v3/uni-info-watcher.toml b/app/data/config/watcher-uniswap-v3/uni-info-watcher.toml similarity index 100% rename from config/watcher-uniswap-v3/uni-info-watcher.toml rename to app/data/config/watcher-uniswap-v3/uni-info-watcher.toml diff --git a/config/watcher-uniswap-v3/uni-watcher.toml b/app/data/config/watcher-uniswap-v3/uni-watcher.toml similarity index 100% rename from config/watcher-uniswap-v3/uni-watcher.toml rename to app/data/config/watcher-uniswap-v3/uni-watcher.toml diff --git a/config/watcher-uniswap-v3/watch-contract.sh b/app/data/config/watcher-uniswap-v3/watch-contract.sh similarity index 100% rename from config/watcher-uniswap-v3/watch-contract.sh rename to app/data/config/watcher-uniswap-v3/watch-contract.sh diff --git a/container-build/cerc-builder-js/Dockerfile b/app/data/container-build/cerc-builder-js/Dockerfile similarity index 100% rename from container-build/cerc-builder-js/Dockerfile rename to app/data/container-build/cerc-builder-js/Dockerfile diff --git a/container-build/cerc-builder-js/README.md b/app/data/container-build/cerc-builder-js/README.md similarity index 100% rename from container-build/cerc-builder-js/README.md rename to app/data/container-build/cerc-builder-js/README.md diff --git a/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh b/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh similarity index 100% rename from container-build/cerc-builder-js/build-npm-package-local-dependencies.sh rename to app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh diff --git a/container-build/cerc-builder-js/build-npm-package.sh b/app/data/container-build/cerc-builder-js/build-npm-package.sh similarity index 100% rename from container-build/cerc-builder-js/build-npm-package.sh rename to app/data/container-build/cerc-builder-js/build-npm-package.sh diff --git a/container-build/cerc-builder-js/entrypoint.sh b/app/data/container-build/cerc-builder-js/entrypoint.sh similarity index 100% rename from container-build/cerc-builder-js/entrypoint.sh rename to app/data/container-build/cerc-builder-js/entrypoint.sh diff --git a/container-build/cerc-builder-js/yarn-local-registry-fixup.sh b/app/data/container-build/cerc-builder-js/yarn-local-registry-fixup.sh similarity index 100% rename from container-build/cerc-builder-js/yarn-local-registry-fixup.sh rename to app/data/container-build/cerc-builder-js/yarn-local-registry-fixup.sh diff --git a/container-build/cerc-eth-probe/build.sh b/app/data/container-build/cerc-eth-probe/build.sh similarity index 100% rename from container-build/cerc-eth-probe/build.sh rename to app/data/container-build/cerc-eth-probe/build.sh diff --git a/container-build/cerc-eth-statediff-fill-service/build.sh b/app/data/container-build/cerc-eth-statediff-fill-service/build.sh similarity index 100% rename from container-build/cerc-eth-statediff-fill-service/build.sh rename to app/data/container-build/cerc-eth-statediff-fill-service/build.sh diff --git a/container-build/cerc-eth-statediff-service/build.sh b/app/data/container-build/cerc-eth-statediff-service/build.sh similarity index 100% rename from container-build/cerc-eth-statediff-service/build.sh rename to app/data/container-build/cerc-eth-statediff-service/build.sh diff --git a/container-build/cerc-fixturenet-eth-geth/Dockerfile b/app/data/container-build/cerc-fixturenet-eth-geth/Dockerfile similarity index 100% rename from container-build/cerc-fixturenet-eth-geth/Dockerfile rename to app/data/container-build/cerc-fixturenet-eth-geth/Dockerfile diff --git a/container-build/cerc-fixturenet-eth-geth/build.sh b/app/data/container-build/cerc-fixturenet-eth-geth/build.sh similarity index 100% rename from container-build/cerc-fixturenet-eth-geth/build.sh rename to app/data/container-build/cerc-fixturenet-eth-geth/build.sh diff --git a/container-build/cerc-fixturenet-eth-geth/genesis/Makefile b/app/data/container-build/cerc-fixturenet-eth-geth/genesis/Makefile similarity index 100% rename from container-build/cerc-fixturenet-eth-geth/genesis/Makefile rename to app/data/container-build/cerc-fixturenet-eth-geth/genesis/Makefile diff --git a/container-build/cerc-fixturenet-eth-geth/genesis/accounts/import_keys.sh b/app/data/container-build/cerc-fixturenet-eth-geth/genesis/accounts/import_keys.sh similarity index 100% rename from container-build/cerc-fixturenet-eth-geth/genesis/accounts/import_keys.sh rename to app/data/container-build/cerc-fixturenet-eth-geth/genesis/accounts/import_keys.sh diff --git a/container-build/cerc-fixturenet-eth-geth/genesis/accounts/mnemonic_to_csv.py b/app/data/container-build/cerc-fixturenet-eth-geth/genesis/accounts/mnemonic_to_csv.py similarity index 100% rename from container-build/cerc-fixturenet-eth-geth/genesis/accounts/mnemonic_to_csv.py rename to app/data/container-build/cerc-fixturenet-eth-geth/genesis/accounts/mnemonic_to_csv.py diff --git a/container-build/cerc-fixturenet-eth-geth/genesis/el/build_el.sh b/app/data/container-build/cerc-fixturenet-eth-geth/genesis/el/build_el.sh similarity index 100% rename from container-build/cerc-fixturenet-eth-geth/genesis/el/build_el.sh rename to app/data/container-build/cerc-fixturenet-eth-geth/genesis/el/build_el.sh diff --git a/container-build/cerc-fixturenet-eth-geth/genesis/el/el-config.yaml b/app/data/container-build/cerc-fixturenet-eth-geth/genesis/el/el-config.yaml similarity index 100% rename from container-build/cerc-fixturenet-eth-geth/genesis/el/el-config.yaml rename to app/data/container-build/cerc-fixturenet-eth-geth/genesis/el/el-config.yaml diff --git a/container-build/cerc-fixturenet-eth-geth/run-el.sh b/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh similarity index 100% rename from container-build/cerc-fixturenet-eth-geth/run-el.sh rename to app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh diff --git a/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile b/app/data/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile similarity index 100% rename from container-build/cerc-fixturenet-eth-lighthouse/Dockerfile rename to app/data/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile diff --git a/container-build/cerc-fixturenet-eth-lighthouse/build.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/build.sh similarity index 100% rename from container-build/cerc-fixturenet-eth-lighthouse/build.sh rename to app/data/container-build/cerc-fixturenet-eth-lighthouse/build.sh diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/Makefile b/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/Makefile similarity index 100% rename from container-build/cerc-fixturenet-eth-lighthouse/genesis/Makefile rename to app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/Makefile diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh similarity index 100% rename from container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh rename to app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/bootnode.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/bootnode.sh similarity index 100% rename from container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/bootnode.sh rename to app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/bootnode.sh diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/build_cl.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/build_cl.sh similarity index 100% rename from container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/build_cl.sh rename to app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/build_cl.sh diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/ready.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/ready.sh similarity index 100% rename from container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/ready.sh rename to app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/ready.sh diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/reset_genesis_time.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/reset_genesis_time.sh similarity index 100% rename from container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/reset_genesis_time.sh rename to app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/reset_genesis_time.sh diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/validator_client.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/validator_client.sh similarity index 100% rename from container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/validator_client.sh rename to app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/validator_client.sh diff --git a/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/vars.env b/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/vars.env similarity index 100% rename from container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/vars.env rename to app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/vars.env diff --git a/container-build/cerc-fixturenet-eth-lighthouse/run-cl.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/run-cl.sh similarity index 100% rename from container-build/cerc-fixturenet-eth-lighthouse/run-cl.sh rename to app/data/container-build/cerc-fixturenet-eth-lighthouse/run-cl.sh diff --git a/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh similarity index 100% rename from container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh rename to app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh diff --git a/container-build/cerc-go-ethereum-foundry/Dockerfile b/app/data/container-build/cerc-go-ethereum-foundry/Dockerfile similarity index 100% rename from container-build/cerc-go-ethereum-foundry/Dockerfile rename to app/data/container-build/cerc-go-ethereum-foundry/Dockerfile diff --git a/container-build/cerc-go-ethereum-foundry/build.sh b/app/data/container-build/cerc-go-ethereum-foundry/build.sh similarity index 100% rename from container-build/cerc-go-ethereum-foundry/build.sh rename to app/data/container-build/cerc-go-ethereum-foundry/build.sh diff --git a/container-build/cerc-go-ethereum-foundry/deploy-local-network.sh b/app/data/container-build/cerc-go-ethereum-foundry/deploy-local-network.sh similarity index 100% rename from container-build/cerc-go-ethereum-foundry/deploy-local-network.sh rename to app/data/container-build/cerc-go-ethereum-foundry/deploy-local-network.sh diff --git a/container-build/cerc-go-ethereum-foundry/genesis-automine.json b/app/data/container-build/cerc-go-ethereum-foundry/genesis-automine.json similarity index 100% rename from container-build/cerc-go-ethereum-foundry/genesis-automine.json rename to app/data/container-build/cerc-go-ethereum-foundry/genesis-automine.json diff --git a/container-build/cerc-go-ethereum-foundry/genesis.json b/app/data/container-build/cerc-go-ethereum-foundry/genesis.json similarity index 100% rename from container-build/cerc-go-ethereum-foundry/genesis.json rename to app/data/container-build/cerc-go-ethereum-foundry/genesis.json diff --git a/container-build/cerc-go-ethereum-foundry/start-private-network.sh b/app/data/container-build/cerc-go-ethereum-foundry/start-private-network.sh similarity index 100% rename from container-build/cerc-go-ethereum-foundry/start-private-network.sh rename to app/data/container-build/cerc-go-ethereum-foundry/start-private-network.sh diff --git a/container-build/cerc-go-ethereum-foundry/stateful/foundry.toml b/app/data/container-build/cerc-go-ethereum-foundry/stateful/foundry.toml similarity index 100% rename from container-build/cerc-go-ethereum-foundry/stateful/foundry.toml rename to app/data/container-build/cerc-go-ethereum-foundry/stateful/foundry.toml diff --git a/container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/LICENSE b/app/data/container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/LICENSE similarity index 100% rename from container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/LICENSE rename to app/data/container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/LICENSE diff --git a/container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/Makefile b/app/data/container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/Makefile similarity index 100% rename from container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/Makefile rename to app/data/container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/Makefile diff --git a/container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/default.nix b/app/data/container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/default.nix similarity index 100% rename from container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/default.nix rename to app/data/container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/default.nix diff --git a/container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/demo/demo.sol b/app/data/container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/demo/demo.sol similarity index 100% rename from container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/demo/demo.sol rename to app/data/container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/demo/demo.sol diff --git a/container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/src/test.sol b/app/data/container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/src/test.sol similarity index 100% rename from container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/src/test.sol rename to app/data/container-build/cerc-go-ethereum-foundry/stateful/lib/ds-test/src/test.sol diff --git a/container-build/cerc-go-ethereum-foundry/stateful/src/Stateful.sol b/app/data/container-build/cerc-go-ethereum-foundry/stateful/src/Stateful.sol similarity index 100% rename from container-build/cerc-go-ethereum-foundry/stateful/src/Stateful.sol rename to app/data/container-build/cerc-go-ethereum-foundry/stateful/src/Stateful.sol diff --git a/container-build/cerc-go-ethereum-foundry/stateful/src/test/Stateful.t.sol b/app/data/container-build/cerc-go-ethereum-foundry/stateful/src/test/Stateful.t.sol similarity index 100% rename from container-build/cerc-go-ethereum-foundry/stateful/src/test/Stateful.t.sol rename to app/data/container-build/cerc-go-ethereum-foundry/stateful/src/test/Stateful.t.sol diff --git a/container-build/cerc-go-ethereum/build.sh b/app/data/container-build/cerc-go-ethereum/build.sh similarity index 100% rename from container-build/cerc-go-ethereum/build.sh rename to app/data/container-build/cerc-go-ethereum/build.sh diff --git a/container-build/cerc-ipld-eth-beacon-db/build.sh b/app/data/container-build/cerc-ipld-eth-beacon-db/build.sh similarity index 100% rename from container-build/cerc-ipld-eth-beacon-db/build.sh rename to app/data/container-build/cerc-ipld-eth-beacon-db/build.sh diff --git a/container-build/cerc-ipld-eth-beacon-indexer/build.sh b/app/data/container-build/cerc-ipld-eth-beacon-indexer/build.sh similarity index 100% rename from container-build/cerc-ipld-eth-beacon-indexer/build.sh rename to app/data/container-build/cerc-ipld-eth-beacon-indexer/build.sh diff --git a/container-build/cerc-ipld-eth-db/build.sh b/app/data/container-build/cerc-ipld-eth-db/build.sh similarity index 100% rename from container-build/cerc-ipld-eth-db/build.sh rename to app/data/container-build/cerc-ipld-eth-db/build.sh diff --git a/container-build/cerc-ipld-eth-server/build.sh b/app/data/container-build/cerc-ipld-eth-server/build.sh similarity index 100% rename from container-build/cerc-ipld-eth-server/build.sh rename to app/data/container-build/cerc-ipld-eth-server/build.sh diff --git a/container-build/cerc-keycloak/Dockerfile b/app/data/container-build/cerc-keycloak/Dockerfile similarity index 100% rename from container-build/cerc-keycloak/Dockerfile rename to app/data/container-build/cerc-keycloak/Dockerfile diff --git a/container-build/cerc-keycloak/build.sh b/app/data/container-build/cerc-keycloak/build.sh similarity index 100% rename from container-build/cerc-keycloak/build.sh rename to app/data/container-build/cerc-keycloak/build.sh diff --git a/container-build/cerc-laconic-registry-cli/Dockerfile b/app/data/container-build/cerc-laconic-registry-cli/Dockerfile similarity index 100% rename from container-build/cerc-laconic-registry-cli/Dockerfile rename to app/data/container-build/cerc-laconic-registry-cli/Dockerfile diff --git a/container-build/cerc-laconic-registry-cli/build.sh b/app/data/container-build/cerc-laconic-registry-cli/build.sh similarity index 100% rename from container-build/cerc-laconic-registry-cli/build.sh rename to app/data/container-build/cerc-laconic-registry-cli/build.sh diff --git a/container-build/cerc-laconicd/build.sh b/app/data/container-build/cerc-laconicd/build.sh similarity index 100% rename from container-build/cerc-laconicd/build.sh rename to app/data/container-build/cerc-laconicd/build.sh diff --git a/container-build/cerc-lighthouse/Dockerfile b/app/data/container-build/cerc-lighthouse/Dockerfile similarity index 100% rename from container-build/cerc-lighthouse/Dockerfile rename to app/data/container-build/cerc-lighthouse/Dockerfile diff --git a/container-build/cerc-lighthouse/build.sh b/app/data/container-build/cerc-lighthouse/build.sh similarity index 100% rename from container-build/cerc-lighthouse/build.sh rename to app/data/container-build/cerc-lighthouse/build.sh diff --git a/container-build/cerc-lighthouse/start-lighthouse.sh b/app/data/container-build/cerc-lighthouse/start-lighthouse.sh similarity index 100% rename from container-build/cerc-lighthouse/start-lighthouse.sh rename to app/data/container-build/cerc-lighthouse/start-lighthouse.sh diff --git a/container-build/cerc-test-container/Dockerfile b/app/data/container-build/cerc-test-container/Dockerfile similarity index 100% rename from container-build/cerc-test-container/Dockerfile rename to app/data/container-build/cerc-test-container/Dockerfile diff --git a/container-build/cerc-test-container/build.sh b/app/data/container-build/cerc-test-container/build.sh similarity index 100% rename from container-build/cerc-test-container/build.sh rename to app/data/container-build/cerc-test-container/build.sh diff --git a/container-build/cerc-test-container/run.sh b/app/data/container-build/cerc-test-container/run.sh similarity index 100% rename from container-build/cerc-test-container/run.sh rename to app/data/container-build/cerc-test-container/run.sh diff --git a/container-build/cerc-test-contract/build.sh b/app/data/container-build/cerc-test-contract/build.sh similarity index 100% rename from container-build/cerc-test-contract/build.sh rename to app/data/container-build/cerc-test-contract/build.sh diff --git a/container-build/cerc-tx-spammer/build.sh b/app/data/container-build/cerc-tx-spammer/build.sh similarity index 100% rename from container-build/cerc-tx-spammer/build.sh rename to app/data/container-build/cerc-tx-spammer/build.sh diff --git a/container-build/cerc-uniswap-v3-info/Dockerfile b/app/data/container-build/cerc-uniswap-v3-info/Dockerfile similarity index 100% rename from container-build/cerc-uniswap-v3-info/Dockerfile rename to app/data/container-build/cerc-uniswap-v3-info/Dockerfile diff --git a/container-build/cerc-uniswap-v3-info/build.sh b/app/data/container-build/cerc-uniswap-v3-info/build.sh similarity index 100% rename from container-build/cerc-uniswap-v3-info/build.sh rename to app/data/container-build/cerc-uniswap-v3-info/build.sh diff --git a/container-build/cerc-watcher-erc20/Dockerfile b/app/data/container-build/cerc-watcher-erc20/Dockerfile similarity index 100% rename from container-build/cerc-watcher-erc20/Dockerfile rename to app/data/container-build/cerc-watcher-erc20/Dockerfile diff --git a/container-build/cerc-watcher-erc20/build.sh b/app/data/container-build/cerc-watcher-erc20/build.sh similarity index 100% rename from container-build/cerc-watcher-erc20/build.sh rename to app/data/container-build/cerc-watcher-erc20/build.sh diff --git a/container-build/cerc-watcher-erc721/Dockerfile b/app/data/container-build/cerc-watcher-erc721/Dockerfile similarity index 100% rename from container-build/cerc-watcher-erc721/Dockerfile rename to app/data/container-build/cerc-watcher-erc721/Dockerfile diff --git a/container-build/cerc-watcher-erc721/build.sh b/app/data/container-build/cerc-watcher-erc721/build.sh similarity index 100% rename from container-build/cerc-watcher-erc721/build.sh rename to app/data/container-build/cerc-watcher-erc721/build.sh diff --git a/container-build/cerc-watcher-mobymask/Dockerfile b/app/data/container-build/cerc-watcher-mobymask/Dockerfile similarity index 100% rename from container-build/cerc-watcher-mobymask/Dockerfile rename to app/data/container-build/cerc-watcher-mobymask/Dockerfile diff --git a/container-build/cerc-watcher-mobymask/build.sh b/app/data/container-build/cerc-watcher-mobymask/build.sh similarity index 100% rename from container-build/cerc-watcher-mobymask/build.sh rename to app/data/container-build/cerc-watcher-mobymask/build.sh diff --git a/container-build/cerc-watcher-uniswap-v3/Dockerfile b/app/data/container-build/cerc-watcher-uniswap-v3/Dockerfile similarity index 100% rename from container-build/cerc-watcher-uniswap-v3/Dockerfile rename to app/data/container-build/cerc-watcher-uniswap-v3/Dockerfile diff --git a/container-build/cerc-watcher-uniswap-v3/build.sh b/app/data/container-build/cerc-watcher-uniswap-v3/build.sh similarity index 100% rename from container-build/cerc-watcher-uniswap-v3/build.sh rename to app/data/container-build/cerc-watcher-uniswap-v3/build.sh diff --git a/container-build/default-build.sh b/app/data/container-build/default-build.sh similarity index 100% rename from container-build/default-build.sh rename to app/data/container-build/default-build.sh diff --git a/stacks/erc20/README.md b/app/data/stacks/erc20/README.md similarity index 100% rename from stacks/erc20/README.md rename to app/data/stacks/erc20/README.md diff --git a/stacks/erc20/stack.yml b/app/data/stacks/erc20/stack.yml similarity index 100% rename from stacks/erc20/stack.yml rename to app/data/stacks/erc20/stack.yml diff --git a/stacks/erc721/README.md b/app/data/stacks/erc721/README.md similarity index 100% rename from stacks/erc721/README.md rename to app/data/stacks/erc721/README.md diff --git a/stacks/erc721/stack.yml b/app/data/stacks/erc721/stack.yml similarity index 100% rename from stacks/erc721/stack.yml rename to app/data/stacks/erc721/stack.yml diff --git a/stacks/fixturenet-eth/README.md b/app/data/stacks/fixturenet-eth/README.md similarity index 100% rename from stacks/fixturenet-eth/README.md rename to app/data/stacks/fixturenet-eth/README.md diff --git a/stacks/fixturenet-eth/stack.yml b/app/data/stacks/fixturenet-eth/stack.yml similarity index 100% rename from stacks/fixturenet-eth/stack.yml rename to app/data/stacks/fixturenet-eth/stack.yml diff --git a/stacks/laconicd/README.md b/app/data/stacks/laconicd/README.md similarity index 100% rename from stacks/laconicd/README.md rename to app/data/stacks/laconicd/README.md diff --git a/stacks/laconicd/stack.yml b/app/data/stacks/laconicd/stack.yml similarity index 100% rename from stacks/laconicd/stack.yml rename to app/data/stacks/laconicd/stack.yml diff --git a/stacks/mobymask/README.md b/app/data/stacks/mobymask/README.md similarity index 100% rename from stacks/mobymask/README.md rename to app/data/stacks/mobymask/README.md diff --git a/stacks/mobymask/stack.yml b/app/data/stacks/mobymask/stack.yml similarity index 100% rename from stacks/mobymask/stack.yml rename to app/data/stacks/mobymask/stack.yml diff --git a/stacks/uniswap-v3/README.md b/app/data/stacks/uniswap-v3/README.md similarity index 100% rename from stacks/uniswap-v3/README.md rename to app/data/stacks/uniswap-v3/README.md diff --git a/stacks/uniswap-v3/stack.yml b/app/data/stacks/uniswap-v3/stack.yml similarity index 100% rename from stacks/uniswap-v3/stack.yml rename to app/data/stacks/uniswap-v3/stack.yml diff --git a/app/deploy_system.py b/app/deploy_system.py index 169e0d6b..cb9c2efa 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -40,6 +40,10 @@ def command(ctx, include, exclude, cluster, command, services): verbose = ctx.obj.verbose dry_run = ctx.obj.dry_run + # See: https://stackoverflow.com/a/20885799/1701505 + from . import data + compose_dir = importlib.resources.path(data, "compose") + if cluster is None: # Create default unique, stable cluster name from confile file path # TODO: change this to the config file path @@ -49,7 +53,6 @@ def command(ctx, include, exclude, cluster, command, services): if verbose: print(f"Using cluster name: {cluster}") - # See: https://stackoverflow.com/a/20885799/1701505 from . import data with importlib.resources.open_text(data, "pod-list.txt") as pod_list_file: pods = pod_list_file.read().splitlines() @@ -62,7 +65,7 @@ def command(ctx, include, exclude, cluster, command, services): compose_files = [] for pod in pods: if include_exclude_check(pod, include, exclude): - compose_file_name = os.path.join("compose", f"docker-compose-{pod}.yml") + compose_file_name = os.path.join(compose_dir, f"docker-compose-{pod}.yml") compose_files.append(compose_file_name) else: if verbose: From b4b1ec3df8a1cbac998b142cfaddda6a2a1b0a3e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 8 Jan 2023 20:08:35 -0700 Subject: [PATCH 0182/1010] Try another way to access packaged files --- app/build_containers.py | 7 +++++-- setup.py | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/build_containers.py b/app/build_containers.py index 87c92867..489af5d6 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -25,6 +25,7 @@ from decouple import config import subprocess import click import importlib +from pathlib import Path from .util import include_exclude_check # TODO: find a place for this @@ -43,9 +44,10 @@ def command(ctx, include, exclude): dry_run = ctx.obj.dry_run local_stack = ctx.obj.local_stack - # See: https://stackoverflow.com/a/20885799/1701505 + # See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure from . import data - container_build_dir = importlib.resources.path(data, "container-build") + container_build_dir = Path(__file__).absolute().parent.joinpath("data", "container-build") + print(f"dir is: {container_build_dir}") if local_stack: dev_root_path = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] @@ -59,6 +61,7 @@ def command(ctx, include, exclude): if not os.path.isdir(dev_root_path): print('Dev root directory doesn\'t exist, creating') + # See: https://stackoverflow.com/a/20885799/1701505 with importlib.resources.open_text(data, "container-image-list.txt") as container_list_file: containers = container_list_file.read().splitlines() diff --git a/setup.py b/setup.py index 17d2ae35..94a2af53 100644 --- a/setup.py +++ b/setup.py @@ -19,7 +19,8 @@ setup( install_requires=[requirements], python_requires='>=3.7', include_package_data=True, - package_data={'': ['data/*.txt']}, + # See: https://github.com/pypa/setuptools/issues/1806 + package_data={'': ['data/*', 'data/*/*', 'data/*/*/*']}, classifiers=[ "Programming Language :: Python :: 3.8", "Operating System :: OS Independent", From f04726f08d0246c83a07bb047a0bd01f6a69e728 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 8 Jan 2023 20:11:30 -0700 Subject: [PATCH 0183/1010] Fix remaining commands --- app/build_containers.py | 3 +-- app/deploy_system.py | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/build_containers.py b/app/build_containers.py index 489af5d6..3e8bb140 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -45,9 +45,7 @@ def command(ctx, include, exclude): local_stack = ctx.obj.local_stack # See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure - from . import data container_build_dir = Path(__file__).absolute().parent.joinpath("data", "container-build") - print(f"dir is: {container_build_dir}") if local_stack: dev_root_path = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] @@ -62,6 +60,7 @@ def command(ctx, include, exclude): print('Dev root directory doesn\'t exist, creating') # See: https://stackoverflow.com/a/20885799/1701505 + from . import data with importlib.resources.open_text(data, "container-image-list.txt") as container_list_file: containers = container_list_file.read().splitlines() diff --git a/app/deploy_system.py b/app/deploy_system.py index cb9c2efa..7195d593 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -40,9 +40,8 @@ def command(ctx, include, exclude, cluster, command, services): verbose = ctx.obj.verbose dry_run = ctx.obj.dry_run - # See: https://stackoverflow.com/a/20885799/1701505 - from . import data - compose_dir = importlib.resources.path(data, "compose") + # See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure + compose_dir = Path(__file__).absolute().parent.joinpath("data", "compose") if cluster is None: # Create default unique, stable cluster name from confile file path @@ -53,6 +52,7 @@ def command(ctx, include, exclude, cluster, command, services): if verbose: print(f"Using cluster name: {cluster}") + # See: https://stackoverflow.com/a/20885799/1701505 from . import data with importlib.resources.open_text(data, "pod-list.txt") as pod_list_file: pods = pod_list_file.read().splitlines() From 9d9eb791d14833d531c8e194b84b33a4285848bd Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 9 Jan 2023 13:34:02 -0700 Subject: [PATCH 0184/1010] Default the npm token env var --- app/build_containers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build_containers.py b/app/build_containers.py index 3e8bb140..aa72f54b 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -70,7 +70,7 @@ def command(ctx, include, exclude): # TODO: make this configurable container_build_env = { "CERC_NPM_URL": "http://gitea.local:3000/api/packages/cerc-io/npm/", - "CERC_NPM_AUTH_TOKEN": os.environ["CERC_NPM_AUTH_TOKEN"], + "CERC_NPM_AUTH_TOKEN": config("CERC_NPM_AUTH_TOKEN", default=""), "CERC_REPO_BASE_DIR": dev_root_path } From 8e5d0d6c581b9301f078feaf44759e3ccc13ae5c Mon Sep 17 00:00:00 2001 From: Zach Date: Mon, 9 Jan 2023 15:35:03 -0500 Subject: [PATCH 0185/1010] Update stack.yml --- app/data/stacks/laconicd/stack.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/data/stacks/laconicd/stack.yml b/app/data/stacks/laconicd/stack.yml index 0b54adee..6e262a08 100644 --- a/app/data/stacks/laconicd/stack.yml +++ b/app/data/stacks/laconicd/stack.yml @@ -3,9 +3,9 @@ name: laconicd-fixturenet repos: - cerc-io/laconicd - cerc-io/laconic-sdk - - cerc-io/laconic-cns-cli + - cerc-io/laconic-registry-cli containers: - cerc/laconicd - - cerc/laconic-cns-cli + - cerc/laconic-registry-cli pods: - - fixturenet-laconicd \ No newline at end of file + - fixturenet-laconicd From 48dc431704ddf4d928731e65e327742b64be56c7 Mon Sep 17 00:00:00 2001 From: zramsay Date: Mon, 9 Jan 2023 15:39:23 -0500 Subject: [PATCH 0186/1010] fix laconicd stack README --- app/data/stacks/laconicd/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/stacks/laconicd/README.md b/app/data/stacks/laconicd/README.md index 56017fd5..7fdc2003 100644 --- a/app/data/stacks/laconicd/README.md +++ b/app/data/stacks/laconicd/README.md @@ -4,7 +4,7 @@ Instructions for deploying a local Laconic blockchain "fixturenet" for developme ## Clone required repositories ``` -$ laconic-so setup-repositories --include cerc-io/laconicd,cerc-io/laconic-sdk,cerc-io/laconic-cns-cli +$ laconic-so setup-repositories --include cerc-io/laconicd,cerc-io/laconic-sdk,cerc-io/laconic-registry-cli ``` ## Build the laconicd container ``` From 738aa1907b7243e0c8ae6bd58c402453fa1f4af0 Mon Sep 17 00:00:00 2001 From: Zach Date: Mon, 9 Jan 2023 20:03:09 -0500 Subject: [PATCH 0187/1010] Update repository-list.txt --- app/data/repository-list.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index cdf40b25..43507d6e 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -2,8 +2,8 @@ cerc-io/ipld-eth-db cerc-io/go-ethereum cerc-io/ipld-eth-server cerc-io/eth-statediff-service -vulcanize/eth-statediff-fill-service -vulcanize/ipld-eth-db-validator +cerc-io/eth-statediff-fill-service +cerc-io/ipld-eth-db-validator cerc-io/ipld-eth-beacon-indexer cerc-io/ipld-eth-beacon-db cerc-io/laconicd From 8669a822dff08ef9c993d51b56e9f4995d4d3370 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Mon, 9 Jan 2023 21:43:04 -0600 Subject: [PATCH 0188/1010] fix: import Path --- app/data/pod-list.txt | 2 +- app/deploy_system.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/data/pod-list.txt b/app/data/pod-list.txt index e5cadd5a..661a04e4 100644 --- a/app/data/pod-list.txt +++ b/app/data/pod-list.txt @@ -1,5 +1,5 @@ contract -db +ipld-eth-db eth-statediff-fill-service go-ethereum-foundry ipld-eth-beacon-db diff --git a/app/deploy_system.py b/app/deploy_system.py index 7195d593..2fe4bbd8 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -21,6 +21,7 @@ import sys from python_on_whales import DockerClient import click import importlib +from pathlib import Path from .util import include_exclude_check From ddd2ea27241a31d9ce2ef0cf5505020dbcd50775 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 10 Jan 2023 10:24:04 -0700 Subject: [PATCH 0189/1010] Add a simple smoke test and shiv build script --- build-shiv-package.sh | 4 ++++ tests/smoke-test/run-smoke-test.sh | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100755 build-shiv-package.sh create mode 100755 tests/smoke-test/run-smoke-test.sh diff --git a/build-shiv-package.sh b/build-shiv-package.sh new file mode 100755 index 00000000..f5fa58ac --- /dev/null +++ b/build-shiv-package.sh @@ -0,0 +1,4 @@ +# Builds the shiv "package" for distribution +# TODO: add build version/tag to filename +# TODO: add version info to code for version subcommand +shiv -c laconic-so -o package/laconic-so . diff --git a/tests/smoke-test/run-smoke-test.sh b/tests/smoke-test/run-smoke-test.sh new file mode 100755 index 00000000..ac1fa1d4 --- /dev/null +++ b/tests/smoke-test/run-smoke-test.sh @@ -0,0 +1,21 @@ +# Basic simple test of stack-orchestrator functionality +echo "Running stack-orchestrator smoke test" +TEST_TARGET_SO=package/laconic-so +# Set a non-default repo dir +export CERC_REPO_BASE_DIR=~/stack-orchestrator-test/repo-base-dir +echo "Testing this package: $TEST_TARGET_SO" +echo "Cloning repositories into: $CERC_REPO_BASE_DIR" +rm -rf $CERC_REPO_BASE_DIR +mkdir -p $CERC_REPO_BASE_DIR +# Pull an example small public repo to test we can pull a repo +$TEST_TARGET_SO setup-repositories --include cerc-io/laconic-sdk +# TODO: test building the repo into a container +# Build two example containers +# TODO: +$TEST_TARGET_SO build-containers --include cerc/builder-js,cerc/test-container +# Deploy the test container +$TEST_TARGET_SO deploy-system --include test up +# TODO: test that we can use the deployed container somehow +# Clean up +$TEST_TARGET_SO deploy-system --include test down +echo "Test passed" \ No newline at end of file From b8b83768d87af0535ec45e71e1b73af0f11611b8 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 10 Jan 2023 10:24:48 -0700 Subject: [PATCH 0190/1010] Add trailing newline --- tests/smoke-test/run-smoke-test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/smoke-test/run-smoke-test.sh b/tests/smoke-test/run-smoke-test.sh index ac1fa1d4..ffdf8a06 100755 --- a/tests/smoke-test/run-smoke-test.sh +++ b/tests/smoke-test/run-smoke-test.sh @@ -18,4 +18,4 @@ $TEST_TARGET_SO deploy-system --include test up # TODO: test that we can use the deployed container somehow # Clean up $TEST_TARGET_SO deploy-system --include test down -echo "Test passed" \ No newline at end of file +echo "Test passed" From 261b513d6805cd28473fc2a4f9f758d317039363 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 10 Jan 2023 14:09:38 -0700 Subject: [PATCH 0191/1010] Initial implementation --- app/data/version.txt | 2 ++ app/version.py | 30 +++++++++++++++++++ cli.py | 2 ++ scripts/build-shiv-package.sh | 3 ++ .../first_time_setup.sh | 0 scripts/update-version-file.sh | 3 ++ 6 files changed, 40 insertions(+) create mode 100644 app/data/version.txt create mode 100644 app/version.py create mode 100755 scripts/build-shiv-package.sh rename first_time_setup.sh => scripts/first_time_setup.sh (100%) create mode 100755 scripts/update-version-file.sh diff --git a/app/data/version.txt b/app/data/version.txt new file mode 100644 index 00000000..81447904 --- /dev/null +++ b/app/data/version.txt @@ -0,0 +1,2 @@ +# This file should be re-generated running: scripts/update-version-file.sh script +v1.0.6-alpha 9278d09 diff --git a/app/version.py b/app/version.py new file mode 100644 index 00000000..0547f0ea --- /dev/null +++ b/app/version.py @@ -0,0 +1,30 @@ +# Copyright © 2023 Cerc + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import click +import importlib + +@click.command() +@click.pass_context +def command(ctx): + '''print tool version''' + + # See: https://stackoverflow.com/a/20885799/1701505 + from . import data + with importlib.resources.open_text(data, "version.txt") as version_file: + # TODO: code better version that skips comment lines + version_string = version_file.read().splitlines()[1] + + print(f"Version: {version_string}") diff --git a/cli.py b/cli.py index 1703a422..e2e94ab2 100644 --- a/cli.py +++ b/cli.py @@ -19,6 +19,7 @@ from app import setup_repositories from app import build_containers from app import build_npms from app import deploy_system +from app import version CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) @@ -49,3 +50,4 @@ cli.add_command(setup_repositories.command, "setup-repositories") cli.add_command(build_containers.command, "build-containers") cli.add_command(build_npms.command, "build-npms") cli.add_command(deploy_system.command, "deploy-system") +cli.add_command(version.command, "version") diff --git a/scripts/build-shiv-package.sh b/scripts/build-shiv-package.sh new file mode 100755 index 00000000..98f49f4f --- /dev/null +++ b/scripts/build-shiv-package.sh @@ -0,0 +1,3 @@ +# Builds the shiv "package" for distribution +./scripts/update_version_file.sh +shiv -c laconic-so -o package/laconic-so . diff --git a/first_time_setup.sh b/scripts/first_time_setup.sh similarity index 100% rename from first_time_setup.sh rename to scripts/first_time_setup.sh diff --git a/scripts/update-version-file.sh b/scripts/update-version-file.sh new file mode 100755 index 00000000..fdcdac32 --- /dev/null +++ b/scripts/update-version-file.sh @@ -0,0 +1,3 @@ +version_file_name=./app/data/version.txt +echo "# This file should be re-generated running: scripts/update-version-file.sh script" > $version_file_name +echo $( git describe --tags --abbrev=0 ; git rev-parse --short HEAD ) >> $version_file_name From ae7a17cecd6210ecd5847155f69a148247abeb6f Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 10 Jan 2023 14:10:22 -0700 Subject: [PATCH 0192/1010] Make script file names consistent --- scripts/{build-shiv-package.sh => build_shiv_package.sh} | 0 scripts/{update-version-file.sh => update_version_file.sh} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename scripts/{build-shiv-package.sh => build_shiv_package.sh} (100%) rename scripts/{update-version-file.sh => update_version_file.sh} (100%) diff --git a/scripts/build-shiv-package.sh b/scripts/build_shiv_package.sh similarity index 100% rename from scripts/build-shiv-package.sh rename to scripts/build_shiv_package.sh diff --git a/scripts/update-version-file.sh b/scripts/update_version_file.sh similarity index 100% rename from scripts/update-version-file.sh rename to scripts/update_version_file.sh From d315941f210e6379eb377318224c1e3fc9614123 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 10 Jan 2023 14:23:59 -0700 Subject: [PATCH 0193/1010] Version command implemented --- app/data/version.txt | 2 +- scripts/build_shiv_package.sh | 4 ++-- scripts/update_version_file.sh | 6 +++++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/data/version.txt b/app/data/version.txt index 81447904..0ee3baa4 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.6-alpha 9278d09 +v1.0.6-alpha-ae7a17c diff --git a/scripts/build_shiv_package.sh b/scripts/build_shiv_package.sh index 98f49f4f..2fbd68ad 100755 --- a/scripts/build_shiv_package.sh +++ b/scripts/build_shiv_package.sh @@ -1,3 +1,3 @@ # Builds the shiv "package" for distribution -./scripts/update_version_file.sh -shiv -c laconic-so -o package/laconic-so . +version_string=$( ./scripts/update_version_file.sh) +shiv -c laconic-so -o package/laconic-so-${version_string} . diff --git a/scripts/update_version_file.sh b/scripts/update_version_file.sh index fdcdac32..9880b21b 100755 --- a/scripts/update_version_file.sh +++ b/scripts/update_version_file.sh @@ -1,3 +1,7 @@ version_file_name=./app/data/version.txt echo "# This file should be re-generated running: scripts/update-version-file.sh script" > $version_file_name -echo $( git describe --tags --abbrev=0 ; git rev-parse --short HEAD ) >> $version_file_name +tag_string=$( git describe --tags --abbrev=0 ) +commit_string=$( git rev-parse --short HEAD ) +version_string=${tag_string}-${commit_string} +echo ${version_string} >> $version_file_name +echo ${version_string} From df469786ca650e19a6aaf29ea049d499a80ebd9a Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 10 Jan 2023 14:32:12 -0700 Subject: [PATCH 0194/1010] Add version to smoke test --- tests/smoke-test/run-smoke-test.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/smoke-test/run-smoke-test.sh b/tests/smoke-test/run-smoke-test.sh index ffdf8a06..4ee2fddc 100755 --- a/tests/smoke-test/run-smoke-test.sh +++ b/tests/smoke-test/run-smoke-test.sh @@ -1,9 +1,13 @@ # Basic simple test of stack-orchestrator functionality echo "Running stack-orchestrator smoke test" -TEST_TARGET_SO=package/laconic-so +# Bit of a hack, test the most recent package +TEST_TARGET_SO=$( ls -t1 ./package/laconic-so* | head -1 ) # Set a non-default repo dir export CERC_REPO_BASE_DIR=~/stack-orchestrator-test/repo-base-dir echo "Testing this package: $TEST_TARGET_SO" +echo "Test version command" +reported_version_string=$( $TEST_TARGET_SO version ) +echo "Version reported is: ${reported_version_string}" echo "Cloning repositories into: $CERC_REPO_BASE_DIR" rm -rf $CERC_REPO_BASE_DIR mkdir -p $CERC_REPO_BASE_DIR From 8e184f509dca002a8b967315b4b639ddbfa2a4e5 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Wed, 11 Jan 2023 12:54:22 -0600 Subject: [PATCH 0195/1010] Add remote debugging support to fixturenet-geth. (#113) * Add remote debugging support to fixturenet-geth. --- .../compose/docker-compose-fixturenet-eth.yml | 10 +++++++--- .../cerc-fixturenet-eth-geth/Dockerfile | 5 +++++ .../cerc-fixturenet-eth-geth/run-el.sh | 15 ++++++++++----- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/app/data/compose/docker-compose-fixturenet-eth.yml b/app/data/compose/docker-compose-fixturenet-eth.yml index df6ae30a..f833ca70 100644 --- a/app/data/compose/docker-compose-fixturenet-eth.yml +++ b/app/data/compose/docker-compose-fixturenet-eth.yml @@ -14,6 +14,12 @@ services: fixturenet-eth-geth-1: hostname: fixturenet-eth-geth-1 + cap_add: + - SYS_PTRACE + environment: + CERC_REMOTE_DEBUG: "true" + CERC_RUN_STATEDIFF: "detect" + CERC_STATEDIFF_DB_NODE_ID: 1 env_file: - ../config/fixturenet-eth/fixturenet-eth.env image: cerc/fixturenet-eth-geth:local @@ -27,12 +33,10 @@ services: - fixturenet-eth-bootnode-geth ports: - "8545" + - "40000" fixturenet-eth-geth-2: hostname: fixturenet-eth-geth-2 - environment: - CERC_RUN_STATEDIFF: "detect" - CERC_STATEDIFF_DB_NODE_ID: 2 healthcheck: test: ["CMD", "nc", "-v", "localhost", "8545"] interval: 30s diff --git a/app/data/container-build/cerc-fixturenet-eth-geth/Dockerfile b/app/data/container-build/cerc-fixturenet-eth-geth/Dockerfile index cefe1bef..a7671d50 100644 --- a/app/data/container-build/cerc-fixturenet-eth-geth/Dockerfile +++ b/app/data/container-build/cerc-fixturenet-eth-geth/Dockerfile @@ -1,8 +1,13 @@ FROM skylenet/ethereum-genesis-generator@sha256:210353ce7c898686bc5092f16c61220a76d357f51eff9c451e9ad1b9ad03d4d3 AS ethgen +# Using the same golang image as used to build geth: https://github.com/cerc-io/go-ethereum/blob/HEAD/Dockerfile +FROM golang:1.18-alpine as delve +RUN go install github.com/go-delve/delve/cmd/dlv@latest + FROM cerc/go-ethereum:local RUN apk add --no-cache python3 python3-dev py3-pip curl wget jq build-base gettext libintl openssl bash bind-tools postgresql-client +COPY --from=delve /go/bin/dlv / COPY --from=ethgen /usr/local/bin/eth2-testnet-genesis /usr/local/bin/eth2-testnet-genesis COPY --from=ethgen /usr/local/bin/eth2-val-tools /usr/local/bin/eth2-val-tools COPY --from=ethgen /apps /apps diff --git a/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh b/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh index 34e74182..7216ca0d 100755 --- a/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh +++ b/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh @@ -9,13 +9,18 @@ cd /opt/testnet/build/el python3 -m http.server 9898 & cd $HOME_DIR -if [ "true" == "$RUN_BOOTNODE" ]; then - geth \ +START_CMD="geth" +if [ "true" == "$CERC_REMOTE_DEBUG" ] && [ -x "/dlv" ]; then + START_CMD="/dlv --listen=:40000 --headless=true --api-version=2 --accept-multiclient exec /usr/local/bin/geth --continue --" +fi + +if [ "true" == "$RUN_BOOTNODE" ]; then + $START_CMD \ --nodekeyhex="${BOOTNODE_KEY}" \ --nodiscover \ --ipcdisable \ --networkid=${NETWORK_ID} \ - --netrestrict="${NETRESTRICT}" 2>&1 | tee /var/log/geth_bootnode.log + --netrestrict="${NETRESTRICT}" else cd /opt/testnet/accounts ./import_keys.sh @@ -60,7 +65,7 @@ else --statediff.writing=true" fi - geth \ + $START_CMD \ --bootnodes="${ENODE}" \ --allow-insecure-unlock \ --http \ @@ -80,5 +85,5 @@ else --mine \ --miner.threads=1 \ --verbosity=5 \ - --miner.etherbase="${ETHERBASE}" ${STATEDIFF_OPTS} 2>&1 | tee /var/log/geth.log + --miner.etherbase="${ETHERBASE}" ${STATEDIFF_OPTS} fi From 7edfa1bb296a6998f53c8e2b4f05761958891af5 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 11 Jan 2023 21:01:48 -0700 Subject: [PATCH 0196/1010] Add import-resources dependency --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 7ee8181a..d34ce8f8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,3 +3,4 @@ GitPython>=3.1.27 tqdm>=4.64.0 python-on-whales>=0.52.0 click>=8.1.3 +import-resources>=5.10.2 From 0a66b7e9d2ba12bdc933d8953d50edadf6efa31d Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 11 Jan 2023 21:56:05 -0700 Subject: [PATCH 0197/1010] Fix odd import problem --- app/build_containers.py | 2 +- app/build_npms.py | 2 +- app/data/version.txt | 2 +- app/deploy_system.py | 2 +- app/setup_repositories.py | 2 +- app/version.py | 2 +- build-shiv-package.sh | 4 ---- requirements.txt | 1 - scripts/build_shiv_package.sh | 1 + 9 files changed, 7 insertions(+), 11 deletions(-) delete mode 100755 build-shiv-package.sh diff --git a/app/build_containers.py b/app/build_containers.py index aa72f54b..9951d6f8 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -24,7 +24,7 @@ import os from decouple import config import subprocess import click -import importlib +import importlib.resources from pathlib import Path from .util import include_exclude_check diff --git a/app/build_npms.py b/app/build_npms.py index 905a54cd..48161248 100644 --- a/app/build_npms.py +++ b/app/build_npms.py @@ -21,7 +21,7 @@ import os from decouple import config import click -import importlib +import importlib.resources from python_on_whales import docker from .util import include_exclude_check diff --git a/app/data/version.txt b/app/data/version.txt index 0ee3baa4..8f8652a3 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.6-alpha-ae7a17c +v1.0.7-alpha-7edfa1b diff --git a/app/deploy_system.py b/app/deploy_system.py index 2fe4bbd8..250c42ba 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -20,7 +20,7 @@ import os import sys from python_on_whales import DockerClient import click -import importlib +import importlib.resources from pathlib import Path from .util import include_exclude_check diff --git a/app/setup_repositories.py b/app/setup_repositories.py index bb1c3c69..28ee2c9e 100644 --- a/app/setup_repositories.py +++ b/app/setup_repositories.py @@ -22,7 +22,7 @@ from decouple import config import git from tqdm import tqdm import click -import importlib +import importlib.resources from .util import include_exclude_check diff --git a/app/version.py b/app/version.py index 0547f0ea..70280cd4 100644 --- a/app/version.py +++ b/app/version.py @@ -14,7 +14,7 @@ # along with this program. If not, see . import click -import importlib +import importlib.resources @click.command() @click.pass_context diff --git a/build-shiv-package.sh b/build-shiv-package.sh deleted file mode 100755 index f5fa58ac..00000000 --- a/build-shiv-package.sh +++ /dev/null @@ -1,4 +0,0 @@ -# Builds the shiv "package" for distribution -# TODO: add build version/tag to filename -# TODO: add version info to code for version subcommand -shiv -c laconic-so -o package/laconic-so . diff --git a/requirements.txt b/requirements.txt index d34ce8f8..7ee8181a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,4 +3,3 @@ GitPython>=3.1.27 tqdm>=4.64.0 python-on-whales>=0.52.0 click>=8.1.3 -import-resources>=5.10.2 diff --git a/scripts/build_shiv_package.sh b/scripts/build_shiv_package.sh index 2fbd68ad..a51ae9e2 100755 --- a/scripts/build_shiv_package.sh +++ b/scripts/build_shiv_package.sh @@ -1,3 +1,4 @@ # Builds the shiv "package" for distribution +mkdir -p ./package version_string=$( ./scripts/update_version_file.sh) shiv -c laconic-so -o package/laconic-so-${version_string} . From 6396de1ecf452ae32dae2445f7a32979865e67cb Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Thu, 12 Jan 2023 11:37:23 -0600 Subject: [PATCH 0198/1010] Improvements for building/deploying geth. (#119) * Improvements for building/deploying geth. * Improvements for building/deploying geth. --- .../cerc-fixturenet-eth-geth/Dockerfile | 11 +++++++---- .../cerc-fixturenet-eth-geth/run-el.sh | 10 ++++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/app/data/container-build/cerc-fixturenet-eth-geth/Dockerfile b/app/data/container-build/cerc-fixturenet-eth-geth/Dockerfile index a7671d50..51dbbcd4 100644 --- a/app/data/container-build/cerc-fixturenet-eth-geth/Dockerfile +++ b/app/data/container-build/cerc-fixturenet-eth-geth/Dockerfile @@ -4,12 +4,14 @@ FROM skylenet/ethereum-genesis-generator@sha256:210353ce7c898686bc5092f16c61220a FROM golang:1.18-alpine as delve RUN go install github.com/go-delve/delve/cmd/dlv@latest -FROM cerc/go-ethereum:local +FROM cerc/go-ethereum:local as geth + +FROM alpine:latest RUN apk add --no-cache python3 python3-dev py3-pip curl wget jq build-base gettext libintl openssl bash bind-tools postgresql-client -COPY --from=delve /go/bin/dlv / -COPY --from=ethgen /usr/local/bin/eth2-testnet-genesis /usr/local/bin/eth2-testnet-genesis -COPY --from=ethgen /usr/local/bin/eth2-val-tools /usr/local/bin/eth2-val-tools +COPY --from=delve /go/bin/dlv /usr/local/bin/ +COPY --from=ethgen /usr/local/bin/eth2-testnet-genesis /usr/local/bin/ +COPY --from=ethgen /usr/local/bin/eth2-val-tools /usr/local/bin/ COPY --from=ethgen /apps /apps RUN cd /apps/el-gen && pip3 install -r requirements.txt @@ -19,6 +21,7 @@ COPY run-el.sh /opt/testnet/run.sh RUN cd /opt/testnet && make genesis-el +COPY --from=geth /usr/local/bin/geth /usr/local/bin/ RUN geth init /opt/testnet/build/el/geth.json && rm -f ~/.ethereum/geth/nodekey ENTRYPOINT ["/opt/testnet/run.sh"] diff --git a/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh b/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh index 7216ca0d..c2f2364c 100755 --- a/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh +++ b/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh @@ -10,8 +10,8 @@ python3 -m http.server 9898 & cd $HOME_DIR START_CMD="geth" -if [ "true" == "$CERC_REMOTE_DEBUG" ] && [ -x "/dlv" ]; then - START_CMD="/dlv --listen=:40000 --headless=true --api-version=2 --accept-multiclient exec /usr/local/bin/geth --continue --" +if [ "true" == "$CERC_REMOTE_DEBUG" ] && [ -x "/usr/local/bin/dlv" ]; then + START_CMD="/usr/local/bin/dlv --listen=:40000 --headless=true --api-version=2 --accept-multiclient exec /usr/local/bin/geth --continue --" fi if [ "true" == "$RUN_BOOTNODE" ]; then @@ -71,7 +71,7 @@ else --http \ --http.addr="0.0.0.0" \ --http.vhosts="*" \ - --http.api="eth,web3,net,admin,personal" \ + --http.api="eth,web3,net,admin,personal,debug,statediff" \ --http.corsdomain="*" \ --authrpc.addr="0.0.0.0" \ --authrpc.vhosts="*" \ @@ -84,6 +84,8 @@ else --syncmode=full \ --mine \ --miner.threads=1 \ - --verbosity=5 \ + --metrics \ + --verbosity=${CERC_GETH_VERBOSITY:-3} \ + --vmodule="${CERC_GETH_VMODULE:-statediff/*=6}" \ --miner.etherbase="${ETHERBASE}" ${STATEDIFF_OPTS} fi From b13300ca8120106a5a78adc2aa2bc36084217a39 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Fri, 13 Jan 2023 16:33:59 -0600 Subject: [PATCH 0199/1010] Add CERC_STATEDIFF_DB_LOG_STATEMENTS=true|false option. (#120) --- app/data/config/fixturenet-eth/fixturenet-eth.env | 1 + app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/data/config/fixturenet-eth/fixturenet-eth.env b/app/data/config/fixturenet-eth/fixturenet-eth.env index 10d6c94c..20a9fc05 100644 --- a/app/data/config/fixturenet-eth/fixturenet-eth.env +++ b/app/data/config/fixturenet-eth/fixturenet-eth.env @@ -18,3 +18,4 @@ CERC_STATEDIFF_DB_NAME="cerc_testing" CERC_STATEDIFF_DB_USER="vdbm" CERC_STATEDIFF_DB_PASSWORD="password" CERC_STATEDIFF_DB_GOOSE_MIN_VER=23 +CERC_STATEDIFF_DB_LOG_STATEMENTS="false" diff --git a/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh b/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh index c2f2364c..01672c39 100755 --- a/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh +++ b/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh @@ -61,6 +61,7 @@ else --statediff.db.password=$CERC_STATEDIFF_DB_PASSWORD \ --statediff.db.port=$CERC_STATEDIFF_DB_PORT \ --statediff.db.user=$CERC_STATEDIFF_DB_USER \ + --statediff.db.logstatements=${CERC_STATEDIFF_DB_LOG_STATEMENTS:-false} \ --statediff.waitforsync=true \ --statediff.writing=true" fi @@ -86,6 +87,6 @@ else --miner.threads=1 \ --metrics \ --verbosity=${CERC_GETH_VERBOSITY:-3} \ - --vmodule="${CERC_GETH_VMODULE:-statediff/*=6}" \ + --vmodule="${CERC_GETH_VMODULE:-statediff/*=5}" \ --miner.etherbase="${ETHERBASE}" ${STATEDIFF_OPTS} fi From b90e4ad6cd60b729ade44e642fffa7ab8d0bea44 Mon Sep 17 00:00:00 2001 From: zramsay Date: Mon, 9 Jan 2023 19:44:39 -0500 Subject: [PATCH 0200/1010] update readme Former-commit-id: 70723dd6d430324ee6960fe87962a11754190bc0 --- .github/CONTRIBUTING.md | 91 +++++++ README.md | 257 ++++++------------- app/data/stacks/erc20/README.md | 224 ++++++++-------- docs/cli.md | 3 + docs/images/laconic-stack.png.REMOVED.git-id | 1 + docs/spec.md | 37 +++ 6 files changed, 316 insertions(+), 297 deletions(-) create mode 100644 .github/CONTRIBUTING.md create mode 100644 docs/cli.md create mode 100644 docs/images/laconic-stack.png.REMOVED.git-id create mode 100644 docs/spec.md diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 00000000..5b73c490 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,91 @@ +# Contributing + +Thank you for taking the time to make a contribution to Stack Orchestrator. + +## Install (developer mode) + +Suitable for developers either modifying or debugging the orchestrator Python code: +#### Prerequisites +In addition to the binary install prerequisites listed above, the following are required: +1. Python venv package + This may or may not be already installed depending on the host OS and version. Check by running: + ``` + $ python3 -m venv + usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear] [--upgrade] [--without-pip] [--prompt PROMPT] ENV_DIR [ENV_DIR ...] + venv: error: the following arguments are required: ENV_DIR + ``` + If the venv package is missing you should see a message indicating how to install it, for example with: + ``` + $ apt install python3.10-venv + ``` +#### Install +1. Clone this repository: + ``` + $ git clone (https://github.com/cerc-io/stack-orchestrator.git + ``` +4. Enter the project directory: + ``` + $ cd stack-orchestrator + ``` +5. Create and activate a venv: + ``` + $ python3 -m venv venv + $ source ./venv/bin/activate + (venv) $ + ``` +6. Install the cli in edit mode: + ``` + $ pip install --editable . + ``` +7. Verify installation: + ``` + (venv) $ laconic-so + Usage: laconic-so [OPTIONS] COMMAND [ARGS]... + + Laconic Stack Orchestrator + + Options: + --quiet + --verbose + --dry-run + -h, --help Show this message and exit. + + Commands: + build-containers build the set of containers required for a complete... + deploy-system deploy a stack + setup-repositories git clone the set of repositories required to build... + ``` + +#### Build a zipapp (single file distributable script) +Use shiv to build a single file Python executable zip archive of laconic-so: +1. Install [shiv](https://github.com/linkedin/shiv): + ``` + $ (venv) pip install shiv + $ (venv) pip install wheel + ``` +1. Run shiv to create a zipapp file: + ``` + $ (venv) shiv -c laconic-so -o laconic-so . + ``` + This creates a file `./laconic-so` that is executable outside of any venv, and on other machines and OSes and architectures, and requiring only the system Python3: +1. Verify it works: + ``` + $ cp stack-orchetrator/laconic-so ~/bin + $ laconic-so + Usage: python -m laconic-so [OPTIONS] COMMAND [ARGS]... + + Laconic Stack Orchestrator + + Options: + --quiet + --verbose + --dry-run + -h, --help Show this message and exit. + + Commands: + build-containers build the set of containers required for a complete... + deploy-system deploy a stack + setup-repositories git clone the set of repositories required to build... + ``` + + diff --git a/README.md b/README.md index 32618100..db879530 100644 --- a/README.md +++ b/README.md @@ -1,218 +1,105 @@ # Stack Orchestrator -Stack Orchestrator allows building and deployment of a Laconic stack on a single machine with minimial prerequisites. +Stack Orchestrator allows building and deployment of a Laconic Stack on a single machine with minimial prerequisites. It is a Python3 CLI tool that runs on any OS with Python3 and Docker. The following diagram summarizes the relevant repositories in the Laconic Stack - and the relationship to Stack Orchestrator. -## Setup -### Prerequisites -Stack Orchestrator is a Python3 CLI tool that runs on any OS with Python3 and Docker. Tested on: Ubuntu 20/22. +![The Stack](/docs/images/laconic-stack.png) + +## Install Ensure that the following are already installed: -1. Python3 (the stock Python3 version available in Ubuntu 20 and 22 is suitable) - ``` - $ python3 --version - Python 3.8.10 - ``` -2. Docker (Install a current version from dockerco, don't use the version from any Linux distro) - ``` - $ docker --version - Docker version 20.10.17, build 100c701 - ``` -3. If installed from regular package repository (not Docker Desktop), BE AWARE that the compose plugin may need to be installed, as well. - ``` - DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker} - mkdir -p $DOCKER_CONFIG/cli-plugins - curl -SL https://github.com/docker/compose/releases/download/v2.11.2/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose - chmod +x ~/.docker/cli-plugins/docker-compose - - # see https://docs.docker.com/compose/install/linux/#install-the-plugin-manually for further details - # or to install for all users. - ``` +- [Python3](https://wiki.python.org/moin/BeginnersGuide/Download) +- [Docker](https://docs.docker.com/get-docker/) +- [Docker Compose](https://docs.docker.com/compose/install/) -### User Mode Install +Note: if installing docker-compose via package manager (as opposed to Docker Desktop), you must [install the plugin](https://docs.docker.com/compose/install/linux/#install-the-plugin-manually), e.g., on Linux: -User mode runs the orchestrator from a "binary" single-file release and does not require special Python environment setup. Use this mode unless you plan to make changes to the orchestrator source code. +```bash +mkdir -p ~/.docker/cli-plugins +curl -SL https://github.com/docker/compose/releases/download/v2.11.2/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose +chmod +x ~/.docker/cli-plugins/docker-compose +``` -*NOTE: User Mode is currently broken, use "Developer mode" described below for now.* +Next, download the latest release from [this page](https://github.com/cerc-io/stack-orchestrator/tags), into a suitable directory (e.g. `~/bin`): -1. Download the latest release from [this page](https://github.com/cerc-io/stack-orchestrator/tags), into a suitable directory (e.g. `~/bin`): - ``` - $ cd ~/bin - $ curl -L https://github.com/cerc-io/stack-orchestrator/releases/download/v1.0.3-alpha/laconic-so - ``` -1. Ensure `laconic-so` is on the `PATH` -1. Verify operation: - ``` - $ ~/bin/laconic-so --help - Usage: python -m laconic-so [OPTIONS] COMMAND [ARGS]... +```bash +curl -L -o ~/bin/laconic-so https://github.com/cerc-io/stack-orchestrator/releases/latest/download/laconic-so +``` - Laconic Stack Orchestrator +Give it permissions: +```bash +chmod +x ~/bin/laconic-so +``` - Options: - --quiet - --verbose - --dry-run - --local-stack - -h, --help Show this message and exit. +Ensure `laconic-so` is on the [`PATH`](https://unix.stackexchange.com/a/26059) - Commands: - build-containers build the set of containers required for a complete... - deploy-system deploy a stack - setup-repositories git clone the set of repositories required to build... - ``` -### Developer mode Install -Suitable for developers either modifying or debugging the orchestrator Python code: -#### Prerequisites -In addition to the binary install prerequisites listed above, the following are required: -1. Python venv package - This may or may not be already installed depending on the host OS and version. Check by running: - ``` - $ python3 -m venv - usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear] [--upgrade] [--without-pip] [--prompt PROMPT] ENV_DIR [ENV_DIR ...] - venv: error: the following arguments are required: ENV_DIR - ``` - If the venv package is missing you should see a message indicating how to install it, for example with: - ``` - $ apt install python3.8-venv - ``` -#### Install -1. Clone this repository: - ``` - $ git clone (https://github.com/cerc-io/stack-orchestrator.git - ``` -4. Enter the project directory: - ``` - $ cd stack-orchestrator - ``` -5. Create and activate a venv: - ``` - $ python3 -m venv venv - $ source ./venv/bin/activate - (venv) $ - ``` -6. Install the cli in edit mode: - ``` - $ pip install --editable . - ``` -7. Verify installation: - ``` - (venv) $ laconic-so - Usage: laconic-so [OPTIONS] COMMAND [ARGS]... +Verify operation: - Laconic Stack Orchestrator +``` +laconic-so --help +Usage: python -m laconic-so [OPTIONS] COMMAND [ARGS]... - Options: - --quiet - --verbose - --dry-run - -h, --help Show this message and exit. + Laconic Stack Orchestrator - Commands: - build-containers build the set of containers required for a complete... - deploy-system deploy a stack - setup-repositories git clone the set of repositories required to build... - ``` +Options: + --quiet + --verbose + --dry-run + --local-stack + -h, --help Show this message and exit. -#### Build a zipapp (single file distributable script) -Use shiv to build a single file Python executable zip archive of laconic-so: -1. Install [shiv](https://github.com/linkedin/shiv): - ``` - $ (venv) pip install shiv - $ (venv) pip install wheel - ``` -1. Run shiv to create a zipapp file: - ``` - $ (venv) shiv -c laconic-so -o laconic-so . - ``` - This creates a file `./laconic-so` that is executable outside of any venv, and on other machines and OSes and architectures, and requiring only the system Python3: -1. Verify it works: - ``` - $ cp stack-orchetrator/laconic-so ~/bin - $ laconic-so - Usage: python -m laconic-so [OPTIONS] COMMAND [ARGS]... - - Laconic Stack Orchestrator - - Options: - --quiet - --verbose - --dry-run - -h, --help Show this message and exit. - - Commands: - build-containers build the set of containers required for a complete... - deploy-system deploy a stack - setup-repositories git clone the set of repositories required to build... - ``` -### CI Mode -_write-me_ +Commands: + build-containers build the set of containers required for a complete... + build-npms build the set of npm packages required for a... + deploy-system deploy a stack + setup-repositories git clone the set of repositories required to build... +``` ## Usage -There are three sub-commands: `setup-repositories`, `build-containers` and `deploy-system` that are generally run in order: -Note: $ laconic-so will run the version installed to ~/bin, while ./laconic-so can be invoked to run locally built -version in a checkout +Three sub-commands: `setup-repositories`, `build-containers` and `deploy-system` are generally run in order. The following is a slim example for standing up the `erc20-watcher`. Go further with the [erc20 watcher demo](/app/data/stacks/erc20) and other pieces of the stack, within the [`stacks` directory](/app/data/stacks). + ### Setup Repositories -Clones the set of git repositories necessary to build a system. -Note: the use of `ssh-agent` is recommended in order to avoid entering your ssh key passphrase for each repository. -``` -$ laconic-so --verbose setup-repositories #this will default to ~/cerc or CERC_REPO_BASE_DIR from an env file -#$ ./laconic-so --verbose --local-stack setup-repositories #this will use cwd ../ as dev_root_path +Clone the set of git repositories necessary to build a system: + +```bash +laconic-so --verbose setup-repositories --include cerc-io/go-ethereum,cerc-io/ipld-eth-db,cerc-io/ipld-eth-server,cerc-io/watcher-ts ``` + +This will default to `~/cerc` or - if set - the environment variable `CERC_REPO_BASE_DIR` + ### Build Containers -Builds the set of docker container images required to run a system. It takes around 10 minutes to build all the containers from cold. -``` -$ laconic-so --verbose build-containers #this will default to ~/cerc or CERC_REPO_BASE_DIR from an env file -#$ ./laconic-so --verbose --local-stack build-containers #this will use cwd ../ as dev_root_path +Build the set of docker container images required to run a system. It takes around 10 minutes to build all the containers from scratch. + +```bash +laconic-so --verbose build-containers --include cerc/go-ethereum,cerc/go-ethereum-foundry,cerc/ipld-eth-db,cerc/ipld-eth-server,cerc/watcher-erc20 ``` + ### Deploy System -Uses `docker compose` to deploy a system. -Use `---include ` to deploy a subset of all containers: +Uses `docker-compose` to deploy a system (with most recently built container images). + +```bash +laconic-so --verbose deploy-system --include ipld-eth-db,go-ethereum-foundry,ipld-eth-server,watcher-erc20 up ``` -$ laconic-so --verbose deploy-system --include db-sharding,contract,ipld-eth-server,go-ethereum-foundry up + +Check out he GraphQL playground here: [http://localhost:3002/graphql](http://localhost:3002/graphql) + +See the [erc20 watcher demo](/app/data/stacks/erc20) to continue further. + +### Cleanup + +```bash +laconic-so --verbose deploy-system --include ipld-eth-db,go-ethereum-foundry,ipld-eth-server,watcher-erc20 down ``` -``` -$ laconic-so --verbose deploy-system --include db-sharding,contract,ipld-eth-server,go-ethereum-foundry down -``` -Note: deploy-system command interacts with most recently built container images. + +## Contributing + +See the [CONTRIBUTING.md](.github/CONTRIBUTING.md) for developer mode install. ## Platform Support -Native aarm64 is _not_ currently supported. x64 emulation on ARM64 macos should work (not yet tested). -## Implementation -The orchestrator's operation is driven by files shown below. `repository-list.txt` container the list of git repositories; `container-image-list.txt` contains -the list of container image names, while `clister-list.txt` specifies the set of compose components (corresponding to individual docker-compose-xxx.yml files which may in turn specify more than one container). -Files required to build each container image are stored under `./container-build/` -Files required at deploy-time are stored under `./config/` -``` -├── pod-list.txt -├── compose -│   ├── docker-compose-contract.yml -│   ├── docker-compose-db-sharding.yml -│   ├── docker-compose-db.yml -│   ├── docker-compose-eth-statediff-fill-service.yml -│   ├── docker-compose-go-ethereum-foundry.yml -│   ├── docker-compose-ipld-eth-beacon-db.yml -│   ├── docker-compose-ipld-eth-beacon-indexer.yml -│   ├── docker-compose-ipld-eth-server.yml -│   ├── docker-compose-lighthouse.yml -│   └── docker-compose-prometheus-grafana.yml -├── config -│   └── ipld-eth-server -├── container-build -│   ├── cerc-eth-statediff-fill-service -│   ├── cerc-go-ethereum -│   ├── cerc-go-ethereum-foundry -│   ├── cerc-ipld-eth-beacon-db -│   ├── cerc-ipld-eth-beacon-indexer -│   ├── cerc-ipld-eth-db -│   ├── cerc-ipld-eth-server -│   ├── cerc-lighthouse -│   └── cerc-test-contract -├── container-image-list.txt -├── repository-list.txt -``` -_write-more-of-me_ +Native aarm64 is _not_ currently supported. x64 emulation on ARM64 macos should work (not yet tested). + diff --git a/app/data/stacks/erc20/README.md b/app/data/stacks/erc20/README.md index 3405b703..cab41c79 100644 --- a/app/data/stacks/erc20/README.md +++ b/app/data/stacks/erc20/README.md @@ -1,157 +1,157 @@ # ERC20 Watcher -Instructions to deploy a local ERC20 watcher stack (core + watcher) for demonstration and testing purposes using [laconic-stack-orchestrator](../../README.md#setup) +Instructions to deploy a local ERC20 watcher stack (core + watcher) for demonstration and testing purposes using [stack orchestrator](/README.md#install) ## Setup -* Clone / pull required repositories: +Clone required repositories: - ```bash - $ laconic-so setup-repositories --include cerc-io/go-ethereum,cerc-io/ipld-eth-db,cerc-io/ipld-eth-server,cerc-io/watcher-ts --pull - ``` +```bash +laconic-so setup-repositories --include cerc-io/go-ethereum,cerc-io/ipld-eth-db,cerc-io/ipld-eth-server,cerc-io/watcher-ts +``` -* Build the core and watcher container images: +Build the core and watcher container images: - ```bash - $ laconic-so build-containers --include cerc/go-ethereum,cerc/go-ethereum-foundry,cerc/ipld-eth-db,cerc/ipld-eth-server,cerc/watcher-erc20 - ``` +```bash +laconic-so build-containers --include cerc/go-ethereum,cerc/go-ethereum-foundry,cerc/ipld-eth-db,cerc/ipld-eth-server,cerc/watcher-erc20 +``` - This should create the required docker images in the local image registry. +This should create the required docker images in the local image registry. -* Deploy the stack: +Deploy the stack: - ```bash - $ laconic-so deploy-system --include db,go-ethereum-foundry,ipld-eth-server,watcher-erc20 up - ``` +```bash +laconic-so deploy-system --include ipld-eth-db,go-ethereum-foundry,ipld-eth-server,watcher-erc20 up +``` ## Demo -* Find the watcher container's id using `docker ps` and export it for later use: +Find the watcher container's id using `docker ps` and export it for later use: - ```bash - $ export CONTAINER_ID= - ``` +```bash +export CONTAINER_ID= +``` -* Deploy an ERC20 token: +Deploy an ERC20 token: - ```bash - $ docker exec $CONTAINER_ID yarn token:deploy:docker - ``` +```bash +docker exec $CONTAINER_ID yarn token:deploy:docker +``` - Export the address of the deployed token to a shell variable for later use: +Export the address of the deployed token to a shell variable for later use: - ```bash - $ export TOKEN_ADDRESS= - ``` +```bash +export TOKEN_ADDRESS= +``` -* Open `http://localhost:3002/graphql` (GraphQL Playground) in a browser window +Open `http://localhost:3002/graphql` (GraphQL Playground) in a browser window -* Connect MetaMask to `http://localhost:8545` (with chain ID `99`) +Connect MetaMask to `http://localhost:8545` (with chain ID `99`) -* Add the deployed token as an asset in MetaMask and check that the initial balance is zero +Add the deployed token as an asset in MetaMask and check that the initial balance is zero -* Export your MetaMask account (second account) address to a shell variable for later use: +Export your MetaMask account (second account) address to a shell variable for later use: - ```bash - $ export RECIPIENT_ADDRESS= - ``` +```bash +export RECIPIENT_ADDRESS= +``` -* To get the primary account's address, run: +To get the primary account's address, run: - ```bash - $ docker exec $CONTAINER_ID yarn account:docker - ``` +```bash +docker exec $CONTAINER_ID yarn account:docker +``` -* To get the current block hash at any time, run: +To get the current block hash at any time, run: - ```bash - $ docker exec $CONTAINER_ID yarn block:latest:docker - ``` +```bash +docker exec $CONTAINER_ID yarn block:latest:docker +``` -* Fire a GQL query in the playground to get the name, symbol and total supply of the deployed token: +Fire a GQL query in the playground to get the name, symbol and total supply of the deployed token: - ```graphql - query { - name( - blockHash: "LATEST_BLOCK_HASH" - token: "TOKEN_ADDRESS" - ) { - value - proof { - data - } - } - - symbol( - blockHash: "LATEST_BLOCK_HASH" - token: "TOKEN_ADDRESS" - ) { - value - proof { - data - } - } - - totalSupply( - blockHash: "LATEST_BLOCK_HASH" - token: "TOKEN_ADDRESS" - ) { - value - proof { - data - } +```graphql +query { + name( + blockHash: "LATEST_BLOCK_HASH" + token: "TOKEN_ADDRESS" + ) { + value + proof { + data } } - ``` -* Fire the following query to get balances for the primary and the recipient account at the latest block hash: - - ```graphql - query { - fromBalanceOf: balanceOf( - blockHash: "LATEST_BLOCK_HASH" - token: "TOKEN_ADDRESS", - # primary account having all the balance initially - owner: "PRIMARY_ADDRESS" - ) { - value - proof { - data - } - } - toBalanceOf: balanceOf( - blockHash: "LATEST_BLOCK_HASH" - token: "TOKEN_ADDRESS", - owner: "RECIPIENT_ADDRESS" - ) { - value - proof { - data - } + symbol( + blockHash: "LATEST_BLOCK_HASH" + token: "TOKEN_ADDRESS" + ) { + value + proof { + data } } - ``` - * The initial balance for the primary account should be `1000000000000000000000` - * The initial balance for the recipient should be `0` + totalSupply( + blockHash: "LATEST_BLOCK_HASH" + token: "TOKEN_ADDRESS" + ) { + value + proof { + data + } + } +} +``` -* Transfer tokens to the recipient account: +Fire the following query to get balances for the primary and the recipient account at the latest block hash: - ```bash - $ docker exec $CONTAINER_ID yarn token:transfer:docker --token $TOKEN_ADDRESS --to $RECIPIENT_ADDRESS --amount 100 - ``` +```graphql +query { + fromBalanceOf: balanceOf( + blockHash: "LATEST_BLOCK_HASH" + token: "TOKEN_ADDRESS", + # primary account having all the balance initially + owner: "PRIMARY_ADDRESS" + ) { + value + proof { + data + } + } + toBalanceOf: balanceOf( + blockHash: "LATEST_BLOCK_HASH" + token: "TOKEN_ADDRESS", + owner: "RECIPIENT_ADDRESS" + ) { + value + proof { + data + } + } +} +``` -* Fire the above GQL query again with the latest block hash to get updated balances for the primary (`from`) and the recipient (`to`) account: +- The initial balance for the primary account should be `1000000000000000000000` +- The initial balance for the recipient should be `0` - * The balance for the primary account should be reduced by the transfer amount (`100`) - * The balance for the recipient account should be equal to the transfer amount (`100`) +Transfer tokens to the recipient account: -* Transfer funds between different accounts using MetaMask and use the playground to query the balance before and after the transfer. +```bash +docker exec $CONTAINER_ID yarn token:transfer:docker --token $TOKEN_ADDRESS --to $RECIPIENT_ADDRESS --amount 100 +``` + +Fire the above GQL query again with the latest block hash to get updated balances for the primary (`from`) and the recipient (`to`) account: + +- The balance for the primary account should be reduced by the transfer amount (`100`) +- The balance for the recipient account should be equal to the transfer amount (`100`) + +Transfer funds between different accounts using MetaMask and use the playground to query the balance before and after the transfer. ## Clean up -* To stop all the services running in background run: +To stop all the services running in background run: - ```bash - $ laconic-so deploy-system --include db,go-ethereum-foundry,ipld-eth-server,watcher-erc20 down - ``` +```bash +laconic-so deploy-system --include ipld-eth-db,go-ethereum-foundry,ipld-eth-server,watcher-erc20 down +``` diff --git a/docs/cli.md b/docs/cli.md new file mode 100644 index 00000000..70905d87 --- /dev/null +++ b/docs/cli.md @@ -0,0 +1,3 @@ +# laconic-so + +Sub-commands and flags diff --git a/docs/images/laconic-stack.png.REMOVED.git-id b/docs/images/laconic-stack.png.REMOVED.git-id new file mode 100644 index 00000000..e7ffd2c5 --- /dev/null +++ b/docs/images/laconic-stack.png.REMOVED.git-id @@ -0,0 +1 @@ +8f6452ed13e85a447103a7fff7cf3fb8ff5ea51a \ No newline at end of file diff --git a/docs/spec.md b/docs/spec.md new file mode 100644 index 00000000..a3f4af4d --- /dev/null +++ b/docs/spec.md @@ -0,0 +1,37 @@ +# Spec + +TODO: update + +## Implementation +The orchestrator's operation is driven by files shown below. `repository-list.txt` container the list of git repositories; `container-image-list.txt` contains +the list of container image names, while `clister-list.txt` specifies the set of compose components (corresponding to individual docker-compose-xxx.yml files which may in turn specify more than one container). +Files required to build each container image are stored under `./container-build/` +Files required at deploy-time are stored under `./config/` +``` +├── pod-list.txt +├── compose +│   ├── docker-compose-contract.yml +│   ├── docker-compose-db-sharding.yml +│   ├── docker-compose-db.yml +│   ├── docker-compose-eth-statediff-fill-service.yml +│   ├── docker-compose-go-ethereum-foundry.yml +│   ├── docker-compose-ipld-eth-beacon-db.yml +│   ├── docker-compose-ipld-eth-beacon-indexer.yml +│   ├── docker-compose-ipld-eth-server.yml +│   ├── docker-compose-lighthouse.yml +│   └── docker-compose-prometheus-grafana.yml +├── config +│   └── ipld-eth-server +├── container-build +│   ├── cerc-eth-statediff-fill-service +│   ├── cerc-go-ethereum +│   ├── cerc-go-ethereum-foundry +│   ├── cerc-ipld-eth-beacon-db +│   ├── cerc-ipld-eth-beacon-indexer +│   ├── cerc-ipld-eth-db +│   ├── cerc-ipld-eth-server +│   ├── cerc-lighthouse +│   └── cerc-test-contract +├── container-image-list.txt +├── repository-list.txt +``` From 71425b93f66781609fc771a69c65a7cc1723f638 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 16 Jan 2023 21:56:07 -0700 Subject: [PATCH 0201/1010] Package deep enough into the data tree to get all the files that are there --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 94a2af53..19e416b2 100644 --- a/setup.py +++ b/setup.py @@ -20,7 +20,7 @@ setup( python_requires='>=3.7', include_package_data=True, # See: https://github.com/pypa/setuptools/issues/1806 - package_data={'': ['data/*', 'data/*/*', 'data/*/*/*']}, + package_data={'': ['data/*', 'data/*/*', 'data/*/*/*', 'data/*/*/*/*', 'data/*/*/*/*/*']}, classifiers=[ "Programming Language :: Python :: 3.8", "Operating System :: OS Independent", From 08d5c22f325e322976251de9ac7e4e3e1289ed5a Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Tue, 17 Jan 2023 12:04:28 -0600 Subject: [PATCH 0202/1010] Enable metrics endpoint in fixturenet. Former-commit-id: 0ea29bc4806a4ffd1735ce151fc740e38ee3f02b --- app/data/compose/docker-compose-fixturenet-eth.yml | 1 + app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh | 1 + 2 files changed, 2 insertions(+) diff --git a/app/data/compose/docker-compose-fixturenet-eth.yml b/app/data/compose/docker-compose-fixturenet-eth.yml index f833ca70..517b4832 100644 --- a/app/data/compose/docker-compose-fixturenet-eth.yml +++ b/app/data/compose/docker-compose-fixturenet-eth.yml @@ -34,6 +34,7 @@ services: ports: - "8545" - "40000" + - "6060" fixturenet-eth-geth-2: hostname: fixturenet-eth-geth-2 diff --git a/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh b/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh index 01672c39..93e34988 100755 --- a/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh +++ b/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh @@ -86,6 +86,7 @@ else --mine \ --miner.threads=1 \ --metrics \ + --metrics.addr="0.0.0.0" \ --verbosity=${CERC_GETH_VERBOSITY:-3} \ --vmodule="${CERC_GETH_VMODULE:-statediff/*=5}" \ --miner.etherbase="${ETHERBASE}" ${STATEDIFF_OPTS} From 500c481d6b8f00382df08395e2b4a6a6b380bdf6 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 17 Jan 2023 13:52:00 -0700 Subject: [PATCH 0203/1010] Update version Former-commit-id: cf3120d6c25e39525c958777a614a4c2130b3967 --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index 8f8652a3..09f6b7b3 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.7-alpha-7edfa1b +v1.0.9-alpha-32b4c00 From 2b15eff1043ebeb45879e0543b6639117b58cadb Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 17 Jan 2023 16:05:50 -0700 Subject: [PATCH 0204/1010] Initial implementation of stack Former-commit-id: 1d7128c6e1daf97c09b68b505a7a865333261ed0 --- app/setup_repositories.py | 11 +++++++++++ cli.py | 10 +++++++--- requirements.txt | 1 + 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/app/setup_repositories.py b/app/setup_repositories.py index 28ee2c9e..8f00ae0f 100644 --- a/app/setup_repositories.py +++ b/app/setup_repositories.py @@ -23,6 +23,7 @@ import git from tqdm import tqdm import click import importlib.resources +import yaml from .util import include_exclude_check @@ -64,9 +65,11 @@ def command(ctx, include, exclude, git_ssh, check_only, pull, branches_file): quiet = ctx.obj.quiet verbose = ctx.obj.verbose dry_run = ctx.obj.dry_run + stack = ctx.obj.stack branches = [] + # TODO: branches file needs to be re-worked in the context of stacks if branches_file: if verbose: print(f"loading branches from: {branches_file}") @@ -96,8 +99,16 @@ def command(ctx, include, exclude, git_ssh, check_only, pull, branches_file): with importlib.resources.open_text(data, "repository-list.txt") as repository_list_file: all_repos = repository_list_file.read().splitlines() + if stack: + resource_data_dir = importlib.resources.files(data) + with importlib.resources.as_file(resource_data_dir.joinpath(f"stacks/{stack}/stack.yml")) as stack_file_path: + stack_config = yaml.safe_load(open(stack_file_path, "r")) + print(f"stack is: {stack_config}") + if verbose: print(f"Repos: {all_repos}") + if stack: + print(f"Stack: {stack}") repos = [] for repo in all_repos: diff --git a/cli.py b/cli.py index e2e94ab2..c0fa3990 100644 --- a/cli.py +++ b/cli.py @@ -24,8 +24,11 @@ from app import version CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) +# TODO: this seems kind of weird and heavy on boilerplate -- check it is +# the best Python can do for us. class Options(object): - def __init__(self, quiet, verbose, dry_run, local_stack, debug): + def __init__(self, stack, quiet, verbose, dry_run, local_stack, debug): + self.stack = stack self.quiet = quiet self.verbose = verbose self.dry_run = dry_run @@ -34,6 +37,7 @@ class Options(object): @click.group(context_settings=CONTEXT_SETTINGS) +@click.option('--stack', help="specify a stack to build/deploy") @click.option('--quiet', is_flag=True, default=False) @click.option('--verbose', is_flag=True, default=False) @click.option('--dry-run', is_flag=True, default=False) @@ -41,9 +45,9 @@ class Options(object): @click.option('--debug', is_flag=True, default=False) # See: https://click.palletsprojects.com/en/8.1.x/complex/#building-a-git-clone @click.pass_context -def cli(ctx, quiet, verbose, dry_run, local_stack, debug): +def cli(ctx, stack, quiet, verbose, dry_run, local_stack, debug): """Laconic Stack Orchestrator""" - ctx.obj = Options(quiet, verbose, dry_run, local_stack, debug) + ctx.obj = Options(stack, quiet, verbose, dry_run, local_stack, debug) cli.add_command(setup_repositories.command, "setup-repositories") diff --git a/requirements.txt b/requirements.txt index 7ee8181a..128ee3a0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,3 +3,4 @@ GitPython>=3.1.27 tqdm>=4.64.0 python-on-whales>=0.52.0 click>=8.1.3 +pyyaml>=6.0 From a60fb08c8aea2433916f777a9ed995c166dfbdb7 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 17 Jan 2023 22:25:04 -0700 Subject: [PATCH 0205/1010] Make code compatible with Pyton 3.8 Former-commit-id: 04a3049162ee6fc99f0633eff4c1539dedd5c546 --- app/setup_repositories.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/setup_repositories.py b/app/setup_repositories.py index 8f00ae0f..1969c29c 100644 --- a/app/setup_repositories.py +++ b/app/setup_repositories.py @@ -23,6 +23,7 @@ import git from tqdm import tqdm import click import importlib.resources +from pathlib import Path import yaml from .util import include_exclude_check @@ -100,8 +101,10 @@ def command(ctx, include, exclude, git_ssh, check_only, pull, branches_file): all_repos = repository_list_file.read().splitlines() if stack: - resource_data_dir = importlib.resources.files(data) - with importlib.resources.as_file(resource_data_dir.joinpath(f"stacks/{stack}/stack.yml")) as stack_file_path: + # In order to be compatible with Python 3.8 we need to use this hack to get the path: + # See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure + stack_file_path = Path(__file__).absolute().parent.joinpath("data", "stacks", stack, "stack.yml") + with stack_file_path: stack_config = yaml.safe_load(open(stack_file_path, "r")) print(f"stack is: {stack_config}") From 5a4220ff41bb7e1bf69ff1983616a07ce4199743 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 17 Jan 2023 22:38:30 -0700 Subject: [PATCH 0206/1010] Update version info Former-commit-id: b0947081debe122007617b4355a134a95099b53c --- app/data/stacks/laconicd/stack.yml | 2 +- app/data/version.txt | 2 +- app/setup_repositories.py | 10 +++++++--- setup.py | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/app/data/stacks/laconicd/stack.yml b/app/data/stacks/laconicd/stack.yml index 6e262a08..d47a6fe5 100644 --- a/app/data/stacks/laconicd/stack.yml +++ b/app/data/stacks/laconicd/stack.yml @@ -1,5 +1,5 @@ version: "1.0" -name: laconicd-fixturenet +name: fixturenet-laconicd repos: - cerc-io/laconicd - cerc-io/laconic-sdk diff --git a/app/data/version.txt b/app/data/version.txt index 09f6b7b3..b583e2ff 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.9-alpha-32b4c00 +v1.0.9-alpha-04a3049 diff --git a/app/setup_repositories.py b/app/setup_repositories.py index 1969c29c..6f148b87 100644 --- a/app/setup_repositories.py +++ b/app/setup_repositories.py @@ -100,21 +100,25 @@ def command(ctx, include, exclude, git_ssh, check_only, pull, branches_file): with importlib.resources.open_text(data, "repository-list.txt") as repository_list_file: all_repos = repository_list_file.read().splitlines() + repos_in_scope = [] if stack: # In order to be compatible with Python 3.8 we need to use this hack to get the path: # See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure stack_file_path = Path(__file__).absolute().parent.joinpath("data", "stacks", stack, "stack.yml") with stack_file_path: stack_config = yaml.safe_load(open(stack_file_path, "r")) - print(f"stack is: {stack_config}") + # TODO: syntax check the input here + repos_in_scope = stack_config['repos'] + else: + repos_in_scope = all_repos if verbose: - print(f"Repos: {all_repos}") + print(f"Repos: {repos_in_scope}") if stack: print(f"Stack: {stack}") repos = [] - for repo in all_repos: + for repo in repos_in_scope: if include_exclude_check(repo, include, exclude): repos.append(repo) else: diff --git a/setup.py b/setup.py index 19e416b2..759c8c1e 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ with open("requirements.txt", "r", encoding="utf-8") as fh: requirements = fh.read() setup( name='laconic-stack-orchestrator', - version='0.0.5', + version='1.0.9', author='Cerc', author_email='info@cerc.io', license='GNU Affero General Public License', From 135295f0f9ac02c1d849f4dcf1f1325d480dc9b6 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 17 Jan 2023 22:43:07 -0700 Subject: [PATCH 0207/1010] Update version Former-commit-id: 5e2df891cf672bc567aa564c11c5bcbdcfaca927 --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index b583e2ff..6cd0c73d 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.9-alpha-04a3049 +v1.0.10-alpha-4e1366d From 5f73a93f5f5fd6c8df428d829e3115e1be826893 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 18 Jan 2023 15:27:52 -0700 Subject: [PATCH 0208/1010] Implement stack for container build Former-commit-id: d5875954b8d718708cfff132cdd988897051bbb4 --- app/build_containers.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/app/build_containers.py b/app/build_containers.py index 9951d6f8..8f03ccec 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -26,6 +26,7 @@ import subprocess import click import importlib.resources from pathlib import Path +import yaml from .util import include_exclude_check # TODO: find a place for this @@ -43,6 +44,7 @@ def command(ctx, include, exclude): verbose = ctx.obj.verbose dry_run = ctx.obj.dry_run local_stack = ctx.obj.local_stack + stack = ctx.obj.stack # See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure container_build_dir = Path(__file__).absolute().parent.joinpath("data", "container-build") @@ -62,10 +64,24 @@ def command(ctx, include, exclude): # See: https://stackoverflow.com/a/20885799/1701505 from . import data with importlib.resources.open_text(data, "container-image-list.txt") as container_list_file: - containers = container_list_file.read().splitlines() + all_containers = container_list_file.read().splitlines() + + containers_in_scope = [] + if stack: + # In order to be compatible with Python 3.8 we need to use this hack to get the path: + # See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure + stack_file_path = Path(__file__).absolute().parent.joinpath("data", "stacks", stack, "stack.yml") + with stack_file_path: + stack_config = yaml.safe_load(open(stack_file_path, "r")) + # TODO: syntax check the input here + containers_in_scope = stack_config['containers'] + else: + containers_in_scope = all_containers if verbose: - print(f'Containers: {containers}') + print(f'Containers: {containers_in_scope}') + if stack: + print(f"Stack: {stack}") # TODO: make this configurable container_build_env = { @@ -101,7 +117,7 @@ def command(ctx, include, exclude): else: print("Skipped") - for container in containers: + for container in containers_in_scope: if include_exclude_check(container, include, exclude): process_container(container) else: From 533ed4ee9b748437f3a07fa5d4aa40bad978072b Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 18 Jan 2023 15:37:12 -0700 Subject: [PATCH 0209/1010] Implement stack for deploy-system Former-commit-id: 6bf413e002c9294d6664f7fcb2c20791e35ceb33 --- app/deploy_system.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/app/deploy_system.py b/app/deploy_system.py index 250c42ba..6fc8b540 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -22,6 +22,7 @@ from python_on_whales import DockerClient import click import importlib.resources from pathlib import Path +import yaml from .util import include_exclude_check @@ -40,6 +41,7 @@ def command(ctx, include, exclude, cluster, command, services): quiet = ctx.obj.quiet verbose = ctx.obj.verbose dry_run = ctx.obj.dry_run + stack = ctx.obj.stack # See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure compose_dir = Path(__file__).absolute().parent.joinpath("data", "compose") @@ -56,15 +58,27 @@ def command(ctx, include, exclude, cluster, command, services): # See: https://stackoverflow.com/a/20885799/1701505 from . import data with importlib.resources.open_text(data, "pod-list.txt") as pod_list_file: - pods = pod_list_file.read().splitlines() + all_pods = pod_list_file.read().splitlines() + + pods_in_scope = [] + if stack: + # In order to be compatible with Python 3.8 we need to use this hack to get the path: + # See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure + stack_file_path = Path(__file__).absolute().parent.joinpath("data", "stacks", stack, "stack.yml") + with stack_file_path: + stack_config = yaml.safe_load(open(stack_file_path, "r")) + # TODO: syntax check the input here + pods_in_scope = stack_config['pods'] + else: + pods_in_scope = all_pods if verbose: - print(f"Pods: {pods}") + print(f"Pods: {pods_in_scope}") # Construct a docker compose command suitable for our purpose compose_files = [] - for pod in pods: + for pod in pods_in_scope: if include_exclude_check(pod, include, exclude): compose_file_name = os.path.join(compose_dir, f"docker-compose-{pod}.yml") compose_files.append(compose_file_name) From f1cd13d988b98042b9cb5721f798c3f1e6a9ede6 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 18 Jan 2023 22:01:55 -0700 Subject: [PATCH 0210/1010] Stack for build-npms Former-commit-id: 0b8b3123fe2281735c0b371ed2fa7de270845294 --- app/build_npms.py | 21 ++++++++++++++++--- .../README.md | 0 .../stack.yml | 3 +++ 3 files changed, 21 insertions(+), 3 deletions(-) rename app/data/stacks/{laconicd => fixturenet-laconicd}/README.md (100%) rename app/data/stacks/{laconicd => fixturenet-laconicd}/stack.yml (82%) diff --git a/app/build_npms.py b/app/build_npms.py index 48161248..8091a8a0 100644 --- a/app/build_npms.py +++ b/app/build_npms.py @@ -22,7 +22,9 @@ import os from decouple import config import click import importlib.resources +from pathlib import Path from python_on_whales import docker +import yaml from .util import include_exclude_check @click.command() @@ -37,6 +39,7 @@ def command(ctx, include, exclude): dry_run = ctx.obj.dry_run local_stack = ctx.obj.local_stack debug = ctx.obj.debug + stack = ctx.obj.stack if local_stack: dev_root_path = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] @@ -53,10 +56,22 @@ def command(ctx, include, exclude): # See: https://stackoverflow.com/a/20885799/1701505 from . import data with importlib.resources.open_text(data, "npm-package-list.txt") as package_list_file: - packages = package_list_file.read().splitlines() + all_packages = package_list_file.read().splitlines() + + packages_in_scope = [] + if stack: + # In order to be compatible with Python 3.8 we need to use this hack to get the path: + # See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure + stack_file_path = Path(__file__).absolute().parent.joinpath("data", "stacks", stack, "stack.yml") + with stack_file_path: + stack_config = yaml.safe_load(open(stack_file_path, "r")) + # TODO: syntax check the input here + packages_in_scope = stack_config['npms'] + else: + packages_in_scope = all_packages if verbose: - print(f'Packages: {packages}') + print(f'Packages: {packages_in_scope}') def build_package(package): if not quiet: @@ -84,7 +99,7 @@ def command(ctx, include, exclude): else: print("Skipped") - for package in packages: + for package in packages_in_scope: if include_exclude_check(package, include, exclude): build_package(package) else: diff --git a/app/data/stacks/laconicd/README.md b/app/data/stacks/fixturenet-laconicd/README.md similarity index 100% rename from app/data/stacks/laconicd/README.md rename to app/data/stacks/fixturenet-laconicd/README.md diff --git a/app/data/stacks/laconicd/stack.yml b/app/data/stacks/fixturenet-laconicd/stack.yml similarity index 82% rename from app/data/stacks/laconicd/stack.yml rename to app/data/stacks/fixturenet-laconicd/stack.yml index d47a6fe5..1d059b52 100644 --- a/app/data/stacks/laconicd/stack.yml +++ b/app/data/stacks/fixturenet-laconicd/stack.yml @@ -4,6 +4,9 @@ repos: - cerc-io/laconicd - cerc-io/laconic-sdk - cerc-io/laconic-registry-cli +npms: + - laconic-sdk + - laconic-registry-cli containers: - cerc/laconicd - cerc/laconic-registry-cli From 1cf58c900ee369812668e9aabca8e7de0bf28925 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 18 Jan 2023 22:07:04 -0700 Subject: [PATCH 0211/1010] Update version Former-commit-id: d05a47946a4d6fdcc24a4a312b3a7ac0bf871d20 --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index 6cd0c73d..de7a42a4 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.10-alpha-4e1366d +v1.0.11-alpha-683341a From b29537ad7c3ed01cdc7026434c2b1fa1da8e4705 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 19 Jan 2023 11:33:34 -0700 Subject: [PATCH 0212/1010] Fix various npm build issues Former-commit-id: 9fb96d845880e30d56234cc9485134c7a700abd7 --- .../build-npm-package-local-dependencies.sh | 2 ++ .../cerc-builder-js/build-npm-package.sh | 2 ++ .../cerc-builder-js/yarn-local-registry-fixup.sh | 14 ++++++++++++-- app/data/stacks/fixturenet-laconicd/stack.yml | 1 + 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh b/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh index 2824e008..69e8e99e 100755 --- a/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh +++ b/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh @@ -13,6 +13,8 @@ if [[ -z "${CERC_NPM_AUTH_TOKEN}" ]]; then echo "CERC_NPM_AUTH_TOKEN is not set" >&2 exit 1 fi +# Exit on error +set -e local_npm_registry_url=$1 package_publish_version=$2 # TODO: make this a paramater and allow a list of scopes diff --git a/app/data/container-build/cerc-builder-js/build-npm-package.sh b/app/data/container-build/cerc-builder-js/build-npm-package.sh index 9c9ac580..490389a3 100755 --- a/app/data/container-build/cerc-builder-js/build-npm-package.sh +++ b/app/data/container-build/cerc-builder-js/build-npm-package.sh @@ -17,6 +17,8 @@ if [[ $# -eq 2 ]]; then else package_publish_version=$( cat package.json | jq -r .version ) fi +# Exit on error +set -e # Get the name of this package from package.json since we weren't passed that package_name=$( cat package.json | jq -r .name ) local_npm_registry_url=$1 diff --git a/app/data/container-build/cerc-builder-js/yarn-local-registry-fixup.sh b/app/data/container-build/cerc-builder-js/yarn-local-registry-fixup.sh index 987fcbc2..3f4f095a 100755 --- a/app/data/container-build/cerc-builder-js/yarn-local-registry-fixup.sh +++ b/app/data/container-build/cerc-builder-js/yarn-local-registry-fixup.sh @@ -14,14 +14,23 @@ if [[ $# -ne 2 ]]; then echo "Illegal number of parameters" >&2 exit 1 fi +# Exit on error +set -e target_package=$1 local_npm_registry_url=$2 # TODO: use jq rather than sed here: versioned_target_package=$(grep ${target_package} package.json | sed -e 's#[[:space:]]\{1,\}\"\('${target_package}'\)\":[[:space:]]\{1,\}\"\(.*\)\",#\1@\2#' ) # Use yarn info to get URL checksums etc from the new registry yarn_info_output=$(yarn info --json $versioned_target_package 2>/dev/null) -# Code below parses out the values we need +# First check if the target version actually exists. +# If it doesn't exist there will be no .data.dist.tarball element, +# and jq will output the string "null" package_tarball=$(echo $yarn_info_output | jq -r .data.dist.tarball) +if [[ $package_tarball == "null" ]]; then + echo "FATAL: Target package version ($versioned_target_package) not found" >&2 + exit 1 +fi +# Code below parses out the values we need # When running inside a container, the registry can return a URL with the wrong host name due to proxying # so we need to check if that has happened and fix the URL if so. if ! [[ "${package_tarball}" =~ ^${local_npm_registry_url}.* ]]; then @@ -33,6 +42,7 @@ package_integrity=$(echo $yarn_info_output | jq -r .data.dist.integrity) package_shasum=$(echo $yarn_info_output | jq -r .data.dist.shasum) package_resolved=${package_tarball}#${package_shasum} # Some strings need to be escaped so they work when passed to sed later +escaped_package_integrity=$(printf '%s\n' "$package_integrity" | sed -e 's/[\/&]/\\&/g') escaped_package_resolved=$(printf '%s\n' "$package_resolved" | sed -e 's/[\/&]/\\&/g') escaped_target_package=$(printf '%s\n' "$target_package" | sed -e 's/[\/&]/\\&/g') if [ -n "$CERC_SCRIPT_VERBOSE" ]; then @@ -44,4 +54,4 @@ fi # Use magic sed regex to replace the values in yarn.lock # Note: yarn.lock is not json so we can not use jq for this sed -i -e '/^\"'${escaped_target_package}'.*\":$/ , /^\".*$/ s/^\([[:space:]]\{1,\}resolved \).*$/\1'\"${escaped_package_resolved}\"'/' yarn.lock -sed -i -e '/^\"'${escaped_target_package}'.*\":$/ , /^\".*$/ s/^\([[:space:]]\{1,\}integrity \).*$/\1'${package_integrity}'/' yarn.lock +sed -i -e '/^\"'${escaped_target_package}'.*\":$/ , /^\".*$/ s/^\([[:space:]]\{1,\}integrity \).*$/\1'${escaped_package_integrity}'/' yarn.lock diff --git a/app/data/stacks/fixturenet-laconicd/stack.yml b/app/data/stacks/fixturenet-laconicd/stack.yml index 1d059b52..fca9623f 100644 --- a/app/data/stacks/fixturenet-laconicd/stack.yml +++ b/app/data/stacks/fixturenet-laconicd/stack.yml @@ -1,5 +1,6 @@ version: "1.0" name: fixturenet-laconicd +description: "A laconicd fixturenet" repos: - cerc-io/laconicd - cerc-io/laconic-sdk From 7a9926b6956df8a17467fc4223f39457dfbd940a Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 19 Jan 2023 13:00:06 -0700 Subject: [PATCH 0213/1010] Remove extraneous stderr output Former-commit-id: 3b5efc8f0f3a9f671e852433f94ae8e612508c18 --- app/data/container-build/cerc-builder-js/build-npm-package.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/container-build/cerc-builder-js/build-npm-package.sh b/app/data/container-build/cerc-builder-js/build-npm-package.sh index 490389a3..e0d19481 100755 --- a/app/data/container-build/cerc-builder-js/build-npm-package.sh +++ b/app/data/container-build/cerc-builder-js/build-npm-package.sh @@ -26,7 +26,7 @@ npm config set @lirewine:registry ${local_npm_registry_url} npm config set @cerc-io:registry ${local_npm_registry_url} npm config set -- ${local_npm_registry_url}:_authToken ${CERC_NPM_AUTH_TOKEN} # First check if the version of this package we're trying to build already exists in the registry -package_exists=$( yarn info --json ${package_name}@${package_publish_version} | jq -r .data.dist.tarball ) +package_exists=$( yarn info --json ${package_name}@${package_publish_version} 2>/dev/null | jq -r .data.dist.tarball ) if [[ ! -z "$package_exists" && "$package_exists" != "null" ]]; then echo "${package_publish_version} of ${package_name} already exists in the registry, skipping build" exit 0 From 429e04f81d596a09a2fe77e16b3c1ebb659ac476 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 19 Jan 2023 13:00:35 -0700 Subject: [PATCH 0214/1010] Catch docker run exceptions Former-commit-id: 68c7f91052a6b6c14eb4c7f8e8c0f7936441114d --- app/build_npms.py | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/app/build_npms.py b/app/build_npms.py index 8091a8a0..6801dd7d 100644 --- a/app/build_npms.py +++ b/app/build_npms.py @@ -23,7 +23,7 @@ from decouple import config import click import importlib.resources from pathlib import Path -from python_on_whales import docker +from python_on_whales import docker, DockerException import yaml from .util import include_exclude_check @@ -84,18 +84,21 @@ def command(ctx, include, exclude): if verbose: print(f"Executing: {build_command}") envs = {"CERC_NPM_AUTH_TOKEN": os.environ["CERC_NPM_AUTH_TOKEN"]} | ({"CERC_SCRIPT_DEBUG": "true"} if debug else {}) - build_result = docker.run("cerc/builder-js", - remove=True, - interactive=True, - tty=True, - user=f"{os.getuid()}:{os.getgid()}", - envs=envs, - add_hosts=[("gitea.local", "host-gateway")], - volumes=[(repo_full_path, "/workspace")], - command=build_command - ) - # TODO: check result in build_result.returncode - print(f"Result is: {build_result}") + try: + build_result = docker.run("cerc/builder-js", + remove=True, + interactive=True, + tty=True, + user=f"{os.getuid()}:{os.getgid()}", + envs=envs, + add_hosts=[("gitea.local", "host-gateway")], + volumes=[(repo_full_path, "/workspace")], + command=build_command + ) + # TODO: check result in build_result.returncode + print(f"Result is: {build_result}") + except DockerException as e: + print(f"FATAL error executing build in container:\n {e}") else: print("Skipped") From 8f9f23b1c41dbe88d90d52ecb2954806063d41fc Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 19 Jan 2023 13:20:53 -0700 Subject: [PATCH 0215/1010] Implement stop on error building containers Former-commit-id: bbbb57ec065ae50a81484614ac2800f7f41c5a40 --- app/build_containers.py | 13 +++++++++++-- cli.py | 8 +++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/app/build_containers.py b/app/build_containers.py index 8f03ccec..75e78f2d 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -21,6 +21,7 @@ # TODO: display the available list of containers; allow re-build of either all or specific containers import os +import sys from decouple import config import subprocess import click @@ -45,6 +46,7 @@ def command(ctx, include, exclude): dry_run = ctx.obj.dry_run local_stack = ctx.obj.local_stack stack = ctx.obj.stack + continue_on_error = ctx.obj.continue_on_error # See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure container_build_dir = Path(__file__).absolute().parent.joinpath("data", "container-build") @@ -112,8 +114,15 @@ def command(ctx, include, exclude): if verbose: print(f"Executing: {build_command}") build_result = subprocess.run(build_command, shell=True, env=container_build_env) - # TODO: check result in build_result.returncode - print(f"Result is: {build_result}") + if verbose: + print(f"Return code is: {build_result.returncode}") + if build_result.returncode != 0: + print(f"Error running build for {container}") + if not continue_on_error: + print("FATAL Error: container build failed and --continue-on-error not set, exiting") + sys.exit(1) + else: + print("****** Container Build Error, continuing because --continue-on-error is set") else: print("Skipped") diff --git a/cli.py b/cli.py index c0fa3990..04ecd738 100644 --- a/cli.py +++ b/cli.py @@ -27,13 +27,14 @@ CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) # TODO: this seems kind of weird and heavy on boilerplate -- check it is # the best Python can do for us. class Options(object): - def __init__(self, stack, quiet, verbose, dry_run, local_stack, debug): + def __init__(self, stack, quiet, verbose, dry_run, local_stack, debug, continue_on_error): self.stack = stack self.quiet = quiet self.verbose = verbose self.dry_run = dry_run self.local_stack = local_stack self.debug = debug + self.continue_on_error = continue_on_error @click.group(context_settings=CONTEXT_SETTINGS) @@ -43,11 +44,12 @@ class Options(object): @click.option('--dry-run', is_flag=True, default=False) @click.option('--local-stack', is_flag=True, default=False) @click.option('--debug', is_flag=True, default=False) +@click.option('--continue-on-error', is_flag=True, default=False) # See: https://click.palletsprojects.com/en/8.1.x/complex/#building-a-git-clone @click.pass_context -def cli(ctx, stack, quiet, verbose, dry_run, local_stack, debug): +def cli(ctx, stack, quiet, verbose, dry_run, local_stack, debug, continue_on_error): """Laconic Stack Orchestrator""" - ctx.obj = Options(stack, quiet, verbose, dry_run, local_stack, debug) + ctx.obj = Options(stack, quiet, verbose, dry_run, local_stack, debug, continue_on_error) cli.add_command(setup_repositories.command, "setup-repositories") From 7d00228ca2e0043c82b008564bbae092b3d3b752 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 19 Jan 2023 13:30:01 -0700 Subject: [PATCH 0216/1010] Remove result code check Former-commit-id: 6faa933d42a6f80abecee635c8497d9d3502010d --- app/build_npms.py | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/app/build_npms.py b/app/build_npms.py index 6801dd7d..526f78f1 100644 --- a/app/build_npms.py +++ b/app/build_npms.py @@ -85,18 +85,19 @@ def command(ctx, include, exclude): print(f"Executing: {build_command}") envs = {"CERC_NPM_AUTH_TOKEN": os.environ["CERC_NPM_AUTH_TOKEN"]} | ({"CERC_SCRIPT_DEBUG": "true"} if debug else {}) try: - build_result = docker.run("cerc/builder-js", - remove=True, - interactive=True, - tty=True, - user=f"{os.getuid()}:{os.getgid()}", - envs=envs, - add_hosts=[("gitea.local", "host-gateway")], - volumes=[(repo_full_path, "/workspace")], - command=build_command - ) - # TODO: check result in build_result.returncode - print(f"Result is: {build_result}") + docker.run("cerc/builder-js", + remove=True, + interactive=True, + tty=True, + user=f"{os.getuid()}:{os.getgid()}", + envs=envs, + add_hosts=[("gitea.local", "host-gateway")], + volumes=[(repo_full_path, "/workspace")], + command=build_command + ) + # Note that although the docs say that build_result should contain + # the command output as a string, in reality it is always the empty string. + # Since we detect errors via catching exceptions below, we can safely ignore it here. except DockerException as e: print(f"FATAL error executing build in container:\n {e}") else: From 6ed90536cf39e8df5096be5f22caad1b9387eed1 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 19 Jan 2023 13:38:04 -0700 Subject: [PATCH 0217/1010] Implement continue on error for npm builds Former-commit-id: 34aa613d04574284383885586f6d72e068603d19 --- app/build_npms.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/build_npms.py b/app/build_npms.py index 526f78f1..4f0ea219 100644 --- a/app/build_npms.py +++ b/app/build_npms.py @@ -19,6 +19,7 @@ # CERC_REPO_BASE_DIR defaults to ~/cerc import os +import sys from decouple import config import click import importlib.resources @@ -40,6 +41,7 @@ def command(ctx, include, exclude): local_stack = ctx.obj.local_stack debug = ctx.obj.debug stack = ctx.obj.stack + continue_on_error = ctx.obj.continue_on_error if local_stack: dev_root_path = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] @@ -99,7 +101,13 @@ def command(ctx, include, exclude): # the command output as a string, in reality it is always the empty string. # Since we detect errors via catching exceptions below, we can safely ignore it here. except DockerException as e: - print(f"FATAL error executing build in container:\n {e}") + print(f"Error executing build for {package} in container:\n {e}") + if not continue_on_error: + print("FATAL Error: build failed and --continue-on-error not set, exiting") + sys.exit(1) + else: + print("****** Build Error, continuing because --continue-on-error is set") + else: print("Skipped") From edb7346f31e4d2d328be8607679373b6164a77aa Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 19 Jan 2023 14:13:57 -0700 Subject: [PATCH 0218/1010] Error check stack config Former-commit-id: d454a4ffc12d631f08a41c3d48672adefad84a70 --- app/build_containers.py | 14 ++++---------- app/build_npms.py | 16 +++++----------- app/deploy_system.py | 15 +++++---------- app/util.py | 28 +++++++++++++++++++++++++++- 4 files changed, 41 insertions(+), 32 deletions(-) diff --git a/app/build_containers.py b/app/build_containers.py index 75e78f2d..52ba3103 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -1,4 +1,4 @@ -# Copyright © 2022 Cerc +# Copyright © 2022, 2023 Cerc # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by @@ -27,8 +27,7 @@ import subprocess import click import importlib.resources from pathlib import Path -import yaml -from .util import include_exclude_check +from .util import include_exclude_check, get_parsed_stack_config # TODO: find a place for this # epilog="Config provided either in .env or settings.ini or env vars: CERC_REPO_BASE_DIR (defaults to ~/cerc)" @@ -70,13 +69,8 @@ def command(ctx, include, exclude): containers_in_scope = [] if stack: - # In order to be compatible with Python 3.8 we need to use this hack to get the path: - # See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure - stack_file_path = Path(__file__).absolute().parent.joinpath("data", "stacks", stack, "stack.yml") - with stack_file_path: - stack_config = yaml.safe_load(open(stack_file_path, "r")) - # TODO: syntax check the input here - containers_in_scope = stack_config['containers'] + stack_config = get_parsed_stack_config(stack) + containers_in_scope = stack_config['containers'] else: containers_in_scope = all_containers diff --git a/app/build_npms.py b/app/build_npms.py index 4f0ea219..3cf7d404 100644 --- a/app/build_npms.py +++ b/app/build_npms.py @@ -1,4 +1,4 @@ -# Copyright © 2022 Cerc +# Copyright © 2022, 2023 Cerc # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by @@ -23,10 +23,8 @@ import sys from decouple import config import click import importlib.resources -from pathlib import Path from python_on_whales import docker, DockerException -import yaml -from .util import include_exclude_check +from .util import include_exclude_check, get_parsed_stack_config @click.command() @click.option('--include', help="only build these packages") @@ -62,13 +60,9 @@ def command(ctx, include, exclude): packages_in_scope = [] if stack: - # In order to be compatible with Python 3.8 we need to use this hack to get the path: - # See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure - stack_file_path = Path(__file__).absolute().parent.joinpath("data", "stacks", stack, "stack.yml") - with stack_file_path: - stack_config = yaml.safe_load(open(stack_file_path, "r")) - # TODO: syntax check the input here - packages_in_scope = stack_config['npms'] + stack_config = get_parsed_stack_config(stack) + # TODO: syntax check the input here + packages_in_scope = stack_config['npms'] else: packages_in_scope = all_packages diff --git a/app/deploy_system.py b/app/deploy_system.py index 6fc8b540..6771e5ee 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -1,4 +1,4 @@ -# Copyright © 2022 Cerc +# Copyright © 2022, 2023 Cerc # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by @@ -22,8 +22,7 @@ from python_on_whales import DockerClient import click import importlib.resources from pathlib import Path -import yaml -from .util import include_exclude_check +from .util import include_exclude_check, get_parsed_stack_config @click.command() @@ -62,13 +61,9 @@ def command(ctx, include, exclude, cluster, command, services): pods_in_scope = [] if stack: - # In order to be compatible with Python 3.8 we need to use this hack to get the path: - # See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure - stack_file_path = Path(__file__).absolute().parent.joinpath("data", "stacks", stack, "stack.yml") - with stack_file_path: - stack_config = yaml.safe_load(open(stack_file_path, "r")) - # TODO: syntax check the input here - pods_in_scope = stack_config['pods'] + stack_config = get_parsed_stack_config(stack) + # TODO: syntax check the input here + pods_in_scope = stack_config['pods'] else: pods_in_scope = all_pods diff --git a/app/util.py b/app/util.py index bbf84398..127de213 100644 --- a/app/util.py +++ b/app/util.py @@ -1,4 +1,4 @@ -# Copyright © 2022 Cerc +# Copyright © 2022, 2023 Cerc # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by @@ -13,6 +13,12 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import os.path +import sys +import yaml +from pathlib import Path + + def include_exclude_check(s, include, exclude): if include is None and exclude is None: return True @@ -22,3 +28,23 @@ def include_exclude_check(s, include, exclude): if exclude is not None: exclude_list = exclude.split(",") return s not in exclude_list + + +def get_parsed_stack_config(stack): + # In order to be compatible with Python 3.8 we need to use this hack to get the path: + # See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure + stack_file_path = Path(__file__).absolute().parent.joinpath("data", "stacks", stack, "stack.yml") + try: + with stack_file_path: + stack_config = yaml.safe_load(open(stack_file_path, "r")) + return stack_config + except FileNotFoundError as error: + # We try here to generate a useful diagnostic error + # First check if the stack directory is present + stack_directory = stack_file_path.parent + if os.path.exists(stack_directory): + print(f"Error: stack.yml file is missing from stack: {stack}") + else: + print(f"Error: stack: {stack} does not exist") + print(f"Exiting, error: {error}") + sys.exit(1) From 5e7b51ee6ab94a5d1dc4f2851712a9e5b4f81e8e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 19 Jan 2023 14:19:39 -0700 Subject: [PATCH 0219/1010] Update version Former-commit-id: 6ae86dbcec10793bb719c52b562f89d2d3b9d65b --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index de7a42a4..5184d64e 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.11-alpha-683341a +v1.0.11-alpha-edbf674 From 6ad2684de3a2a240095751c08b47e543e4a07173 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 19 Jan 2023 14:21:13 -0700 Subject: [PATCH 0220/1010] Update version Former-commit-id: 1cdf0f301568875dbc1657f3d5382c8d13c15440 --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index 5184d64e..031aa7e6 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.11-alpha-edbf674 +v1.0.12-alpha-6ae86db From a44c063e5a80e3511cfc1aa652e209e91171f03e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 19 Jan 2023 14:21:33 -0700 Subject: [PATCH 0221/1010] Update version Former-commit-id: c949fe091f59c17bbd7383332b5a9ff41f5a1320 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 759c8c1e..562914eb 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ with open("requirements.txt", "r", encoding="utf-8") as fh: requirements = fh.read() setup( name='laconic-stack-orchestrator', - version='1.0.9', + version='1.0.12', author='Cerc', author_email='info@cerc.io', license='GNU Affero General Public License', From 42dac0e712a4b78096096bd030bd9bc875e73c27 Mon Sep 17 00:00:00 2001 From: zramsay Date: Fri, 20 Jan 2023 08:03:54 -0500 Subject: [PATCH 0222/1010] db -> ipld-eth-db Former-commit-id: e9c24a0b825434b80b73a02a255bfe314c0d1f64 --- app/data/stacks/erc20/stack.yml | 2 +- app/data/stacks/erc721/stack.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/data/stacks/erc20/stack.yml b/app/data/stacks/erc20/stack.yml index e9b0eb6d..104d66c1 100644 --- a/app/data/stacks/erc20/stack.yml +++ b/app/data/stacks/erc20/stack.yml @@ -13,6 +13,6 @@ containers: - cerc/watcher-erc20 pods: - go-ethereum-foundry - - db + - ipld-eth-db - ipld-eth-server - watcher-erc20 diff --git a/app/data/stacks/erc721/stack.yml b/app/data/stacks/erc721/stack.yml index 85072d4f..28791473 100644 --- a/app/data/stacks/erc721/stack.yml +++ b/app/data/stacks/erc721/stack.yml @@ -13,6 +13,6 @@ containers: - cerc/watcher-erc721 pods: - go-ethereum-foundry - - db + - ipld-eth-db - ipld-eth-server - watcher-erc721 From dca9a366334e550978ab940edc04f2d3f5b53d9f Mon Sep 17 00:00:00 2001 From: zramsay Date: Fri, 20 Jan 2023 11:04:24 -0500 Subject: [PATCH 0223/1010] stack diagram: fix diagram & compress img Former-commit-id: 4c84896090171dd71789559a366c6a6a4c363ace --- docs/images/laconic-stack.png | Bin 0 -> 1023040 bytes docs/images/laconic-stack.png.REMOVED.git-id | 1 - 2 files changed, 1 deletion(-) create mode 100644 docs/images/laconic-stack.png delete mode 100644 docs/images/laconic-stack.png.REMOVED.git-id diff --git a/docs/images/laconic-stack.png b/docs/images/laconic-stack.png new file mode 100644 index 0000000000000000000000000000000000000000..6d0ab4c05317e57c1f535de076321042416f2bd7 GIT binary patch literal 1023040 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

    -|`xwTk3c; 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 r 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 e6cl0 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

    r3-I=?jx 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�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 literal 0 HcmV?d00001 diff --git a/docs/images/laconic-stack.png.REMOVED.git-id b/docs/images/laconic-stack.png.REMOVED.git-id deleted file mode 100644 index e7ffd2c5..00000000 --- a/docs/images/laconic-stack.png.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -8f6452ed13e85a447103a7fff7cf3fb8ff5ea51a \ No newline at end of file From 78cd4e2e3ed4132d713f8aac81d5c93268343ef3 Mon Sep 17 00:00:00 2001 From: zramsay Date: Fri, 20 Jan 2023 11:21:14 -0500 Subject: [PATCH 0224/1010] fixup spec Former-commit-id: 00c151580785623aa4e838c918f4eb814cfd83bc --- docs/spec.md | 73 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 14 deletions(-) diff --git a/docs/spec.md b/docs/spec.md index a3f4af4d..7bf038cb 100644 --- a/docs/spec.md +++ b/docs/spec.md @@ -1,37 +1,82 @@ -# Spec +# Specification -TODO: update ## Implementation -The orchestrator's operation is driven by files shown below. `repository-list.txt` container the list of git repositories; `container-image-list.txt` contains -the list of container image names, while `clister-list.txt` specifies the set of compose components (corresponding to individual docker-compose-xxx.yml files which may in turn specify more than one container). -Files required to build each container image are stored under `./container-build/` -Files required at deploy-time are stored under `./config/` + +The orchestrator's operation is driven by files shown below. + +- `repository-list.txt` contains the list of git repositories; +- `container-image-list.txt` contains the list of container image names +- `pod-list.txt` specifies the set of compose components (corresponding to individual docker-compose-xxx.yml files which may in turn specify more than one container). +- `container-build/` contains the files required to build each container image +- `config/` contains the files required at deploy time + ``` +├── container-image-list.txt ├── pod-list.txt +├── repository-list.txt ├── compose │   ├── docker-compose-contract.yml -│   ├── docker-compose-db-sharding.yml -│   ├── docker-compose-db.yml +│   ├── docker-compose-eth-probe.yml │   ├── docker-compose-eth-statediff-fill-service.yml +│   ├── docker-compose-fixturenet-eth.yml +│   ├── docker-compose-fixturenet-laconicd.yml │   ├── docker-compose-go-ethereum-foundry.yml │   ├── docker-compose-ipld-eth-beacon-db.yml │   ├── docker-compose-ipld-eth-beacon-indexer.yml +│   ├── docker-compose-ipld-eth-db.yml │   ├── docker-compose-ipld-eth-server.yml -│   ├── docker-compose-lighthouse.yml -│   └── docker-compose-prometheus-grafana.yml +│   ├── docker-compose-keycloak.yml +│   ├── docker-compose-laconicd.yml +│   ├── docker-compose-prometheus-grafana.yml +│   ├── docker-compose-test.yml +│   ├── docker-compose-tx-spammer.yml +│   ├── docker-compose-watcher-erc20.yml +│   ├── docker-compose-watcher-erc721.yml +│   ├── docker-compose-watcher-mobymask.yml +│   └── docker-compose-watcher-uniswap-v3.yml ├── config -│   └── ipld-eth-server +│   ├── fixturenet-eth +│   ├── fixturenet-laconicd +│   ├── ipld-eth-beacon-indexer +│   ├── ipld-eth-server +│   ├── keycloak +│   ├── postgresql +│   ├── tx-spammer +│   ├── watcher-erc20 +│   ├── watcher-erc721 +│   ├── watcher-mobymask +│   └── watcher-uniswap-v3 ├── container-build +│   ├── cerc-builder-js +│   ├── cerc-eth-probe │   ├── cerc-eth-statediff-fill-service +│   ├── cerc-eth-statediff-service +│   ├── cerc-fixturenet-eth-geth +│   ├── cerc-fixturenet-eth-lighthouse │   ├── cerc-go-ethereum │   ├── cerc-go-ethereum-foundry │   ├── cerc-ipld-eth-beacon-db │   ├── cerc-ipld-eth-beacon-indexer │   ├── cerc-ipld-eth-db │   ├── cerc-ipld-eth-server +│   ├── cerc-keycloak +│   ├── cerc-laconic-registry-cli +│   ├── cerc-laconicd │   ├── cerc-lighthouse -│   └── cerc-test-contract -├── container-image-list.txt -├── repository-list.txt +│   ├── cerc-test-container +│   ├── cerc-test-contract +│   ├── cerc-tx-spammer +│   ├── cerc-uniswap-v3-info +│   ├── cerc-watcher-erc20 +│   ├── cerc-watcher-erc721 +│   ├── cerc-watcher-mobymask +│   ├── cerc-watcher-uniswap-v3 +└── stacks + ├── erc20 + ├── erc721 + ├── fixturenet-eth + ├── fixturenet-laconicd + ├── mobymask + └── uniswap-v3 ``` From dfef77f35f8584b34a74f41bf1e2880fc0b95ede Mon Sep 17 00:00:00 2001 From: zramsay Date: Fri, 20 Jan 2023 11:35:57 -0500 Subject: [PATCH 0225/1010] update CONTRIBUTING Former-commit-id: d3f63b897506cbf5cc966cfe558a2e5c898fc830 --- README.md | 8 +++---- {.github => docs}/CONTRIBUTING.md | 35 +++++++++++++++++++++---------- 2 files changed, 28 insertions(+), 15 deletions(-) rename {.github => docs}/CONTRIBUTING.md (83%) diff --git a/README.md b/README.md index db879530..b2c86f4b 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,9 @@ Stack Orchestrator allows building and deployment of a Laconic Stack on a single Ensure that the following are already installed: -- [Python3](https://wiki.python.org/moin/BeginnersGuide/Download) -- [Docker](https://docs.docker.com/get-docker/) -- [Docker Compose](https://docs.docker.com/compose/install/) +- [Python3](https://wiki.python.org/moin/BeginnersGuide/Download): `python3 --version` >= `3.10.8` +- [Docker](https://docs.docker.com/get-docker/): `docker --version` >= `20.10.21` +- [Docker Compose](https://docs.docker.com/compose/install/): `docker-compose --version` >= `2.13.0` Note: if installing docker-compose via package manager (as opposed to Docker Desktop), you must [install the plugin](https://docs.docker.com/compose/install/linux/#install-the-plugin-manually), e.g., on Linux: @@ -97,7 +97,7 @@ laconic-so --verbose deploy-system --include ipld-eth-db,go-ethereum-foundry,ipl ## Contributing -See the [CONTRIBUTING.md](.github/CONTRIBUTING.md) for developer mode install. +See the [CONTRIBUTING.md](/docs/CONTRIBUTING.md) for developer mode install. ## Platform Support diff --git a/.github/CONTRIBUTING.md b/docs/CONTRIBUTING.md similarity index 83% rename from .github/CONTRIBUTING.md rename to docs/CONTRIBUTING.md index 5b73c490..93437364 100644 --- a/.github/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -5,8 +5,11 @@ Thank you for taking the time to make a contribution to Stack Orchestrator. ## Install (developer mode) Suitable for developers either modifying or debugging the orchestrator Python code: -#### Prerequisites -In addition to the binary install prerequisites listed above, the following are required: + +### Prerequisites + +In addition to the pre-requisites listed in the [README](/README.md), the following are required: + 1. Python venv package This may or may not be already installed depending on the host OS and version. Check by running: ``` @@ -18,26 +21,32 @@ In addition to the binary install prerequisites listed above, the following are ``` $ apt install python3.10-venv ``` -#### Install + +### Install + 1. Clone this repository: ``` $ git clone (https://github.com/cerc-io/stack-orchestrator.git ``` -4. Enter the project directory: + +2. Enter the project directory: ``` $ cd stack-orchestrator ``` -5. Create and activate a venv: + +3. Create and activate a venv: ``` $ python3 -m venv venv $ source ./venv/bin/activate (venv) $ ``` -6. Install the cli in edit mode: + +4. Install the cli in edit mode: ``` $ pip install --editable . ``` -7. Verify installation: + +5. Verify installation: ``` (venv) $ laconic-so Usage: laconic-so [OPTIONS] COMMAND [ARGS]... @@ -56,19 +65,23 @@ In addition to the binary install prerequisites listed above, the following are setup-repositories git clone the set of repositories required to build... ``` -#### Build a zipapp (single file distributable script) +## Build a zipapp (single file distributable script) + Use shiv to build a single file Python executable zip archive of laconic-so: + 1. Install [shiv](https://github.com/linkedin/shiv): ``` $ (venv) pip install shiv $ (venv) pip install wheel ``` -1. Run shiv to create a zipapp file: + +2. Run shiv to create a zipapp file: ``` $ (venv) shiv -c laconic-so -o laconic-so . ``` This creates a file `./laconic-so` that is executable outside of any venv, and on other machines and OSes and architectures, and requiring only the system Python3: -1. Verify it works: + +3. Verify it works: ``` $ cp stack-orchetrator/laconic-so ~/bin $ laconic-so @@ -88,4 +101,4 @@ Use shiv to build a single file Python executable zip archive of laconic-so: setup-repositories git clone the set of repositories required to build... ``` - +For cutting releases, use the [shiv build script](/scripts/build_shiv_package.sh). From b2268a65183abeac9aaba776a8d5919510e07ca9 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 22 Jan 2023 21:50:50 -0700 Subject: [PATCH 0226/1010] Add gerbil builder container Former-commit-id: 8843b894e22044a0e3d16b57abbad6f4fa8f8a42 --- .../cerc-builder-gerbil/Dockerfile | 17 +++++++++++++++++ .../cerc-builder-gerbil/README.md | 6 ++++++ .../cerc-builder-gerbil/entrypoint.sh | 2 ++ .../cerc-builder-gerbil/install-dependencies.sh | 15 +++++++++++++++ app/data/container-image-list.txt | 1 + 5 files changed, 41 insertions(+) create mode 100644 app/data/container-build/cerc-builder-gerbil/Dockerfile create mode 100644 app/data/container-build/cerc-builder-gerbil/README.md create mode 100755 app/data/container-build/cerc-builder-gerbil/entrypoint.sh create mode 100755 app/data/container-build/cerc-builder-gerbil/install-dependencies.sh diff --git a/app/data/container-build/cerc-builder-gerbil/Dockerfile b/app/data/container-build/cerc-builder-gerbil/Dockerfile new file mode 100644 index 00000000..af077286 --- /dev/null +++ b/app/data/container-build/cerc-builder-gerbil/Dockerfile @@ -0,0 +1,17 @@ +# From: https://github.com/vyzo/gerbil/blob/master/docker/Dockerfile +FROM gerbil/ubuntu + +# Install the Solidity compiler (latest stable version) +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive && export DEBCONF_NOWARNINGS="yes" \ + apt-get install -y software-properties-common && \ + add-apt-repository ppa:ethereum/ethereum && \ + apt-get update && apt-get install -y solc && \ + RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +RUN mkdir /scripts +COPY install-dependencies.sh /scripts + +RUN bash /scripts/install-dependencies.sh + +COPY entrypoint.sh . +ENTRYPOINT ["./entrypoint.sh"] diff --git a/app/data/container-build/cerc-builder-gerbil/README.md b/app/data/container-build/cerc-builder-gerbil/README.md new file mode 100644 index 00000000..f5cbe601 --- /dev/null +++ b/app/data/container-build/cerc-builder-gerbil/README.md @@ -0,0 +1,6 @@ +## Gerbil Scheme Builder + +This container is designed to be used as a simple "build runner" environment for building and running Scheme projects +using Gerbil and gerbil-ethereum. + + diff --git a/app/data/container-build/cerc-builder-gerbil/entrypoint.sh b/app/data/container-build/cerc-builder-gerbil/entrypoint.sh new file mode 100755 index 00000000..311cb8cb --- /dev/null +++ b/app/data/container-build/cerc-builder-gerbil/entrypoint.sh @@ -0,0 +1,2 @@ +#!/bin/sh +exec "$@" diff --git a/app/data/container-build/cerc-builder-gerbil/install-dependencies.sh b/app/data/container-build/cerc-builder-gerbil/install-dependencies.sh new file mode 100755 index 00000000..c6725ef8 --- /dev/null +++ b/app/data/container-build/cerc-builder-gerbil/install-dependencies.sh @@ -0,0 +1,15 @@ +DEPS=(github.com/fare/gerbil-utils + github.com/fare/gerbil-poo + github.com/fare/gerbil-crypto + github.com/fare/gerbil-persist + github.com/fare/gerbil-ethereum + github.com/drewc/gerbil-swank + github.com/drewc/drewc-r7rs-swank + github.com/drewc/smug-gerbil + github.com/drewc/ftw + github.com/vyzo/gerbil-libp2p + ) ; +for i in ${DEPS[@]} ; do + gxpkg install $i && + gxpkg build $i +done diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index 48d5bc04..7e5a0191 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -22,3 +22,4 @@ cerc/eth-probe cerc/builder-js cerc/keycloak cerc/tx-spammer +cerc/builder-gerbil From 7bd8045d6e39adeb55b0fc883a0ebcbac6251aca Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 22 Jan 2023 22:12:05 -0700 Subject: [PATCH 0227/1010] Fix bugs Former-commit-id: 46bcc2f882ffc5dc4e685f22ccaca0b23b83738d --- .../container-build/cerc-builder-gerbil/Dockerfile | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/data/container-build/cerc-builder-gerbil/Dockerfile b/app/data/container-build/cerc-builder-gerbil/Dockerfile index af077286..3daf6003 100644 --- a/app/data/container-build/cerc-builder-gerbil/Dockerfile +++ b/app/data/container-build/cerc-builder-gerbil/Dockerfile @@ -2,16 +2,19 @@ FROM gerbil/ubuntu # Install the Solidity compiler (latest stable version) -RUN apt-get update && export DEBIAN_FRONTEND=noninteractive && export DEBCONF_NOWARNINGS="yes" \ +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive && export DEBCONF_NOWARNINGS="yes" && \ apt-get install -y software-properties-common && \ add-apt-repository ppa:ethereum/ethereum && \ apt-get update && apt-get install -y solc && \ - RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* RUN mkdir /scripts COPY install-dependencies.sh /scripts RUN bash /scripts/install-dependencies.sh -COPY entrypoint.sh . -ENTRYPOINT ["./entrypoint.sh"] +# Needed to prevent git from raging about /src +RUN git config --global --add safe.directory /src + +COPY entrypoint.sh /scripts +ENTRYPOINT ["/scripts/entrypoint.sh"] From e183e2a880617c238076ef7c08e3261d8cfe3741 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 22 Jan 2023 22:19:23 -0700 Subject: [PATCH 0228/1010] Build foundry container locally Former-commit-id: f3f40339379a91aaba5f9b3b46618a61a8414af2 --- app/data/container-build/cerc-go-ethereum-foundry/Dockerfile | 4 +++- app/data/container-build/foundry-rs-foundry/build.sh | 4 ++++ app/data/container-image-list.txt | 1 + app/data/repository-list.txt | 1 + 4 files changed, 9 insertions(+), 1 deletion(-) create mode 100755 app/data/container-build/foundry-rs-foundry/build.sh diff --git a/app/data/container-build/cerc-go-ethereum-foundry/Dockerfile b/app/data/container-build/cerc-go-ethereum-foundry/Dockerfile index bbbc64fc..38a3ca29 100644 --- a/app/data/container-build/cerc-go-ethereum-foundry/Dockerfile +++ b/app/data/container-build/cerc-go-ethereum-foundry/Dockerfile @@ -1,4 +1,6 @@ -FROM ghcr.io/foundry-rs/foundry +# Use locally build foundry base image to work around there being +# no aarm64 image published. +FROM foundry-rs/foundry:local RUN apk update ; apk add --no-cache --allow-untrusted ca-certificates curl bash git jq RUN apk add --no-cache --upgrade grep diff --git a/app/data/container-build/foundry-rs-foundry/build.sh b/app/data/container-build/foundry-rs-foundry/build.sh new file mode 100755 index 00000000..08332892 --- /dev/null +++ b/app/data/container-build/foundry-rs-foundry/build.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +# Build foundry-rs/foundry +# HACK below : TARGETARCH needs to be derived from the host environment +docker build -t foundry-rs/foundry:local --build-arg TARGETARCH=arm64 ${CERC_REPO_BASE_DIR}/foundry diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index 48d5bc04..309b6058 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -1,3 +1,4 @@ +foundry-rs/foundry cerc/test-contract cerc/eth-statediff-fill-service cerc/eth-statediff-service diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index 43507d6e..35f47c07 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -16,3 +16,4 @@ vulcanize/uniswap-v3-info vulcanize/assemblyscript cerc-io/eth-probe cerc-io/tx-spammer +foundry-rs/foundry From 161cd37b9c0f56e2415429be59125191a6bc7896 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 23 Jan 2023 06:51:51 -0700 Subject: [PATCH 0229/1010] Fix stack file Former-commit-id: a12e06dcbb24ad138d7a8c35ccfc26ea8c615b40 --- app/data/stacks/fixturenet-eth/stack.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/stacks/fixturenet-eth/stack.yml b/app/data/stacks/fixturenet-eth/stack.yml index 0030fdd4..3c23e841 100644 --- a/app/data/stacks/fixturenet-eth/stack.yml +++ b/app/data/stacks/fixturenet-eth/stack.yml @@ -1,8 +1,8 @@ version: "1.0" name: fixturenet-eth +decription: "Ethereum Fixturenet" repos: - cerc-io/go-ethereum - - cerc-io/lighthouse containers: - cerc/go-ethereum - cerc/lighthouse From 86b7e6957c847c447109bdde28fceb9403904168 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 23 Jan 2023 07:24:27 -0700 Subject: [PATCH 0230/1010] Enhance readme Former-commit-id: 4ab84eb7ca23786db42f0eb471a4db6be8e1da22 --- .../cerc-builder-gerbil/README.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/app/data/container-build/cerc-builder-gerbil/README.md b/app/data/container-build/cerc-builder-gerbil/README.md index f5cbe601..854139b9 100644 --- a/app/data/container-build/cerc-builder-gerbil/README.md +++ b/app/data/container-build/cerc-builder-gerbil/README.md @@ -1,6 +1,21 @@ ## Gerbil Scheme Builder -This container is designed to be used as a simple "build runner" environment for building and running Scheme projects -using Gerbil and gerbil-ethereum. +This container is designed to be used as a simple "build runner" environment for building and running Scheme projects using Gerbil and gerbil-ethereum. Its primary purpose is to allow build/test/run of gerbil code without the need to install and configure all the necessary prerequisites and dependencies on the host system. +### Usage + +First build the container with: + +``` +$ laconic-so build-containers --include cerc/builder-gerbil +``` + +Now, assuming a gerbil project located at `~/projects/my-project`, run bash in the container mounting the project with: + +``` +$ docker run -it -v $HOME/projects/my-project:/src cerc/builder-gerbil:latest bash +root@7c4124bb09e3:/src# +``` + +Now gerbil commands can be run. From b6a84db6a2c75a590a55103a5ccf9f86bc2ac9f3 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 23 Jan 2023 08:00:24 -0700 Subject: [PATCH 0231/1010] Add guile to gertbil builder container Former-commit-id: c7970d09b309acce183b5ed81b089e92cd3729bf --- app/data/container-build/cerc-builder-gerbil/Dockerfile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/data/container-build/cerc-builder-gerbil/Dockerfile b/app/data/container-build/cerc-builder-gerbil/Dockerfile index 3daf6003..f849d8ea 100644 --- a/app/data/container-build/cerc-builder-gerbil/Dockerfile +++ b/app/data/container-build/cerc-builder-gerbil/Dockerfile @@ -2,10 +2,15 @@ FROM gerbil/ubuntu # Install the Solidity compiler (latest stable version) +# and guile +# and libsecp256k1-dev RUN apt-get update && export DEBIAN_FRONTEND=noninteractive && export DEBCONF_NOWARNINGS="yes" && \ apt-get install -y software-properties-common && \ add-apt-repository ppa:ethereum/ethereum && \ - apt-get update && apt-get install -y solc && \ + apt-get update && \ + apt-get install -y solc && \ + apt-get install -y guile-3.0 && \ + apt-get install -y libsecp256k1-dev && \ apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* RUN mkdir /scripts From c77cc4e111d96053393447e95013f4aba416afad Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Mon, 23 Jan 2023 10:39:15 -0600 Subject: [PATCH 0232/1010] Update keycloak to include X-User-Id header. (#147) Former-commit-id: 65cdba77055b1c3ba1d780b40a5c64dc41e7b4e2 --- .../config/keycloak/nginx/keycloak_proxy.conf | 25 +++++++++++-------- .../container-build/cerc-keycloak/Dockerfile | 2 +- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/app/data/config/keycloak/nginx/keycloak_proxy.conf b/app/data/config/keycloak/nginx/keycloak_proxy.conf index fb77ef81..f06c6700 100644 --- a/app/data/config/keycloak/nginx/keycloak_proxy.conf +++ b/app/data/config/keycloak/nginx/keycloak_proxy.conf @@ -20,17 +20,20 @@ server { proxy_pass http://fixturenet-eth-geth-1:8545; } -### ipld-eth-server -# location ~ ^/ipld/eth/([^/]*)$ { -# set $apiKey $1; -# if ($apiKey = '') { -# set $apiKey $http_X_API_KEY; -# } -# auth_request /auth; -# proxy_buffering off; -# rewrite /.*$ / break; -# proxy_pass http://ipld-eth-server:8081; -# } +## ipld-eth-server + location ~ ^/ipld/eth/([^/]*)$ { + set $apiKey $1; + if ($apiKey = '') { + set $apiKey $http_X_API_KEY; + } + auth_request /auth; + auth_request_set $user_id $sent_http_x_user_id; + proxy_buffering off; + rewrite /.*$ / break; + proxy_pass http://ipld-eth-server:8081; + proxy_set_header X-Original-Remote-Addr $remote_addr; + proxy_set_header X-User-Id $user_id; + } # # location ~ ^/ipld/gql/([^/]*)$ { # set $apiKey $1; diff --git a/app/data/container-build/cerc-keycloak/Dockerfile b/app/data/container-build/cerc-keycloak/Dockerfile index 0e70a0b0..000f38cd 100644 --- a/app/data/container-build/cerc-keycloak/Dockerfile +++ b/app/data/container-build/cerc-keycloak/Dockerfile @@ -1,4 +1,4 @@ FROM quay.io/keycloak/keycloak:20.0 WORKDIR /opt/keycloak/providers RUN curl -L https://github.com/aerogear/keycloak-metrics-spi/releases/download/2.5.3/keycloak-metrics-spi-2.5.3.jar --output keycloak-metrics-spi.jar -RUN curl -L https://github.com/cerc-io/keycloak-api-key-demo/releases/download/v0.1/api-key-module-0.1.jar --output api-key-module.jar +RUN curl -L https://github.com/cerc-io/keycloak-api-key-demo/releases/download/v0.2/api-key-module-0.2.jar --output api-key-module.jar From c6c9e229d2615aa650b768b6b9447fc11effb4d2 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 23 Jan 2023 17:07:23 -0700 Subject: [PATCH 0233/1010] Revert debugging code Former-commit-id: 14e57abfbfa2d137f910d46080569773ebfa8456 --- app/data/container-build/foundry-rs-foundry/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/container-build/foundry-rs-foundry/build.sh b/app/data/container-build/foundry-rs-foundry/build.sh index 08332892..7bfbf873 100755 --- a/app/data/container-build/foundry-rs-foundry/build.sh +++ b/app/data/container-build/foundry-rs-foundry/build.sh @@ -1,4 +1,4 @@ #!/usr/bin/env bash # Build foundry-rs/foundry # HACK below : TARGETARCH needs to be derived from the host environment -docker build -t foundry-rs/foundry:local --build-arg TARGETARCH=arm64 ${CERC_REPO_BASE_DIR}/foundry +docker build -t foundry-rs/foundry:local ${CERC_REPO_BASE_DIR}/foundry From 629e484c30b5658e25f5b28e5d0136e7548b151b Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 23 Jan 2023 22:09:56 -0700 Subject: [PATCH 0234/1010] Implement deploy-system port command Former-commit-id: ea6f932e001a7320f9c9dbf69b0a8bc91445ea48 --- app/data/compose/docker-compose-test.yml | 2 ++ .../cerc-test-container/Dockerfile | 9 ++++++++- .../cerc-test-container/run.sh | 4 ++-- app/data/stacks/test/README.md | 3 +++ app/data/stacks/test/stack.yml | 7 +++++++ app/deploy_system.py | 20 ++++++++++++++----- 6 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 app/data/stacks/test/README.md create mode 100644 app/data/stacks/test/stack.yml diff --git a/app/data/compose/docker-compose-test.yml b/app/data/compose/docker-compose-test.yml index 058b2b3b..929f6feb 100644 --- a/app/data/compose/docker-compose-test.yml +++ b/app/data/compose/docker-compose-test.yml @@ -3,3 +3,5 @@ services: test: image: cerc/test-container:local restart: always + ports: + - "80" diff --git a/app/data/container-build/cerc-test-container/Dockerfile b/app/data/container-build/cerc-test-container/Dockerfile index 29b42a84..f4ef5506 100644 --- a/app/data/container-build/cerc-test-container/Dockerfile +++ b/app/data/container-build/cerc-test-container/Dockerfile @@ -1,4 +1,11 @@ -FROM alpine:latest +FROM ubuntu:latest + +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive && export DEBCONF_NOWARNINGS="yes" && \ + apt-get install -y software-properties-common && \ + apt-get install -y nginx && \ + apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +EXPOSE 80 COPY run.sh /app/run.sh diff --git a/app/data/container-build/cerc-test-container/run.sh b/app/data/container-build/cerc-test-container/run.sh index 5f59acab..2488b628 100755 --- a/app/data/container-build/cerc-test-container/run.sh +++ b/app/data/container-build/cerc-test-container/run.sh @@ -12,5 +12,5 @@ else echo `date` > $EXISTSFILENAME fi -# Sleep forever to keep docker happy -while true; do sleep 10; done \ No newline at end of file +# Run nginx which will block here forever +/usr/sbin/nginx -g "daemon off;" \ No newline at end of file diff --git a/app/data/stacks/test/README.md b/app/data/stacks/test/README.md new file mode 100644 index 00000000..aef333fc --- /dev/null +++ b/app/data/stacks/test/README.md @@ -0,0 +1,3 @@ +# Test Stack + +A stack for test/demo purposes. \ No newline at end of file diff --git a/app/data/stacks/test/stack.yml b/app/data/stacks/test/stack.yml new file mode 100644 index 00000000..2903fbd1 --- /dev/null +++ b/app/data/stacks/test/stack.yml @@ -0,0 +1,7 @@ +version: "1.0" +name: test +description: "A test stack" +containers: + - cerc/test-container +pods: + - test diff --git a/app/deploy_system.py b/app/deploy_system.py index 6771e5ee..da2ed069 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -30,9 +30,9 @@ from .util import include_exclude_check, get_parsed_stack_config @click.option("--exclude", help="don\'t start these components") @click.option("--cluster", help="specify a non-default cluster name") @click.argument('command', required=True) # help: command: up|down|ps -@click.argument('services', nargs=-1) # help: command: up|down|ps +@click.argument('extra_args', nargs=-1) # help: command: up|down|ps @click.pass_context -def command(ctx, include, exclude, cluster, command, services): +def command(ctx, include, exclude, cluster, command, extra_args): '''deploy a stack''' # TODO: implement option exclusion and command value constraint lost with the move from argparse to click @@ -87,17 +87,27 @@ def command(ctx, include, exclude, cluster, command, services): # See: https://gabrieldemarmiesse.github.io/python-on-whales/sub-commands/compose/ docker = DockerClient(compose_files=compose_files, compose_project_name=cluster) - services_list = list(services) or None + extra_args_list = list(extra_args) or None if not dry_run: if command == "up": if verbose: - print(f"Running compose up for services: {services_list}") - docker.compose.up(detach=True, services=services_list) + print(f"Running compose up for extra_args: {extra_args_list}") + docker.compose.up(detach=True, services=extra_args_list) elif command == "down": if verbose: print("Running compose down") docker.compose.down() + elif command == "port": + if extra_args_list is None or len(extra_args_list) < 2: + print("Usage: port ") + sys.exit(1) + service_name = extra_args_list[0] + exposed_port = extra_args_list[1] + if verbose: + print("Running compose port") + mapped_port_data = docker.compose.port(service_name, exposed_port) + print(f"{mapped_port_data[0]}:{mapped_port_data[1]}") elif command == "ps": if verbose: print("Running compose ps") From 2e291b3e4c6efb2a0479d92eed831e8be1070e74 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 23 Jan 2023 22:11:24 -0700 Subject: [PATCH 0235/1010] Add trailing newline Former-commit-id: 5f22afc78baa00bacdfb8f7bc5240e71ba1492c7 --- app/data/container-build/cerc-test-container/run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/container-build/cerc-test-container/run.sh b/app/data/container-build/cerc-test-container/run.sh index 2488b628..b4757d9a 100755 --- a/app/data/container-build/cerc-test-container/run.sh +++ b/app/data/container-build/cerc-test-container/run.sh @@ -13,4 +13,4 @@ else fi # Run nginx which will block here forever -/usr/sbin/nginx -g "daemon off;" \ No newline at end of file +/usr/sbin/nginx -g "daemon off;" From 27195fc97793cb55c65d863a107de73fcb09a535 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 24 Jan 2023 08:19:24 -0700 Subject: [PATCH 0236/1010] Add stack tests Former-commit-id: c80ed2b2455602a86c3fb6a5e291622f6ad74ef9 --- app/data/stacks/test/stack.yml | 2 ++ app/data/version.txt | 2 +- tests/smoke-test/run-smoke-test.sh | 14 ++++++++------ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/data/stacks/test/stack.yml b/app/data/stacks/test/stack.yml index 2903fbd1..44ac8604 100644 --- a/app/data/stacks/test/stack.yml +++ b/app/data/stacks/test/stack.yml @@ -1,6 +1,8 @@ version: "1.0" name: test description: "A test stack" +repos: + - cerc-io/laconicd containers: - cerc/test-container pods: diff --git a/app/data/version.txt b/app/data/version.txt index 031aa7e6..fcbc57cf 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.12-alpha-6ae86db +v1.0.12-alpha-3cef5eb diff --git a/tests/smoke-test/run-smoke-test.sh b/tests/smoke-test/run-smoke-test.sh index 4ee2fddc..b4006f01 100755 --- a/tests/smoke-test/run-smoke-test.sh +++ b/tests/smoke-test/run-smoke-test.sh @@ -13,13 +13,15 @@ rm -rf $CERC_REPO_BASE_DIR mkdir -p $CERC_REPO_BASE_DIR # Pull an example small public repo to test we can pull a repo $TEST_TARGET_SO setup-repositories --include cerc-io/laconic-sdk -# TODO: test building the repo into a container -# Build two example containers -# TODO: -$TEST_TARGET_SO build-containers --include cerc/builder-js,cerc/test-container +# Test pulling a stack +$TEST_TARGET_SO --stack test setup-repositories +# Test building the a stack container +$TEST_TARGET_SO --stack test build-containers +# Build one example containers +$TEST_TARGET_SO build-containers --include cerc/builder-js # Deploy the test container -$TEST_TARGET_SO deploy-system --include test up +$TEST_TARGET_SO --stack test deploy-system up # TODO: test that we can use the deployed container somehow # Clean up -$TEST_TARGET_SO deploy-system --include test down +$TEST_TARGET_SO --stack test deploy-system down echo "Test passed" From d0d29717e1a8f3ace02d6e971a5f81fbf9eff836 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 24 Jan 2023 08:27:12 -0700 Subject: [PATCH 0237/1010] Update version Former-commit-id: 080451f3dfb03b7ec53e19cfd4ef2108e0bf8cfa --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index fcbc57cf..fb0ef28f 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.12-alpha-3cef5eb +v1.0.13-alpha-8b19e0f From b5c7ad114c796bc9d35f10876c446e30abd55c94 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Wed, 25 Jan 2023 11:50:08 -0600 Subject: [PATCH 0238/1010] Integrate grafana/prometheus with fixturenet-eth. (#156) * Integrate grafana/prometheus with fixturenet-eth. * Integrate grafana/prometheus with fixturenet-eth. * Revert port change * EOL * EOL * Simplify ipld-eth-server config. Former-commit-id: c279bd49a4410c9d94e21c5bae2125444bc4e223 --- .../docker-compose-fixturenet-eth-metrics.yml | 21 + .../docker-compose-ipld-eth-server.yml | 18 +- app/data/compose/docker-compose-keycloak.yml | 8 + .../docker-compose-prometheus-grafana.yml | 21 - .../etc/dashboards/fixturenet_dashboard.json | 1089 +++++++++++++++++ .../provisioning/dashboards/dashboards.yml | 9 + .../provisioning/datasources/prometheus.yml | 19 + .../prometheus/etc/prometheus.yml | 34 + .../config/keycloak/nginx/keycloak_proxy.conf | 48 +- .../scripts/status.sh | 6 +- app/data/pod-list.txt | 2 +- 11 files changed, 1222 insertions(+), 53 deletions(-) create mode 100644 app/data/compose/docker-compose-fixturenet-eth-metrics.yml delete mode 100644 app/data/compose/docker-compose-prometheus-grafana.yml create mode 100644 app/data/config/fixturenet-eth-metrics/grafana/etc/dashboards/fixturenet_dashboard.json create mode 100644 app/data/config/fixturenet-eth-metrics/grafana/etc/provisioning/dashboards/dashboards.yml create mode 100644 app/data/config/fixturenet-eth-metrics/grafana/etc/provisioning/datasources/prometheus.yml create mode 100644 app/data/config/fixturenet-eth-metrics/prometheus/etc/prometheus.yml diff --git a/app/data/compose/docker-compose-fixturenet-eth-metrics.yml b/app/data/compose/docker-compose-fixturenet-eth-metrics.yml new file mode 100644 index 00000000..4d3ccdf5 --- /dev/null +++ b/app/data/compose/docker-compose-fixturenet-eth-metrics.yml @@ -0,0 +1,21 @@ +version: "3.2" +services: + prometheus: + restart: always + image: prom/prometheus + depends_on: + fixturenet-eth-geth-1: + condition: service_healthy + volumes: + - ../config/fixturenet-eth-metrics/prometheus/etc:/etc/prometheus + ports: + - "9090" + grafana: + restart: always + image: grafana/grafana + volumes: + - ../config/fixturenet-eth-metrics/grafana/etc/provisioning/dashboards:/etc/grafana/provisioning/dashboards + - ../config/fixturenet-eth-metrics/grafana/etc/provisioning/datasources:/etc/grafana/provisioning/datasources + - ../config/fixturenet-eth-metrics/grafana/etc/dashboards:/etc/grafana/dashboards + ports: + - "3000" diff --git a/app/data/compose/docker-compose-ipld-eth-server.yml b/app/data/compose/docker-compose-ipld-eth-server.yml index ee9c8885..e02f73ca 100644 --- a/app/data/compose/docker-compose-ipld-eth-server.yml +++ b/app/data/compose/docker-compose-ipld-eth-server.yml @@ -20,16 +20,24 @@ services: DATABASE_USER: "vdbm" DATABASE_PASSWORD: "password" ETH_CHAIN_ID: 99 - ETH_FORWARD_ETH_CALLS: $eth_forward_eth_calls - ETH_PROXY_ON_ERROR: $eth_proxy_on_error - ETH_HTTP_PATH: $eth_http_path + ETH_FORWARD_ETH_CALLS: "false" + ETH_FORWARD_GET_STORAGE_AT: "false" + ETH_PROXY_ON_ERROR: "false" + METRICS: "true" + PROM_HTTP: "true" + PROM_HTTP_ADDR: "0.0.0.0" + PROM_HTTP_PORT: "8090" + LOGRUS_LEVEL: "debug" + CERC_REMOTE_DEBUG: "true" volumes: - type: bind source: ../config/ipld-eth-server/chain.json target: /tmp/chain.json ports: - - "127.0.0.1:8081:8081" - - "127.0.0.1:8082:8082" + - "8081" + - "8082" + - "8090" + - "40000" healthcheck: test: ["CMD", "nc", "-v", "localhost", "8081"] interval: 20s diff --git a/app/data/compose/docker-compose-keycloak.yml b/app/data/compose/docker-compose-keycloak.yml index 294387cd..1586cdb7 100644 --- a/app/data/compose/docker-compose-keycloak.yml +++ b/app/data/compose/docker-compose-keycloak.yml @@ -29,9 +29,17 @@ services: condition: service_healthy keycloak-nginx: image: nginx:1.23-alpine + restart: always volumes: - ../config/keycloak/nginx:/etc/nginx/conf.d ports: - 80 depends_on: - keycloak + keycloak-nginx-prometheus-exporter: + image: nginx/nginx-prometheus-exporter + restart: always + environment: + - SCRAPE_URI=http://keycloak-nginx:80/stub_status + depends_on: + - keycloak-nginx diff --git a/app/data/compose/docker-compose-prometheus-grafana.yml b/app/data/compose/docker-compose-prometheus-grafana.yml deleted file mode 100644 index 494748bc..00000000 --- a/app/data/compose/docker-compose-prometheus-grafana.yml +++ /dev/null @@ -1,21 +0,0 @@ -version: "3.2" -services: - # If you want prometheus to work, you must update the following file in the ops repo locally. - # localhost:6060 --> go-ethereum:6060 - prometheus: - restart: always - user: "987" - image: prom/prometheus - volumes: - - ${cerc_ops}/metrics/etc:/etc/prometheus - - ./prometheus-data:/prometheus - ports: - - "127.0.0.1:9090:9090" - grafana: - restart: always - user: "472" - image: grafana/grafana - volumes: - - ./grafana-data:/var/lib/grafana - ports: - - "127.0.0.1:3000:3000" diff --git a/app/data/config/fixturenet-eth-metrics/grafana/etc/dashboards/fixturenet_dashboard.json b/app/data/config/fixturenet-eth-metrics/grafana/etc/dashboards/fixturenet_dashboard.json new file mode 100644 index 00000000..222c22b1 --- /dev/null +++ b/app/data/config/fixturenet-eth-metrics/grafana/etc/dashboards/fixturenet_dashboard.json @@ -0,0 +1,1089 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 1, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 16, + "panels": [], + "title": "Row title", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 1 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(nginx_http_requests_total{instance=\"keycloak-nginx-prometheus-exporter:9113\"}[$__rate_interval])", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "nginx Requests/sec", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 1 + }, + "id": 8, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "builder", + "expr": "rate(ipld_eth_server_http_count{instance=\"ipld-eth-server:8090\"}[$__rate_interval])", + "legendFormat": "{{method}}", + "range": true, + "refId": "A" + } + ], + "title": "ipld-eth-server Requests/sec", + "transformations": [ + { + "id": "seriesToColumns", + "options": { + "byField": "Time" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "{instance=\"ipld-eth-server:8090\", job=\"ipld-eth-server\"}": true + }, + "indexByName": {}, + "renameByName": {} + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 9 + }, + "id": 20, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_call_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "legendFormat": "eth_call", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_getBlockByHash_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_getBlocksByHash", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_getBlockByNumber_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_getBlocksByNumber", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_getStorageAt_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "getStorageAt", + "range": true, + "refId": "D" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_statediff_writeStateDiffAt_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "statediff_writeStateDiffAt", + "range": true, + "refId": "E" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_chainId_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_chainId", + "range": true, + "refId": "F" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_statediff_writeStateDiffFor_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "statediff_writeStateDiffFor", + "range": true, + "refId": "G" + } + ], + "title": "geth API Requests/sec", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 9 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "exemplar": false, + "expr": "rate(keycloak_logins{instance=\"keycloak:8080\"}[90s]) * 60", + "format": "time_series", + "instant": false, + "interval": "2m", + "legendFormat": "{{client_id}}", + "range": true, + "refId": "A" + } + ], + "title": "Keycloak Logins/min", + "transformations": [ + { + "id": "seriesToColumns", + "options": { + "byField": "Time" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "00c13eee-e48c-4c7f-872b-f0e4c1e67d7f": true, + "0cf1b92d-a15c-40a8-b2ae-49a758e658ee": true, + "13761bf2-2c0e-42fd-acc8-09a677ab179e": true, + "79a56c4e-0bfb-4ef0-87d4-244c4ace9b4b": true, + "9c41e289-92f0-456f-bd65-8f73024a9e45": true, + "c9718dd1-06d6-4f98-a821-9adbeb4b663b": true + }, + "indexByName": {}, + "renameByName": { + "00c13eee-e48c-4c7f-872b-f0e4c1e67d7f": "", + "0cf1b92d-a15c-40a8-b2ae-49a758e658ee": "rickm", + "13761bf2-2c0e-42fd-acc8-09a677ab179e": "telackey", + "2753f8be-0036-49ba-a53a-4963573fc15c": "cerc-io", + "79a56c4e-0bfb-4ef0-87d4-244c4ace9b4b": "", + "9c41e289-92f0-456f-bd65-8f73024a9e45": "", + "c9718dd1-06d6-4f98-a821-9adbeb4b663b": "dboreham", + "f5083aa7-5b5d-4164-b189-d7a559c4aad0": "infura0" + } + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 17 + }, + "id": 12, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.3.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "chain_head_block{instance=\"${node}:6060\"}", + "hide": false, + "legendFormat": "geth", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "statediff_service_last_statediff_height{instance=\"${node}:6060\"}", + "legendFormat": "statediff", + "range": true, + "refId": "A" + } + ], + "title": "Block Positions", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "Distance" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 17 + }, + "id": 22, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "clamp_min(chain_head_block{instance=\"${node}:6060\"} - on() statediff_service_last_statediff_height{instance=\"${node}:6060\"}, 0)", + "interval": "1m", + "legendFormat": "Distance", + "range": true, + "refId": "A" + } + ], + "title": "Block Distance (geth to statediff)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 17 + }, + "id": 10, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "exemplar": false, + "expr": "increase(statediff_service_succeeded{instance=\"${node}:6060\"}[1m])", + "format": "time_series", + "instant": false, + "interval": "1m", + "legendFormat": "Succeeded", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "increase(statediff_service_failed{instance=\"${node}:6060\"}[1m])", + "hide": false, + "interval": "1m", + "legendFormat": "Failed", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "statediff_service_underway{instance=\"${node}:6060\"}", + "hide": false, + "interval": "1s", + "legendFormat": "Underway", + "range": true, + "refId": "C" + } + ], + "title": "Statediff Operations", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 50 + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ms" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 24 + }, + "id": 14, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "exemplar": false, + "expr": "rate(statediff_service_total_processing_time{instance=\"${node}:6060\"}[$__rate_interval])", + "instant": false, + "interval": "1m", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Statediff Duty Cycle", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 24 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(statediff_service_api_requests{instance=\"${node}:6060\"}[$__rate_interval])", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Statediff API Requests/sec", + "type": "timeseries" + } + ], + "refresh": "5s", + "schemaVersion": 37, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": true, + "text": "fixturenet-eth-geth-1", + "value": "fixturenet-eth-geth-1" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "node", + "options": [ + { + "selected": true, + "text": "fixturenet-eth-geth-1", + "value": "fixturenet-eth-geth-1" + }, + { + "selected": false, + "text": "fixturenet-eth-geth-2", + "value": "fixturenet-eth-geth-2" + } + ], + "query": "fixturenet-eth-geth-1,fixturenet-eth-geth-2", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "cerc-io overview", + "uid": "nT9VeZoVk", + "version": 2, + "weekStart": "" +} \ No newline at end of file diff --git a/app/data/config/fixturenet-eth-metrics/grafana/etc/provisioning/dashboards/dashboards.yml b/app/data/config/fixturenet-eth-metrics/grafana/etc/provisioning/dashboards/dashboards.yml new file mode 100644 index 00000000..4705688e --- /dev/null +++ b/app/data/config/fixturenet-eth-metrics/grafana/etc/provisioning/dashboards/dashboards.yml @@ -0,0 +1,9 @@ +apiVersion: 1 + +providers: + - name: dashboards + type: file + updateIntervalSeconds: 10 + options: + path: /etc/grafana/dashboards + foldersFromFilesStructure: true diff --git a/app/data/config/fixturenet-eth-metrics/grafana/etc/provisioning/datasources/prometheus.yml b/app/data/config/fixturenet-eth-metrics/grafana/etc/provisioning/datasources/prometheus.yml new file mode 100644 index 00000000..f5181ebd --- /dev/null +++ b/app/data/config/fixturenet-eth-metrics/grafana/etc/provisioning/datasources/prometheus.yml @@ -0,0 +1,19 @@ +apiVersion: 1 + +datasources: + - id: 1 + uid: jZUuGao4k + orgId: 1 + name: Prometheus + type: prometheus + typeName: Prometheus + typeLogoUrl: public/app/plugins/datasource/prometheus/img/prometheus_logo.svg + access: proxy + url: http://prometheus:9090 + user: "" + database: "" + basicAuth: false + isDefault: true + jsonData: + httpMethod: POST + readOnly: false diff --git a/app/data/config/fixturenet-eth-metrics/prometheus/etc/prometheus.yml b/app/data/config/fixturenet-eth-metrics/prometheus/etc/prometheus.yml new file mode 100644 index 00000000..5718d4ef --- /dev/null +++ b/app/data/config/fixturenet-eth-metrics/prometheus/etc/prometheus.yml @@ -0,0 +1,34 @@ +global: + scrape_interval: 5s + evaluation_interval: 15s + +scrape_configs: + # ipld-eth-server + - job_name: 'ipld-eth-server' + metrics_path: /metrics + scrape_interval: 5s + static_configs: + - targets: ['ipld-eth-server:8090'] + + # geth + - job_name: 'geth' + metrics_path: /debug/metrics/prometheus + scheme: http + static_configs: + - targets: ['fixturenet-eth-geth-1:6060'] + + # nginx + - job_name: 'nginx' + scrape_interval: 5s + metrics_path: /metrics + scheme: http + static_configs: + - targets: ['keycloak-nginx-prometheus-exporter:9113'] + + # keycloak + - job_name: 'keycloak' + scrape_interval: 5s + metrics_path: /auth/realms/cerc/metrics + scheme: http + static_configs: + - targets: ['keycloak:8080'] diff --git a/app/data/config/keycloak/nginx/keycloak_proxy.conf b/app/data/config/keycloak/nginx/keycloak_proxy.conf index f06c6700..dd69680b 100644 --- a/app/data/config/keycloak/nginx/keycloak_proxy.conf +++ b/app/data/config/keycloak/nginx/keycloak_proxy.conf @@ -21,19 +21,19 @@ server { } ## ipld-eth-server - location ~ ^/ipld/eth/([^/]*)$ { - set $apiKey $1; - if ($apiKey = '') { - set $apiKey $http_X_API_KEY; - } - auth_request /auth; - auth_request_set $user_id $sent_http_x_user_id; - proxy_buffering off; - rewrite /.*$ / break; - proxy_pass http://ipld-eth-server:8081; - proxy_set_header X-Original-Remote-Addr $remote_addr; - proxy_set_header X-User-Id $user_id; - } +# location ~ ^/ipld/eth/([^/]*)$ { +# set $apiKey $1; +# if ($apiKey = '') { +# set $apiKey $http_X_API_KEY; +# } +# auth_request /auth; +# auth_request_set $user_id $sent_http_x_user_id; +# proxy_buffering off; +# rewrite /.*$ / break; +# proxy_pass http://ipld-eth-server:8081; +# proxy_set_header X-Original-Remote-Addr $remote_addr; +# proxy_set_header X-User-Id $user_id; +# } # # location ~ ^/ipld/gql/([^/]*)$ { # set $apiKey $1; @@ -45,14 +45,14 @@ server { # rewrite /.*$ / break; # proxy_pass http://ipld-eth-server:8082; # } -# -### lighthouse -# location /beacon/ { -# set $apiKey $http_X_API_KEY; -# auth_request /auth; -# proxy_buffering off; -# proxy_pass http://fixturenet-eth-lighthouse-1:8001/; -# } + +## lighthouse + location /beacon/ { + set $apiKey $http_X_API_KEY; + auth_request /auth; + proxy_buffering off; + proxy_pass http://fixturenet-eth-lighthouse-1:8001/; + } location = /auth { internal; @@ -66,7 +66,7 @@ server { proxy_set_header X-Original-Host $host; } -# location = /basic_status { -# stub_status; -# } + location = /stub_status { + stub_status; + } } diff --git a/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh index e02fc14b..a6999e3f 100755 --- a/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh +++ b/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh @@ -8,12 +8,14 @@ LIGHTHOUSE_BASE_URL=${LIGHTHOUSE_BASE_URL} GETH_BASE_URL=${GETH_BASE_URL} if [ -z "$LIGHTHOUSE_BASE_URL" ]; then - LIGHTHOUSE_PORT=`docker ps -f "name=fixturenet-eth-lighthouse-1-1" --format "{{.Ports}}" | head -1 | cut -d':' -f2 | cut -d'-' -f1` + LIGHTHOUSE_CONTAINER=`docker ps -q -f "name=fixturenet-eth-lighthouse-1-1"` + LIGHTHOUSE_PORT=`docker port $LIGHTHOUSE_CONTAINER 8001 | cut -d':' -f2` LIGHTHOUSE_BASE_URL="http://localhost:${LIGHTHOUSE_PORT}" fi if [ -z "$GETH_BASE_URL" ]; then - GETH_PORT=`docker ps -f "name=fixturenet-eth-geth-1-1" --format "{{.Ports}}" | head -1 | cut -d':' -f2 | cut -d'-' -f1` + GETH_CONTAINER=`docker ps -q -f "name=fixturenet-eth-geth-1-1"` + GETH_PORT=`docker port $GETH_CONTAINER 8545 | cut -d':' -f2` GETH_BASE_URL="http://localhost:${GETH_PORT}" fi diff --git a/app/data/pod-list.txt b/app/data/pod-list.txt index 661a04e4..64dd0412 100644 --- a/app/data/pod-list.txt +++ b/app/data/pod-list.txt @@ -6,10 +6,10 @@ ipld-eth-beacon-db ipld-eth-beacon-indexer ipld-eth-server lighthouse -prometheus-grafana laconicd fixturenet-laconicd fixturenet-eth +fixturenet-eth-metrics watcher-mobymask watcher-erc20 watcher-erc721 From dd0b8ae81fb3cb9173e830d1b83d372d7bf9701f Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 25 Jan 2023 14:28:41 -0700 Subject: [PATCH 0239/1010] Basic GitHub release publishing script Former-commit-id: 465d16e50f25eb95c0cafb10d88dce93baaefeea --- scripts/publish_shiv_package_github.sh | 30 ++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100755 scripts/publish_shiv_package_github.sh diff --git a/scripts/publish_shiv_package_github.sh b/scripts/publish_shiv_package_github.sh new file mode 100755 index 00000000..945a2efa --- /dev/null +++ b/scripts/publish_shiv_package_github.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +# Usage: publish_shiv_package_github.sh +# Uses this script package to publish a new release: +# https://github.com/cerc-io/github-release-api +# User must define: CERC_GH_RELEASE_SCRIPTS_DIR +# pointing to the location of that cloned repository +# e.g. +# cd ~/projects +# git clone https://github.com/cerc-io/github-release-api +# cd ./stack-orchestrator +# export CERC_GH_RELEASE_SCRIPTS_DIR=~/projects/github-release-api +# ./scripts/publish_shiv_package_github.sh +# In addition, a valid GitHub token must be defined in +# CERC_PACKAGE_RELEASE_GITHUB_TOKEN +# TODO: check args and env vars +major=$1 +minor=$2 +patch=$3 +export PATH=$CERC_GH_RELEASE_SCRIPTS_DIR:$PATH +git_tag_manager.sh -M ${major} -m ${minor} -p ${patch} -t "Release ${major}.${minor}.${patch}" +github_release_manager.sh \ + -l david@bozemanpass.com -t ${CERC_PACKAGE_RELEASE_GITHUB_TOKEN} \ + -o cerc-io -r stack-orchestrator \ + -d v${major}.${minor}.${patch} \ + -c create +github_release_manager.sh \ + -l david@bozemanpass.com -t ${CERC_PACKAGE_RELEASE_GITHUB_TOKEN} \ + -o cerc-io -r stack-orchestrator \ + -d v${major}.${minor}.${patch} \ + -c upload ./package/laconic-so From a2b700727c134e609681bcbc83cbfc9c3c50dfa6 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 25 Jan 2023 22:37:43 -0700 Subject: [PATCH 0240/1010] Better publish scripts Former-commit-id: 7fdf9bc4db129061821737db966ac5b27da9feb2 --- scripts/publish_shiv_package_github.sh | 22 ++++++++++++++++------ scripts/tag_new_release.sh | 17 +++++++++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) create mode 100755 scripts/tag_new_release.sh diff --git a/scripts/publish_shiv_package_github.sh b/scripts/publish_shiv_package_github.sh index 945a2efa..226b4f06 100755 --- a/scripts/publish_shiv_package_github.sh +++ b/scripts/publish_shiv_package_github.sh @@ -12,19 +12,29 @@ # ./scripts/publish_shiv_package_github.sh # In addition, a valid GitHub token must be defined in # CERC_PACKAGE_RELEASE_GITHUB_TOKEN +if [[ -z "${CERC_PACKAGE_RELEASE_GITHUB_TOKEN}" ]]; then + echo "CERC_PACKAGE_RELEASE_GITHUB_TOKEN is not set" >&2 + exit 1 +fi # TODO: check args and env vars major=$1 minor=$2 patch=$3 export PATH=$CERC_GH_RELEASE_SCRIPTS_DIR:$PATH -git_tag_manager.sh -M ${major} -m ${minor} -p ${patch} -t "Release ${major}.${minor}.${patch}" +github_org="cerc-io" +github_repository="stack-orchestrator" +latest_package=$(ls -1t ./package/* | head -1) +uploaded_package="./package/laconic-so" +# Remove any old package +rm ${uploaded_package} +cp ${latest_package} ${uploaded_package} github_release_manager.sh \ - -l david@bozemanpass.com -t ${CERC_PACKAGE_RELEASE_GITHUB_TOKEN} \ - -o cerc-io -r stack-orchestrator \ + -l notused -t ${CERC_PACKAGE_RELEASE_GITHUB_TOKEN} \ + -o ${github_org} -r ${github_repository} \ -d v${major}.${minor}.${patch} \ -c create github_release_manager.sh \ - -l david@bozemanpass.com -t ${CERC_PACKAGE_RELEASE_GITHUB_TOKEN} \ - -o cerc-io -r stack-orchestrator \ + -l notused -t ${CERC_PACKAGE_RELEASE_GITHUB_TOKEN} \ + -o ${github_org} -r ${github_repository} \ -d v${major}.${minor}.${patch} \ - -c upload ./package/laconic-so + -c upload ${uploaded_package} diff --git a/scripts/tag_new_release.sh b/scripts/tag_new_release.sh new file mode 100755 index 00000000..193b5d8a --- /dev/null +++ b/scripts/tag_new_release.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# Usage: tag_new_release.sh +# Uses this script package to tag a new release: +# User must define: CERC_GH_RELEASE_SCRIPTS_DIR +# pointing to the location of that cloned repository +# e.g. +# cd ~/projects +# git clone https://github.com/cerc-io/github-release-api +# cd ./stack-orchestrator +# export CERC_GH_RELEASE_SCRIPTS_DIR=~/projects/github-release-api +# ./scripts/publish_shiv_package_github.sh +# TODO: check args and env vars +major=$1 +minor=$2 +patch=$3 +export PATH=$CERC_GH_RELEASE_SCRIPTS_DIR:$PATH +git_tag_manager.sh -M ${major} -m ${minor} -p ${patch} -t "Release ${major}.${minor}.${patch}" From 1f2ee33b427ddd608945ecd7999e8256e24a6f8c Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 25 Jan 2023 22:38:25 -0700 Subject: [PATCH 0241/1010] Update version Former-commit-id: 0b08d7ba659f088c42ff3c407691cf00f218ec0e --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index fb0ef28f..62d51f3c 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.13-alpha-8b19e0f +v1.0.14-a144dde From c01ff28b4f8aca56545c32ddfee0ac5092d2afcc Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 25 Jan 2023 22:46:37 -0700 Subject: [PATCH 0242/1010] Add release description Former-commit-id: a520cce17cb770ebae13a47e84c6c6c2a90264e8 --- scripts/publish_shiv_package_github.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/publish_shiv_package_github.sh b/scripts/publish_shiv_package_github.sh index 226b4f06..72ce8959 100755 --- a/scripts/publish_shiv_package_github.sh +++ b/scripts/publish_shiv_package_github.sh @@ -32,7 +32,7 @@ github_release_manager.sh \ -l notused -t ${CERC_PACKAGE_RELEASE_GITHUB_TOKEN} \ -o ${github_org} -r ${github_repository} \ -d v${major}.${minor}.${patch} \ - -c create + -c create -m "Release v${major}.${minor}.${patch}" github_release_manager.sh \ -l notused -t ${CERC_PACKAGE_RELEASE_GITHUB_TOKEN} \ -o ${github_org} -r ${github_repository} \ From 86e24078008e9a8e2212e7842464d14845ff8ec7 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 25 Jan 2023 22:47:08 -0700 Subject: [PATCH 0243/1010] Update version Former-commit-id: bf91048dbb0a29121194d98a0716023cfde3df16 --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index 62d51f3c..1ac00163 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.14-a144dde +v1.0.15-e142104 From af03208da76c736d709c5277a0c606f06c1d95ed Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 25 Jan 2023 23:22:05 -0700 Subject: [PATCH 0244/1010] Exec command inside container Former-commit-id: ade20fb2f50e1f8c034c946c2f379d7259bca970 --- app/deploy_system.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/app/deploy_system.py b/app/deploy_system.py index da2ed069..904c7f63 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -98,6 +98,15 @@ def command(ctx, include, exclude, cluster, command, extra_args): if verbose: print("Running compose down") docker.compose.down() + elif command == "exec": + if extra_args_list is None or len(extra_args_list) < 2: + print("Usage: exec ") + sys.exit(1) + service_name = extra_args_list[0] + command_to_exec = extra_args_list[1:] + if verbose: + print(f"Running compose exec {service_name} {command_to_exec}") + docker.compose.execute(service_name, command_to_exec) elif command == "port": if extra_args_list is None or len(extra_args_list) < 2: print("Usage: port ") @@ -105,7 +114,7 @@ def command(ctx, include, exclude, cluster, command, extra_args): service_name = extra_args_list[0] exposed_port = extra_args_list[1] if verbose: - print("Running compose port") + print(f"Running compose port {service_name} {exposed_port}") mapped_port_data = docker.compose.port(service_name, exposed_port) print(f"{mapped_port_data[0]}:{mapped_port_data[1]}") elif command == "ps": From bdde1b2c9ecece436b6d55e38227ac13fbe2dc80 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Thu, 26 Jan 2023 13:53:02 -0600 Subject: [PATCH 0245/1010] Include all eth API operation metrics. (#162) Former-commit-id: ce0c7ee9ba68fb44d3bcbc9fa3301e2784e354fc --- .../etc/dashboards/fixturenet_dashboard.json | 407 ++++++++++++++++-- .../config/fixturenet-eth/fixturenet-eth.env | 2 + 2 files changed, 368 insertions(+), 41 deletions(-) diff --git a/app/data/config/fixturenet-eth-metrics/grafana/etc/dashboards/fixturenet_dashboard.json b/app/data/config/fixturenet-eth-metrics/grafana/etc/dashboards/fixturenet_dashboard.json index 222c22b1..21932a24 100644 --- a/app/data/config/fixturenet-eth-metrics/grafana/etc/dashboards/fixturenet_dashboard.json +++ b/app/data/config/fixturenet-eth-metrics/grafana/etc/dashboards/fixturenet_dashboard.json @@ -326,8 +326,9 @@ "uid": "jZUuGao4k" }, "editorMode": "code", - "expr": "rate(rpc_duration_eth_call_success_count{instance=\"${node}:6060\"}[$__rate_interval])", - "legendFormat": "eth_call", + "expr": "rate(rpc_duration_eth_blockNumber_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_blockNumber", "range": true, "refId": "A" }, @@ -337,48 +338,12 @@ "uid": "jZUuGao4k" }, "editorMode": "code", - "expr": "rate(rpc_duration_eth_getBlockByHash_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "expr": "rate(rpc_duration_eth_call_success_count{instance=\"${node}:6060\"}[$__rate_interval])", "hide": false, - "legendFormat": "eth_getBlocksByHash", + "legendFormat": "eth_call", "range": true, "refId": "B" }, - { - "datasource": { - "type": "prometheus", - "uid": "jZUuGao4k" - }, - "editorMode": "code", - "expr": "rate(rpc_duration_eth_getBlockByNumber_success_count{instance=\"${node}:6060\"}[$__rate_interval])", - "hide": false, - "legendFormat": "eth_getBlocksByNumber", - "range": true, - "refId": "C" - }, - { - "datasource": { - "type": "prometheus", - "uid": "jZUuGao4k" - }, - "editorMode": "code", - "expr": "rate(rpc_duration_eth_getStorageAt_success_count{instance=\"${node}:6060\"}[$__rate_interval])", - "hide": false, - "legendFormat": "getStorageAt", - "range": true, - "refId": "D" - }, - { - "datasource": { - "type": "prometheus", - "uid": "jZUuGao4k" - }, - "editorMode": "code", - "expr": "rate(rpc_duration_statediff_writeStateDiffAt_success_count{instance=\"${node}:6060\"}[$__rate_interval])", - "hide": false, - "legendFormat": "statediff_writeStateDiffAt", - "range": true, - "refId": "E" - }, { "datasource": { "type": "prometheus", @@ -389,8 +354,356 @@ "hide": false, "legendFormat": "eth_chainId", "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_estimateGas_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_estimateGas", + "range": true, + "refId": "D" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_gasPrice_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_gasPrice", + "range": true, + "refId": "E" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_getBalance_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_getBalance", + "range": true, "refId": "F" }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_getBlockByHash_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_getBlockByHash", + "range": true, + "refId": "G" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_getBlockByNumber_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_getBlockByNumber", + "range": true, + "refId": "H" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_getBlockReceipts_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_getBlockReceipts", + "range": true, + "refId": "I" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_getBlockTransactionCountByHash_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_getBlockTransactionCountByHash", + "range": true, + "refId": "J" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_getBlockTransactionCountByNumber_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_getBlockTransactionCountByNumber", + "range": true, + "refId": "K" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_getCode_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_getCode", + "range": true, + "refId": "L" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_getFilterChanges_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_getFilterChanges", + "range": true, + "refId": "M" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_getFilterLogs_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_getFilterLogs", + "range": true, + "refId": "N" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_getLogs_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_getLogs", + "range": true, + "refId": "O" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_getStorageAt_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_getStorageAt", + "range": true, + "refId": "P" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_getTransactionByBlockHashAndIndex_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_getTransactionByBlockHashAndIndex", + "range": true, + "refId": "Q" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_getTransactionByBlockNumberAndIndex_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_getTransactionByBlockNumberAndIndex", + "range": true, + "refId": "R" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_getTransactionByHash_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_getTransactionByHash", + "range": true, + "refId": "S" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_getTransactionCount_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_getTransactionCount", + "range": true, + "refId": "T" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_getTransactionReceipt_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_getTransactionReceipt", + "range": true, + "refId": "U" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_getUncleCountByBlockHash_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_getUncleCountByBlockHash", + "range": true, + "refId": "V" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_getUncleCountByBlockNumber_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_getUncleCountByBlockNumber", + "range": true, + "refId": "W" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_mining_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_mining_success", + "range": true, + "refId": "X" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_newBlockFilter_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_newBlockFilter", + "range": true, + "refId": "Y" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_newFilter_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_newFilter", + "range": true, + "refId": "Z" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_newPendingTransactionFilter_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_newPendingTransactionFilter", + "range": true, + "refId": "AA" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_sendRawTransaction_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_sendRawTransaction", + "range": true, + "refId": "AB" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_signTransaction_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_signTransaction", + "range": true, + "refId": "AC" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_subscribe_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_subscribe", + "range": true, + "refId": "AD" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_syncing_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_syncing", + "range": true, + "refId": "AE" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_eth_unsubscribe_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "eth_unsubscribe", + "range": true, + "refId": "AF" + }, { "datasource": { "type": "prometheus", @@ -401,7 +714,19 @@ "hide": false, "legendFormat": "statediff_writeStateDiffFor", "range": true, - "refId": "G" + "refId": "AG" + }, + { + "datasource": { + "type": "prometheus", + "uid": "jZUuGao4k" + }, + "editorMode": "code", + "expr": "rate(rpc_duration_statediff_writeStateDiffAt_success_count{instance=\"${node}:6060\"}[$__rate_interval])", + "hide": false, + "legendFormat": "statediff_writeStateDiffAt", + "range": true, + "refId": "AH" } ], "title": "geth API Requests/sec", diff --git a/app/data/config/fixturenet-eth/fixturenet-eth.env b/app/data/config/fixturenet-eth/fixturenet-eth.env index 20a9fc05..1c214b56 100644 --- a/app/data/config/fixturenet-eth/fixturenet-eth.env +++ b/app/data/config/fixturenet-eth/fixturenet-eth.env @@ -19,3 +19,5 @@ CERC_STATEDIFF_DB_USER="vdbm" CERC_STATEDIFF_DB_PASSWORD="password" CERC_STATEDIFF_DB_GOOSE_MIN_VER=23 CERC_STATEDIFF_DB_LOG_STATEMENTS="false" + +CERC_GETH_VMODULE="statediff/*=5,rpc/*=5" From f02bbee3bf3abd5d57b3cbb52f4880caa00e873c Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 26 Jan 2023 16:47:06 -0700 Subject: [PATCH 0246/1010] Fixes to fixturenet-eth Former-commit-id: e4229e4cebb4532ed6f6ae1102ba16ab91ab8056 --- app/data/compose/docker-compose-fixturenet-eth.yml | 1 + .../container-build/cerc-fixturenet-eth-geth/run-el.sh | 8 +++++++- .../cerc-fixturenet-eth-lighthouse/Dockerfile | 4 ++++ .../scripts/status-internal.sh | 10 ++++++++++ .../cerc-fixturenet-eth-lighthouse/scripts/status.sh | 8 ++++++-- app/data/stacks/fixturenet-eth/README.md | 6 +++--- app/data/stacks/fixturenet-eth/stack.yml | 3 ++- app/deploy_system.py | 8 +++++++- 8 files changed, 40 insertions(+), 8 deletions(-) create mode 100755 app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status-internal.sh diff --git a/app/data/compose/docker-compose-fixturenet-eth.yml b/app/data/compose/docker-compose-fixturenet-eth.yml index 517b4832..978b983f 100644 --- a/app/data/compose/docker-compose-fixturenet-eth.yml +++ b/app/data/compose/docker-compose-fixturenet-eth.yml @@ -20,6 +20,7 @@ services: CERC_REMOTE_DEBUG: "true" CERC_RUN_STATEDIFF: "detect" CERC_STATEDIFF_DB_NODE_ID: 1 + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} env_file: - ../config/fixturenet-eth/fixturenet-eth.env image: cerc/fixturenet-eth-geth:local diff --git a/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh b/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh index 93e34988..3aa0eaf3 100755 --- a/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh +++ b/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh @@ -1,5 +1,9 @@ #!/bin/bash +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi + ETHERBASE=`cat /opt/testnet/build/el/accounts.csv | head -1 | cut -d',' -f2` NETWORK_ID=`cat /opt/testnet/el/el-config.yaml | grep 'chain_id' | awk '{ print $2 }'` NETRESTRICT=`ip addr | grep inet | grep -v '127.0' | awk '{print $2}'` @@ -28,7 +32,9 @@ else echo -n "$JWT" > /opt/testnet/build/el/jwtsecret if [ "$CERC_RUN_STATEDIFF" == "detect" ] && [ -n "$CERC_STATEDIFF_DB_HOST" ]; then - if [ -n "$(dig $CERC_STATEDIFF_DB_HOST +short)" ]; then + dig_result=$(dig $CERC_STATEDIFF_DB_HOST +short) + dig_status_code=$? + if [[ $dig_status_code = 0 && -n $dig_result ]]; then echo "Statediff DB at $CERC_STATEDIFF_DB_HOST" CERC_RUN_STATEDIFF="true" else diff --git a/app/data/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile b/app/data/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile index 6e8add4a..2295262d 100644 --- a/app/data/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile +++ b/app/data/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile @@ -27,4 +27,8 @@ RUN cd /opt/testnet && make genesis-cl # Work around some bugs in lcli where the default path is always used. RUN mkdir -p /root/.lighthouse && cd /root/.lighthouse && ln -s /opt/testnet/build/cl/testnet +RUN mkdir -p /scripts +COPY scripts/status-internal.sh /scripts +COPY scripts/status.sh /scripts + ENTRYPOINT ["/opt/testnet/run.sh"] diff --git a/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status-internal.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status-internal.sh new file mode 100755 index 00000000..52c61a39 --- /dev/null +++ b/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status-internal.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# Wrapper to facilitate using status.sh inside the container +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi +export LIGHTHOUSE_BASE_URL="http://fixturenet-eth-lighthouse-1:8001" +export GETH_BASE_URL="http://fixturenet-eth-geth-1-1:8545" +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +$SCRIPT_DIR/status.sh diff --git a/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh index a6999e3f..faca9a49 100755 --- a/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh +++ b/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh @@ -1,5 +1,7 @@ -#!/bin/bash - +#!/usr/bin/env bash +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi STATUSES=("geth to generate DAG" "beacon phase0" "beacon altair" "beacon bellatrix pre-merge" "beacon bellatrix merge") STATUS=0 @@ -7,6 +9,8 @@ STATUS=0 LIGHTHOUSE_BASE_URL=${LIGHTHOUSE_BASE_URL} GETH_BASE_URL=${GETH_BASE_URL} +# TODO: Docker commands below should be replaced by some interface into stack orchestrator +# or some execution environment-neutral mechanism. if [ -z "$LIGHTHOUSE_BASE_URL" ]; then LIGHTHOUSE_CONTAINER=`docker ps -q -f "name=fixturenet-eth-lighthouse-1-1"` LIGHTHOUSE_PORT=`docker port $LIGHTHOUSE_CONTAINER 8001 | cut -d':' -f2` diff --git a/app/data/stacks/fixturenet-eth/README.md b/app/data/stacks/fixturenet-eth/README.md index bf77c25c..a164f078 100644 --- a/app/data/stacks/fixturenet-eth/README.md +++ b/app/data/stacks/fixturenet-eth/README.md @@ -4,12 +4,12 @@ Instructions for deploying a local a geth + lighthouse blockchain "fixturenet" f ## Clone required repositories ``` -$ laconic-so setup-repositories --include cerc-io/go-ethereum +$ laconic-so --stack fixturenet-eth setup-repositories ``` ## Build the fixturenet-eth containers ``` -$ laconic-so build-containers --include cerc/go-ethereum,cerc/lighthouse,cerc/fixturenet-eth-geth,cerc/fixturenet-eth-lighthouse +$ laconic-so --stack fixturenet-eth build-containers ``` This should create several container images in the local image registry: @@ -20,7 +20,7 @@ This should create several container images in the local image registry: ## Deploy the stack ``` -$ laconic-so deploy-system --include fixturenet-eth up +$ laconic-so --stack fixturenet-eth deploy-system up ``` ## Check status diff --git a/app/data/stacks/fixturenet-eth/stack.yml b/app/data/stacks/fixturenet-eth/stack.yml index 3c23e841..500ae186 100644 --- a/app/data/stacks/fixturenet-eth/stack.yml +++ b/app/data/stacks/fixturenet-eth/stack.yml @@ -3,10 +3,11 @@ name: fixturenet-eth decription: "Ethereum Fixturenet" repos: - cerc-io/go-ethereum + - cerc-io/tx-spammer containers: - cerc/go-ethereum - cerc/lighthouse - cerc/fixturenet-eth-geth - cerc/fixturenet-eth-lighthouse pods: - - fixturenet-eth \ No newline at end of file + - fixturenet-eth diff --git a/app/deploy_system.py b/app/deploy_system.py index 904c7f63..7c2e5b7e 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -37,6 +37,7 @@ def command(ctx, include, exclude, cluster, command, extra_args): # TODO: implement option exclusion and command value constraint lost with the move from argparse to click + debug = ctx.obj.debug quiet = ctx.obj.quiet verbose = ctx.obj.verbose dry_run = ctx.obj.dry_run @@ -91,6 +92,8 @@ def command(ctx, include, exclude, cluster, command, extra_args): if not dry_run: if command == "up": + if debug: + os.environ["CERC_SCRIPT_DEBUG"] = "true" if verbose: print(f"Running compose up for extra_args: {extra_args_list}") docker.compose.up(detach=True, services=extra_args_list) @@ -104,9 +107,12 @@ def command(ctx, include, exclude, cluster, command, extra_args): sys.exit(1) service_name = extra_args_list[0] command_to_exec = extra_args_list[1:] + container_exec_env = { + "CERC_SCRIPT_DEBUG": "true" + } if debug else None if verbose: print(f"Running compose exec {service_name} {command_to_exec}") - docker.compose.execute(service_name, command_to_exec) + docker.compose.execute(service_name, command_to_exec, envs=container_exec_env) elif command == "port": if extra_args_list is None or len(extra_args_list) < 2: print("Usage: port ") From 9991baa8d630d4669a20ef5252208469ed43f53e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 27 Jan 2023 07:30:14 -0700 Subject: [PATCH 0247/1010] Update version Former-commit-id: 04f61293b59f412765ac2499fe60b665ee2af179 --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index 1ac00163..ac8efd32 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.15-e142104 +v1.0.16-ecf943b From d677e5f369cf5fbccadb84515a5312fbc96f193a Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 27 Jan 2023 08:10:04 -0700 Subject: [PATCH 0248/1010] Fix status script Former-commit-id: 5a3bdd269d06f17a9062d5c5df05c75f4bbf7745 --- .../cerc-fixturenet-eth-lighthouse/scripts/status-internal.sh | 2 +- app/deploy_system.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status-internal.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status-internal.sh index 52c61a39..628d7d48 100755 --- a/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status-internal.sh +++ b/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status-internal.sh @@ -4,7 +4,7 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi export LIGHTHOUSE_BASE_URL="http://fixturenet-eth-lighthouse-1:8001" -export GETH_BASE_URL="http://fixturenet-eth-geth-1-1:8545" +export GETH_BASE_URL="http://fixturenet-eth-geth-1:8545" # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) $SCRIPT_DIR/status.sh diff --git a/app/deploy_system.py b/app/deploy_system.py index 7c2e5b7e..b7fc69a6 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -109,7 +109,7 @@ def command(ctx, include, exclude, cluster, command, extra_args): command_to_exec = extra_args_list[1:] container_exec_env = { "CERC_SCRIPT_DEBUG": "true" - } if debug else None + } if debug else {} if verbose: print(f"Running compose exec {service_name} {command_to_exec}") docker.compose.execute(service_name, command_to_exec, envs=container_exec_env) From 607575e4f41c352b41ed3cea5ee5a5b84f439ab9 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 27 Jan 2023 21:22:43 -0700 Subject: [PATCH 0249/1010] Add release process doc Former-commit-id: 1b3a14d86f2bba66f01c7cca54e90d1019dd9089 --- docs/release-process.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 docs/release-process.md diff --git a/docs/release-process.md b/docs/release-process.md new file mode 100644 index 00000000..c1c6893f --- /dev/null +++ b/docs/release-process.md @@ -0,0 +1,29 @@ +# Release Process + +## Manually publish to github releases + +In order to build, the shiv and wheel packages must be installed: +``` +$ pip install shiv +$ pip install wheel +``` + +Then: + +1. Define `CERC_GH_RELEASE_SCRIPTS_DIR` +1. Define `CERC_PACKAGE_RELEASE_GITHUB_TOKEN` +1. Run `./scripts/tag_new_release.sh ` +1. Run `./scripts/build_shiv_package.sh` +1. Run `./scripts/publish_shiv_package_github.sh ` +1. Commit the new version file. + +e.g. + +``` +$ export CERC_GH_RELEASE_SCRIPTS_DIR=~/projects/cerc/github-release-api/ +$ export CERC_PACKAGE_RELEASE_GITHUB_TOKEN=github_pat_xxxxxx +$ ./scripts/tag_new_release.sh 1 0 17 +$ ./scripts/build_shiv_package.sh +$ ./scripts/publish_shiv_package_github.sh 1 0 17 +``` + From 4dda8e2a8780502c2c4e25ae70b2266fdaf91585 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sat, 28 Jan 2023 18:56:43 +0100 Subject: [PATCH 0250/1010] Install gerbil packages globally not locally in the project directory Former-commit-id: 5928e40721a43a7e8ee2fc90f43db94c6a8e3d78 --- app/data/container-build/cerc-builder-gerbil/Dockerfile | 6 ++++++ .../cerc-builder-gerbil/install-dependencies.sh | 1 + 2 files changed, 7 insertions(+) diff --git a/app/data/container-build/cerc-builder-gerbil/Dockerfile b/app/data/container-build/cerc-builder-gerbil/Dockerfile index f849d8ea..a18dfa72 100644 --- a/app/data/container-build/cerc-builder-gerbil/Dockerfile +++ b/app/data/container-build/cerc-builder-gerbil/Dockerfile @@ -16,6 +16,12 @@ RUN apt-get update && export DEBIAN_FRONTEND=noninteractive && export DEBCONF_NO RUN mkdir /scripts COPY install-dependencies.sh /scripts +# Override the definition of GERBIL_PATH in the base image, but +# is safe because (at present) no gerbil packages are installed in the base image +# We do this in order to allow a set of pre-installed packages from the container +# to be used with an arbitrary, potentially different set of projects bind mounted +# at /src +ENV GERBIL_PATH=/.gerbil RUN bash /scripts/install-dependencies.sh # Needed to prevent git from raging about /src diff --git a/app/data/container-build/cerc-builder-gerbil/install-dependencies.sh b/app/data/container-build/cerc-builder-gerbil/install-dependencies.sh index c6725ef8..dbbbfe84 100755 --- a/app/data/container-build/cerc-builder-gerbil/install-dependencies.sh +++ b/app/data/container-build/cerc-builder-gerbil/install-dependencies.sh @@ -10,6 +10,7 @@ DEPS=(github.com/fare/gerbil-utils github.com/vyzo/gerbil-libp2p ) ; for i in ${DEPS[@]} ; do + echo "Installing gerbil package: $i" gxpkg install $i && gxpkg build $i done From 77380aec94fab6ba778dbbfc54d49ae01f492ebc Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 30 Jan 2023 16:53:57 +0100 Subject: [PATCH 0251/1010] Initial commit Former-commit-id: f01bc27660bb60687f638155b00f9b61d87399a8 --- .../docker-compose-fixturenet-eth-metrics.yml | 2 ++ .../stacks/fixturenet-eth-loaded/README.md | 6 +++++ .../stacks/fixturenet-eth-loaded/stack.yml | 24 +++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 app/data/stacks/fixturenet-eth-loaded/README.md create mode 100644 app/data/stacks/fixturenet-eth-loaded/stack.yml diff --git a/app/data/compose/docker-compose-fixturenet-eth-metrics.yml b/app/data/compose/docker-compose-fixturenet-eth-metrics.yml index 4d3ccdf5..832e6589 100644 --- a/app/data/compose/docker-compose-fixturenet-eth-metrics.yml +++ b/app/data/compose/docker-compose-fixturenet-eth-metrics.yml @@ -13,6 +13,8 @@ services: grafana: restart: always image: grafana/grafana + environment: + - GF_SECURITY_ADMIN_PASSWORD=changeme6325 volumes: - ../config/fixturenet-eth-metrics/grafana/etc/provisioning/dashboards:/etc/grafana/provisioning/dashboards - ../config/fixturenet-eth-metrics/grafana/etc/provisioning/datasources:/etc/grafana/provisioning/datasources diff --git a/app/data/stacks/fixturenet-eth-loaded/README.md b/app/data/stacks/fixturenet-eth-loaded/README.md new file mode 100644 index 00000000..09eab027 --- /dev/null +++ b/app/data/stacks/fixturenet-eth-loaded/README.md @@ -0,0 +1,6 @@ +# fixturenet-eth + +A "loaded" version of fixturenet-eth, with all the bells and whistles enabled. + +TODO: write me + diff --git a/app/data/stacks/fixturenet-eth-loaded/stack.yml b/app/data/stacks/fixturenet-eth-loaded/stack.yml new file mode 100644 index 00000000..ced862f9 --- /dev/null +++ b/app/data/stacks/fixturenet-eth-loaded/stack.yml @@ -0,0 +1,24 @@ +version: "1.0" +name: fixturenet-eth-loaded +decription: "Loaded Ethereum Fixturenet" +repos: + - cerc-io/go-ethereum + - cerc-io/tx-spammer + - cerc-io/ipld-eth-server + - cerc-io/ipld-eth-db + - cerc/go-ethereum +containers: + - cerc/lighthouse + - cerc/fixturenet-eth-geth + - cerc/fixturenet-eth-lighthouse + - cerc/ipld-eth-server + - cerc/ipld-eth-db + - cerc/keycloak + - cerc/tx-spammer +pods: + - fixturenet-eth + - tx-spammer + - fixturenet-eth-metrics + - keycloak + - ipld-eth-server + - ipld-eth-db From b4ddef7ff0cadc0f58bfab3833b0c7db3980d3c9 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 30 Jan 2023 14:05:48 -0700 Subject: [PATCH 0252/1010] Revert local foundry build Former-commit-id: e850923e1abc57aec3911901425f6b5c77e227d3 --- app/data/container-build/cerc-go-ethereum-foundry/Dockerfile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/data/container-build/cerc-go-ethereum-foundry/Dockerfile b/app/data/container-build/cerc-go-ethereum-foundry/Dockerfile index 38a3ca29..bbbc64fc 100644 --- a/app/data/container-build/cerc-go-ethereum-foundry/Dockerfile +++ b/app/data/container-build/cerc-go-ethereum-foundry/Dockerfile @@ -1,6 +1,4 @@ -# Use locally build foundry base image to work around there being -# no aarm64 image published. -FROM foundry-rs/foundry:local +FROM ghcr.io/foundry-rs/foundry RUN apk update ; apk add --no-cache --allow-untrusted ca-certificates curl bash git jq RUN apk add --no-cache --upgrade grep From 9a750f0d9e3a2ef27c138c6ffda60ef0e619eeb2 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 30 Jan 2023 22:28:33 +0100 Subject: [PATCH 0253/1010] Update version Former-commit-id: 10f2fbaa375b41a95fe9335af6ea608dd5ce37a6 --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index ac8efd32..3df1969e 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.16-ecf943b +v1.0.18-3bd0c74 From 5ec774a300ad32818e36dd786e34bdb2b189ff87 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 30 Jan 2023 22:29:38 +0100 Subject: [PATCH 0254/1010] Update version Former-commit-id: b0520a042a1976c683c509bb74edb2e51caf8a4f --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index 3df1969e..af3bcc6a 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.18-3bd0c74 +v1.0.19-10f2fba From bc5eff71b5dffc3cadc5c4e9d292feeb49c42004 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Wed, 1 Feb 2023 16:02:49 -0600 Subject: [PATCH 0255/1010] Use latest keycloak plugin. (#173) Former-commit-id: 8645ab06193287f51fdfc4de89722d5aa8bee3fc --- app/data/container-build/cerc-keycloak/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/container-build/cerc-keycloak/Dockerfile b/app/data/container-build/cerc-keycloak/Dockerfile index 000f38cd..a366b4eb 100644 --- a/app/data/container-build/cerc-keycloak/Dockerfile +++ b/app/data/container-build/cerc-keycloak/Dockerfile @@ -1,4 +1,4 @@ FROM quay.io/keycloak/keycloak:20.0 WORKDIR /opt/keycloak/providers RUN curl -L https://github.com/aerogear/keycloak-metrics-spi/releases/download/2.5.3/keycloak-metrics-spi-2.5.3.jar --output keycloak-metrics-spi.jar -RUN curl -L https://github.com/cerc-io/keycloak-api-key-demo/releases/download/v0.2/api-key-module-0.2.jar --output api-key-module.jar +RUN curl -L https://github.com/cerc-io/keycloak-api-key-demo/releases/download/v0.3/api-key-module-0.3.jar --output api-key-module.jar From 639ab8cbc3247685324032fe3e1c42909ebaa665 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 17 Feb 2023 11:53:05 -0700 Subject: [PATCH 0256/1010] Update to use stack syntax Former-commit-id: 6569a2a2b6193ed3dbafa5d64ceaa688b20e0914 --- app/data/stacks/erc20/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/data/stacks/erc20/README.md b/app/data/stacks/erc20/README.md index cab41c79..a6568094 100644 --- a/app/data/stacks/erc20/README.md +++ b/app/data/stacks/erc20/README.md @@ -7,13 +7,13 @@ Instructions to deploy a local ERC20 watcher stack (core + watcher) for demonstr Clone required repositories: ```bash -laconic-so setup-repositories --include cerc-io/go-ethereum,cerc-io/ipld-eth-db,cerc-io/ipld-eth-server,cerc-io/watcher-ts +laconic-so --stack erc20 setup-repositories ``` Build the core and watcher container images: ```bash -laconic-so build-containers --include cerc/go-ethereum,cerc/go-ethereum-foundry,cerc/ipld-eth-db,cerc/ipld-eth-server,cerc/watcher-erc20 +laconic-so --stack erc20 build-containers ``` This should create the required docker images in the local image registry. @@ -21,7 +21,7 @@ This should create the required docker images in the local image registry. Deploy the stack: ```bash -laconic-so deploy-system --include ipld-eth-db,go-ethereum-foundry,ipld-eth-server,watcher-erc20 up +laconic-so --stack erc20 deploy-system up ``` ## Demo From 871cd90456544999278a54dca9a116c057f6338a Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 17 Feb 2023 11:53:58 -0700 Subject: [PATCH 0257/1010] Missed one update Former-commit-id: 2bf50383dddcc7158fd171c460d45443a68314ac --- app/data/stacks/erc20/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/stacks/erc20/README.md b/app/data/stacks/erc20/README.md index a6568094..43687e3f 100644 --- a/app/data/stacks/erc20/README.md +++ b/app/data/stacks/erc20/README.md @@ -153,5 +153,5 @@ Transfer funds between different accounts using MetaMask and use the playground To stop all the services running in background run: ```bash -laconic-so deploy-system --include ipld-eth-db,go-ethereum-foundry,ipld-eth-server,watcher-erc20 down +laconic-so --stack erc20 deploy-system down ``` From ff69670db66fa19943653ae4efabcc0c99a96ab4 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 17 Feb 2023 13:34:51 -0700 Subject: [PATCH 0258/1010] Initial commit Former-commit-id: 60c1da725e0900045012a80d2449326d5c55fee7 --- app/base.py | 34 +++++++++++++++ app/build_npms.py | 10 ++++- app/data/stacks/package-registry/stack.yml | 11 +++++ app/deploy_system.py | 51 ++++++++++++++++++++-- 4 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 app/base.py create mode 100644 app/data/stacks/package-registry/stack.yml diff --git a/app/base.py b/app/base.py new file mode 100644 index 00000000..04cdaf5a --- /dev/null +++ b/app/base.py @@ -0,0 +1,34 @@ +# Copyright © 2022, 2023 Cerc + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +def get_stack(config, stack): + return base_stack(config, stack) + + +class base_stack(): + + def __init__(self, config, stack): + self.config = config + self.stack = stack + + def ensure_available(self): + if self.config.verbose: + print(f"Checking that base stack {self.stack} is available") + return 1 + + def get_url(self): + return "http://gitea.local:3000/api/packages/cerc-io/npm/" + +# need code to \ No newline at end of file diff --git a/app/build_npms.py b/app/build_npms.py index 3cf7d404..d794d027 100644 --- a/app/build_npms.py +++ b/app/build_npms.py @@ -24,6 +24,7 @@ from decouple import config import click import importlib.resources from python_on_whales import docker, DockerException +from .base import get_stack from .util import include_exclude_check, get_parsed_stack_config @click.command() @@ -41,6 +42,12 @@ def command(ctx, include, exclude): stack = ctx.obj.stack continue_on_error = ctx.obj.continue_on_error + # build-npms depends on having access to a writable package registry + # so we check here that it is available + package_registry_stack = get_stack(ctx.obj, 'package-registry') + package_registry_stack.ensure_available() + npm_registry_url = package_registry_stack.get_url('package-registry') + if local_stack: dev_root_path = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] print(f'Local stack dev_root_path (CERC_REPO_BASE_DIR) overridden to: {dev_root_path}') @@ -75,7 +82,7 @@ def command(ctx, include, exclude): repo_dir = package repo_full_path = os.path.join(dev_root_path, repo_dir) # TODO: make the npm registry url configurable. - build_command = ["sh", "-c", "cd /workspace && build-npm-package-local-dependencies.sh http://gitea.local:3000/api/packages/cerc-io/npm/"] + build_command = ["sh", "-c", f"cd /workspace && build-npm-package-local-dependencies.sh {npm_registry_url}"] if not dry_run: if verbose: print(f"Executing: {build_command}") @@ -87,6 +94,7 @@ def command(ctx, include, exclude): tty=True, user=f"{os.getuid()}:{os.getgid()}", envs=envs, + # TODO: detect this host name in npm_registry_url rather than hard-wiring it add_hosts=[("gitea.local", "host-gateway")], volumes=[(repo_full_path, "/workspace")], command=build_command diff --git a/app/data/stacks/package-registry/stack.yml b/app/data/stacks/package-registry/stack.yml new file mode 100644 index 00000000..771149ed --- /dev/null +++ b/app/data/stacks/package-registry/stack.yml @@ -0,0 +1,11 @@ +version: "1.1" +name: package-registry +decription: "Local Package Registry" +repos: + - cerc-io/hosting +pods: + - name: gitea + repository: cerc-io/hosting + path: gitea + pre_start_command: "run-this-first.sh" + post_start_command: "initialize-gitea.sh" diff --git a/app/deploy_system.py b/app/deploy_system.py index b7fc69a6..f7bf71b1 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -18,6 +18,7 @@ import hashlib import os import sys +from decouple import config from python_on_whales import DockerClient import click import importlib.resources @@ -40,9 +41,16 @@ def command(ctx, include, exclude, cluster, command, extra_args): debug = ctx.obj.debug quiet = ctx.obj.quiet verbose = ctx.obj.verbose + local_stack = ctx.obj.local_stack dry_run = ctx.obj.dry_run stack = ctx.obj.stack + if local_stack: + dev_root_path = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] + print(f'Local stack dev_root_path (CERC_REPO_BASE_DIR) overridden to: {dev_root_path}') + else: + dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) + # See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure compose_dir = Path(__file__).absolute().parent.joinpath("data", "compose") @@ -68,19 +76,37 @@ def command(ctx, include, exclude, cluster, command, extra_args): else: pods_in_scope = all_pods + # Convert all pod definitions to v1.1 format + pods_in_scope = _convert_to_new_format(pods_in_scope) + if verbose: print(f"Pods: {pods_in_scope}") # Construct a docker compose command suitable for our purpose compose_files = [] + pre_start_commands = [] + post_start_commands = [] for pod in pods_in_scope: - if include_exclude_check(pod, include, exclude): - compose_file_name = os.path.join(compose_dir, f"docker-compose-{pod}.yml") + pod_name = pod["name"] + pod_repository = pod["repository"] + pod_path = pod["path"] + if include_exclude_check(pod_name, include, exclude): + if pod_repository is None or pod_repository == "internal": + compose_file_name = os.path.join(compose_dir, f"docker-compose-{pod_path}.yml") + else: + pod_root_dir = os.path.join(dev_root_path, pod_repository.split("/")[-1], pod["path"]) + compose_file_name = os.path.join(pod_root_dir, "docker-compose.yml") + pod_pre_start_command = pod["pre_start_command"] + pod_post_start_command = pod["post_start_command"] + if pod_pre_start_command is not None: + pre_start_commands.append(os.path.join(pod_root_dir, pod_pre_start_command)) + if pod_post_start_command is not None: + post_start_commands.append(os.path.join(pod_root_dir, pod_post_start_command)) compose_files.append(compose_file_name) else: if verbose: - print(f"Excluding: {pod}") + print(f"Excluding: {pod_name}") if verbose: print(f"files: {compose_files}") @@ -96,7 +122,11 @@ def command(ctx, include, exclude, cluster, command, extra_args): os.environ["CERC_SCRIPT_DEBUG"] = "true" if verbose: print(f"Running compose up for extra_args: {extra_args_list}") + for pre_start_command in pre_start_commands: + 1 docker.compose.up(detach=True, services=extra_args_list) + for post_start_command in post_start_commands: + 1 elif command == "down": if verbose: print("Running compose down") @@ -148,3 +178,18 @@ def command(ctx, include, exclude, cluster, command, extra_args): if verbose: print("Running compose logs") docker.compose.logs() + + +def _convert_to_new_format(old_pod_array): + new_pod_array = [] + for old_pod in old_pod_array: + if isinstance(old_pod, dict): + new_pod_array.append(old_pod) + else: + new_pod = { + "name": old_pod, + "repository": "internal", + "path": old_pod + } + new_pod_array.append(new_pod) + return new_pod_array From 912483df585b423c5585b1d908396dc0132bf909 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 17 Feb 2023 14:15:35 -0700 Subject: [PATCH 0259/1010] Basic functionality Former-commit-id: a1893aa153bec36426d3d1f294040f31cadbe8cf --- app/deploy_system.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/app/deploy_system.py b/app/deploy_system.py index f7bf71b1..91ffa28c 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -19,6 +19,7 @@ import hashlib import os import sys from decouple import config +import subprocess from python_on_whales import DockerClient import click import importlib.resources @@ -123,10 +124,10 @@ def command(ctx, include, exclude, cluster, command, extra_args): if verbose: print(f"Running compose up for extra_args: {extra_args_list}") for pre_start_command in pre_start_commands: - 1 + _run_command(ctx.obj, pre_start_command) docker.compose.up(detach=True, services=extra_args_list) for post_start_command in post_start_commands: - 1 + _run_command(ctx.obj, post_start_command) elif command == "down": if verbose: print("Running compose down") @@ -193,3 +194,16 @@ def _convert_to_new_format(old_pod_array): } new_pod_array.append(new_pod) return new_pod_array + + +def _run_command(ctx, command): + if ctx.verbose: + print(f"Running command: {command}") + command_dir = os.path.dirname(command) + print(f"command_dir: {command_dir}") + command_file = os.path.join(".", os.path.basename(command)) + my_env = os.environ.copy() + command_result = subprocess.run(f"bash {command_file}", shell=True, env=my_env, cwd=command_dir) + if command_result.returncode != 0: + print(f"FATAL Error running command: {command}") + sys.exit(1) From 46c22f4e4fc553755a1aa2a509d6b624cfce4b0d Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 17 Feb 2023 15:31:43 -0700 Subject: [PATCH 0260/1010] Add pre/post script support Former-commit-id: bb39d90522721a7cdd3bea9b39a8737c736133f9 --- app/deploy_system.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/app/deploy_system.py b/app/deploy_system.py index 91ffa28c..29028a53 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -124,10 +124,10 @@ def command(ctx, include, exclude, cluster, command, extra_args): if verbose: print(f"Running compose up for extra_args: {extra_args_list}") for pre_start_command in pre_start_commands: - _run_command(ctx.obj, pre_start_command) + _run_command(ctx.obj, cluster, pre_start_command) docker.compose.up(detach=True, services=extra_args_list) for post_start_command in post_start_commands: - _run_command(ctx.obj, post_start_command) + _run_command(ctx.obj, cluster, post_start_command) elif command == "down": if verbose: print("Running compose down") @@ -196,14 +196,17 @@ def _convert_to_new_format(old_pod_array): return new_pod_array -def _run_command(ctx, command): +def _run_command(ctx, cluster_name, command): if ctx.verbose: print(f"Running command: {command}") command_dir = os.path.dirname(command) print(f"command_dir: {command_dir}") command_file = os.path.join(".", os.path.basename(command)) - my_env = os.environ.copy() - command_result = subprocess.run(f"bash {command_file}", shell=True, env=my_env, cwd=command_dir) + command_env = os.environ.copy() + command_env["CERC_SO_COMPOSE_PROJECT"] = cluster_name + if ctx.debug: + command_env["CERC_SCRIPT_DEBUG"] = "true" + command_result = subprocess.run(command_file, shell=True, env=command_env, cwd=command_dir) if command_result.returncode != 0: print(f"FATAL Error running command: {command}") sys.exit(1) From 83115bcb9d6beb8e1256ca0eb8dc44b7318b921b Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 17 Feb 2023 15:35:31 -0700 Subject: [PATCH 0261/1010] Fix comment Former-commit-id: 88d81f7df62e0341f4b0ac3b09b05d51a81d24ad --- app/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/base.py b/app/base.py index 04cdaf5a..e4e44791 100644 --- a/app/base.py +++ b/app/base.py @@ -31,4 +31,4 @@ class base_stack(): def get_url(self): return "http://gitea.local:3000/api/packages/cerc-io/npm/" -# need code to \ No newline at end of file +# TODO: finish this implementation for the npm package registry \ No newline at end of file From 9dab9b815cdb9858078b5e2dd0ba00315f1f68d5 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 17 Feb 2023 15:36:09 -0700 Subject: [PATCH 0262/1010] Add newline Former-commit-id: 63c93acb83fc02ffafaaebee04353c45b8f858b6 --- app/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/base.py b/app/base.py index e4e44791..e70f7289 100644 --- a/app/base.py +++ b/app/base.py @@ -31,4 +31,4 @@ class base_stack(): def get_url(self): return "http://gitea.local:3000/api/packages/cerc-io/npm/" -# TODO: finish this implementation for the npm package registry \ No newline at end of file +# TODO: finish this implementation for the npm package registry From 863e19211efa355b227c475858ac5dc397ae3241 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 17 Feb 2023 15:38:24 -0700 Subject: [PATCH 0263/1010] Remove debug code Former-commit-id: 5ceed34160f2984b456874926b20199fbab15f37 --- app/deploy_system.py | 1 - 1 file changed, 1 deletion(-) diff --git a/app/deploy_system.py b/app/deploy_system.py index 29028a53..798e7b70 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -200,7 +200,6 @@ def _run_command(ctx, cluster_name, command): if ctx.verbose: print(f"Running command: {command}") command_dir = os.path.dirname(command) - print(f"command_dir: {command_dir}") command_file = os.path.join(".", os.path.basename(command)) command_env = os.environ.copy() command_env["CERC_SO_COMPOSE_PROJECT"] = cluster_name From 547ca561c0f3b56acd4d300404f00c48629f0612 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 19 Feb 2023 17:46:47 -0700 Subject: [PATCH 0264/1010] Update python on whales Former-commit-id: 7d51e4b9aa8bb3b876c9e8628e2aa6bd252dbd05 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 128ee3a0..8249a55a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ python-decouple>=3.6 GitPython>=3.1.27 tqdm>=4.64.0 -python-on-whales>=0.52.0 +python-on-whales>=0.58.0 click>=8.1.3 pyyaml>=6.0 From 142be179f43525853cdce9287a7b0bd29b38d1a4 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 20 Feb 2023 06:09:35 -0700 Subject: [PATCH 0265/1010] Initial implementation Former-commit-id: 68293cbaa3fc8f250e479773859c95f563f04beb --- app/base.py | 51 ++++++++++++-- app/deploy_system.py | 155 ++++++++++++++++++++++++------------------- 2 files changed, 131 insertions(+), 75 deletions(-) diff --git a/app/base.py b/app/base.py index e70f7289..52528a6d 100644 --- a/app/base.py +++ b/app/base.py @@ -13,22 +13,59 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import os +from abc import ABC, abstractmethod + def get_stack(config, stack): - return base_stack(config, stack) + if stack == "package-registry": + return package_registry_stack(config, stack) + else: + return base_stack(config, stack) -class base_stack(): +class base_stack(ABC): def __init__(self, config, stack): self.config = config self.stack = stack + @abstractmethod def ensure_available(self): - if self.config.verbose: - print(f"Checking that base stack {self.stack} is available") - return 1 + pass + + @abstractmethod + def get_url(self): + pass + + +class package_registry_stack(base_stack): + + def ensure_available(self): + self.url = "" + # Check if we were given an external registry URL + url_from_environment = os.environ.get("CERC_NPM_REGISTRY_URL") + if url_from_environment: + if self.config.verbose: + print(f"Using package registry url from CERC_NPM_REGISTRY_URL: {url_from_environment}") + self.url = url_from_environment + else: + # Otherwise we expect to use the local package-registry stack + # First check if the stack is up + # If not, print a message about how to start it and return fail to the caller + return False + # If it is available, get its mapped port and construct its URL + self.url = "http://gitea.local:3000/api/packages/cerc-io/npm/" + return True def get_url(self): - return "http://gitea.local:3000/api/packages/cerc-io/npm/" + return self.url -# TODO: finish this implementation for the npm package registry +# Temporary helper functions while we figure out a good interface to the stack deploy code + + +def _is_stack_running(stack): + return True + + +def _get_stack_mapped_port(stack, service, exposed_port): + return 3000 diff --git a/app/deploy_system.py b/app/deploy_system.py index 798e7b70..3fd42f58 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -46,74 +46,10 @@ def command(ctx, include, exclude, cluster, command, extra_args): dry_run = ctx.obj.dry_run stack = ctx.obj.stack - if local_stack: - dev_root_path = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] - print(f'Local stack dev_root_path (CERC_REPO_BASE_DIR) overridden to: {dev_root_path}') - else: - dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) - - # See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure - compose_dir = Path(__file__).absolute().parent.joinpath("data", "compose") - - if cluster is None: - # Create default unique, stable cluster name from confile file path - # TODO: change this to the config file path - path = os.path.realpath(sys.argv[0]) - hash = hashlib.md5(path.encode()).hexdigest() - cluster = f"laconic-{hash}" - if verbose: - print(f"Using cluster name: {cluster}") - - # See: https://stackoverflow.com/a/20885799/1701505 - from . import data - with importlib.resources.open_text(data, "pod-list.txt") as pod_list_file: - all_pods = pod_list_file.read().splitlines() - - pods_in_scope = [] - if stack: - stack_config = get_parsed_stack_config(stack) - # TODO: syntax check the input here - pods_in_scope = stack_config['pods'] - else: - pods_in_scope = all_pods - - # Convert all pod definitions to v1.1 format - pods_in_scope = _convert_to_new_format(pods_in_scope) - - if verbose: - print(f"Pods: {pods_in_scope}") - - # Construct a docker compose command suitable for our purpose - - compose_files = [] - pre_start_commands = [] - post_start_commands = [] - for pod in pods_in_scope: - pod_name = pod["name"] - pod_repository = pod["repository"] - pod_path = pod["path"] - if include_exclude_check(pod_name, include, exclude): - if pod_repository is None or pod_repository == "internal": - compose_file_name = os.path.join(compose_dir, f"docker-compose-{pod_path}.yml") - else: - pod_root_dir = os.path.join(dev_root_path, pod_repository.split("/")[-1], pod["path"]) - compose_file_name = os.path.join(pod_root_dir, "docker-compose.yml") - pod_pre_start_command = pod["pre_start_command"] - pod_post_start_command = pod["post_start_command"] - if pod_pre_start_command is not None: - pre_start_commands.append(os.path.join(pod_root_dir, pod_pre_start_command)) - if pod_post_start_command is not None: - post_start_commands.append(os.path.join(pod_root_dir, pod_post_start_command)) - compose_files.append(compose_file_name) - else: - if verbose: - print(f"Excluding: {pod_name}") - - if verbose: - print(f"files: {compose_files}") + cluster_context = _make_cluster_context(ctx.obj, include, exclude, cluster) # See: https://gabrieldemarmiesse.github.io/python-on-whales/sub-commands/compose/ - docker = DockerClient(compose_files=compose_files, compose_project_name=cluster) + docker = DockerClient(compose_files=cluster_context.compose_files, compose_project_name=cluster_context.cluster) extra_args_list = list(extra_args) or None @@ -123,10 +59,10 @@ def command(ctx, include, exclude, cluster, command, extra_args): os.environ["CERC_SCRIPT_DEBUG"] = "true" if verbose: print(f"Running compose up for extra_args: {extra_args_list}") - for pre_start_command in pre_start_commands: + for pre_start_command in cluster_context.pre_start_commands: _run_command(ctx.obj, cluster, pre_start_command) docker.compose.up(detach=True, services=extra_args_list) - for post_start_command in post_start_commands: + for post_start_command in cluster_context.post_start_commands: _run_command(ctx.obj, cluster, post_start_command) elif command == "down": if verbose: @@ -181,6 +117,89 @@ def command(ctx, include, exclude, cluster, command, extra_args): docker.compose.logs() +def get_stack_status(stack): + pass + + +def _make_cluster_context(ctx, include, exclude, cluster): + + if ctx.local_stack: + dev_root_path = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] + print(f'Local stack dev_root_path (CERC_REPO_BASE_DIR) overridden to: {dev_root_path}') + else: + dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) + + # See: https://stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure + compose_dir = Path(__file__).absolute().parent.joinpath("data", "compose") + + if cluster is None: + # Create default unique, stable cluster name from confile file path + # TODO: change this to the config file path + path = os.path.realpath(sys.argv[0]) + hash = hashlib.md5(path.encode()).hexdigest() + cluster = f"laconic-{hash}" + if ctx.verbose: + print(f"Using cluster name: {cluster}") + + # See: https://stackoverflow.com/a/20885799/1701505 + from . import data + with importlib.resources.open_text(data, "pod-list.txt") as pod_list_file: + all_pods = pod_list_file.read().splitlines() + + pods_in_scope = [] + if ctx.stack: + stack_config = get_parsed_stack_config(ctx.stack) + # TODO: syntax check the input here + pods_in_scope = stack_config['pods'] + else: + pods_in_scope = all_pods + + # Convert all pod definitions to v1.1 format + pods_in_scope = _convert_to_new_format(pods_in_scope) + + if ctx.verbose: + print(f"Pods: {pods_in_scope}") + + # Construct a docker compose command suitable for our purpose + + compose_files = [] + pre_start_commands = [] + post_start_commands = [] + for pod in pods_in_scope: + pod_name = pod["name"] + pod_repository = pod["repository"] + pod_path = pod["path"] + if include_exclude_check(pod_name, include, exclude): + if pod_repository is None or pod_repository == "internal": + compose_file_name = os.path.join(compose_dir, f"docker-compose-{pod_path}.yml") + else: + pod_root_dir = os.path.join(dev_root_path, pod_repository.split("/")[-1], pod["path"]) + compose_file_name = os.path.join(pod_root_dir, "docker-compose.yml") + pod_pre_start_command = pod["pre_start_command"] + pod_post_start_command = pod["post_start_command"] + if pod_pre_start_command is not None: + pre_start_commands.append(os.path.join(pod_root_dir, pod_pre_start_command)) + if pod_post_start_command is not None: + post_start_commands.append(os.path.join(pod_root_dir, pod_post_start_command)) + compose_files.append(compose_file_name) + else: + if ctx.verbose: + print(f"Excluding: {pod_name}") + + if ctx.verbose: + print(f"files: {compose_files}") + + return cluster_context(cluster, compose_files, pre_start_commands, post_start_commands) + + +class cluster_context: + def __init__(self, cluster, compose_files, pre_start_commands, post_start_commands) -> None: + self.cluster = cluster + self.compose_files = compose_files + self.pre_start_commands = pre_start_commands + self.post_start_commands = post_start_commands + + def _convert_to_new_format(old_pod_array): new_pod_array = [] for old_pod in old_pod_array: From d927c92c0af286d199ca2f2b9d3f938c89a94371 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 20 Feb 2023 06:23:21 -0700 Subject: [PATCH 0266/1010] Call from base stack class Former-commit-id: f1cbce1d00db85009fc4c1bc424458cba76b9bfc --- app/base.py | 21 ++++++++++++--------- app/deploy_system.py | 22 ++++++++++++++++++++-- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/app/base.py b/app/base.py index 52528a6d..b5ca26dc 100644 --- a/app/base.py +++ b/app/base.py @@ -15,6 +15,8 @@ import os from abc import ABC, abstractmethod +from .deploy_system import get_stack_status + def get_stack(config, stack): if stack == "package-registry": @@ -40,7 +42,7 @@ class base_stack(ABC): class package_registry_stack(base_stack): - def ensure_available(self): + def ensure_available(self, ctx): self.url = "" # Check if we were given an external registry URL url_from_environment = os.environ.get("CERC_NPM_REGISTRY_URL") @@ -51,10 +53,15 @@ class package_registry_stack(base_stack): else: # Otherwise we expect to use the local package-registry stack # First check if the stack is up - # If not, print a message about how to start it and return fail to the caller - return False - # If it is available, get its mapped port and construct its URL - self.url = "http://gitea.local:3000/api/packages/cerc-io/npm/" + registry_running = get_stack_status("package-registry") + if registry_running: + # If it is available, get its mapped port and construct its URL + if self.config.debug: + print("Found local package registry stack is up") + self.url = "http://gitea.local:3000/api/packages/cerc-io/npm/" + else: + # If not, print a message about how to start it and return fail to the caller + return False return True def get_url(self): @@ -63,9 +70,5 @@ class package_registry_stack(base_stack): # Temporary helper functions while we figure out a good interface to the stack deploy code -def _is_stack_running(stack): - return True - - def _get_stack_mapped_port(stack, service, exposed_port): return 3000 diff --git a/app/deploy_system.py b/app/deploy_system.py index 3fd42f58..4012690a 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -16,6 +16,7 @@ # Deploys the system components using docker-compose import hashlib +import copy import os import sys from decouple import config @@ -117,8 +118,25 @@ def command(ctx, include, exclude, cluster, command, extra_args): docker.compose.logs() -def get_stack_status(stack): - pass +def get_stack_status(ctx, stack): + + ctx_copy = copy.copy(ctx) + ctx_copy.stack = stack + + cluster_context = _make_cluster_context(ctx_copy, [], [], None) + docker = DockerClient(compose_files=cluster_context.compose_files, compose_project_name=cluster_context.cluster) + # TODO: refactor to avoid duplicating this code above + if ctx.verbose: + print("Running compose ps") + container_list = docker.compose.ps() + if len(container_list) > 0: + if ctx.debug: + print(f"Container list from compose ps: {container_list}") + return True + else: + if ctx.debug: + print("No containers found from compose ps") + False def _make_cluster_context(ctx, include, exclude, cluster): From c737ec7ed6af4b37f235b18d232da2154fa9eb54 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 20 Feb 2023 06:43:06 -0700 Subject: [PATCH 0267/1010] Wire up to build-npms Former-commit-id: 7e6268c39d3d2b0b895500d695f28f946fec426e --- app/base.py | 6 ++++-- app/build_npms.py | 15 +++++++++++---- app/deploy_system.py | 6 +++--- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/app/base.py b/app/base.py index b5ca26dc..3c6dbe64 100644 --- a/app/base.py +++ b/app/base.py @@ -42,7 +42,7 @@ class base_stack(ABC): class package_registry_stack(base_stack): - def ensure_available(self, ctx): + def ensure_available(self): self.url = "" # Check if we were given an external registry URL url_from_environment = os.environ.get("CERC_NPM_REGISTRY_URL") @@ -53,7 +53,7 @@ class package_registry_stack(base_stack): else: # Otherwise we expect to use the local package-registry stack # First check if the stack is up - registry_running = get_stack_status("package-registry") + registry_running = get_stack_status(self.config, "package-registry") if registry_running: # If it is available, get its mapped port and construct its URL if self.config.debug: @@ -61,6 +61,8 @@ class package_registry_stack(base_stack): self.url = "http://gitea.local:3000/api/packages/cerc-io/npm/" else: # If not, print a message about how to start it and return fail to the caller + print("ERROR: The package-registry stack is not running, and no external registry specified with CERC_NPM_REGISTRY_URL") + print("ERROR: Start the local package registry with: laconic-so --stack package-registry deploy-system up") return False return True diff --git a/app/build_npms.py b/app/build_npms.py index d794d027..101fde3e 100644 --- a/app/build_npms.py +++ b/app/build_npms.py @@ -44,9 +44,16 @@ def command(ctx, include, exclude): # build-npms depends on having access to a writable package registry # so we check here that it is available - package_registry_stack = get_stack(ctx.obj, 'package-registry') - package_registry_stack.ensure_available() - npm_registry_url = package_registry_stack.get_url('package-registry') + package_registry_stack = get_stack(ctx.obj, "package-registry") + registry_available = package_registry_stack.ensure_available() + if not registry_available: + print("FATAL: no npm registry available for build-npms command") + sys.exit(1) + npm_registry_url = package_registry_stack.get_url() + npm_registry_url_token = config("CERC_NPM_AUTH_TOKEN", default=None) + if not npm_registry_url_token: + print("FATAL: CERC_NPM_AUTH_TOKEN is not defined") + sys.exit(1) if local_stack: dev_root_path = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")] @@ -86,7 +93,7 @@ def command(ctx, include, exclude): if not dry_run: if verbose: print(f"Executing: {build_command}") - envs = {"CERC_NPM_AUTH_TOKEN": os.environ["CERC_NPM_AUTH_TOKEN"]} | ({"CERC_SCRIPT_DEBUG": "true"} if debug else {}) + envs = {"CERC_NPM_AUTH_TOKEN": npm_registry_url_token} | ({"CERC_SCRIPT_DEBUG": "true"} if debug else {}) try: docker.run("cerc/builder-js", remove=True, diff --git a/app/deploy_system.py b/app/deploy_system.py index 4012690a..bff573bd 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -61,10 +61,10 @@ def command(ctx, include, exclude, cluster, command, extra_args): if verbose: print(f"Running compose up for extra_args: {extra_args_list}") for pre_start_command in cluster_context.pre_start_commands: - _run_command(ctx.obj, cluster, pre_start_command) + _run_command(ctx.obj, cluster_context.cluster, pre_start_command) docker.compose.up(detach=True, services=extra_args_list) for post_start_command in cluster_context.post_start_commands: - _run_command(ctx.obj, cluster, post_start_command) + _run_command(ctx.obj, cluster_context.cluster, post_start_command) elif command == "down": if verbose: print("Running compose down") @@ -123,7 +123,7 @@ def get_stack_status(ctx, stack): ctx_copy = copy.copy(ctx) ctx_copy.stack = stack - cluster_context = _make_cluster_context(ctx_copy, [], [], None) + cluster_context = _make_cluster_context(ctx_copy, None, None, None) docker = DockerClient(compose_files=cluster_context.compose_files, compose_project_name=cluster_context.cluster) # TODO: refactor to avoid duplicating this code above if ctx.verbose: From 628fed4ef71ead8c76c2fc6920946ff73236f639 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 20 Feb 2023 12:46:56 -0700 Subject: [PATCH 0268/1010] Working feature Former-commit-id: f14a4a33d78033c812bd94e17388eabbbbd4b52b --- app/base.py | 1 + app/data/stacks/build-support/stack.yml | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 app/data/stacks/build-support/stack.yml diff --git a/app/base.py b/app/base.py index 3c6dbe64..940d488f 100644 --- a/app/base.py +++ b/app/base.py @@ -58,6 +58,7 @@ class package_registry_stack(base_stack): # If it is available, get its mapped port and construct its URL if self.config.debug: print("Found local package registry stack is up") + # TODO: get url from deploy-stack self.url = "http://gitea.local:3000/api/packages/cerc-io/npm/" else: # If not, print a message about how to start it and return fail to the caller diff --git a/app/data/stacks/build-support/stack.yml b/app/data/stacks/build-support/stack.yml new file mode 100644 index 00000000..e4efb457 --- /dev/null +++ b/app/data/stacks/build-support/stack.yml @@ -0,0 +1,6 @@ +version: "1.1" +name: build-support +decription: "Build Support Components" +containers: + - cerc/builder-js + - cerc/builder-gerbil From 6f2a44ba2f51d9e249342148c095aebbefc7553e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 20 Feb 2023 16:16:15 -0700 Subject: [PATCH 0269/1010] Check for builder container in npm build Former-commit-id: 156758bfa7b94c35631488a0ce061df3ef292320 --- app/build_containers.py | 2 +- app/build_npms.py | 16 +++++++++++++++- app/data/container-build/default-build.sh | 3 +++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/app/build_containers.py b/app/build_containers.py index 52ba3103..7ecf4a82 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -103,7 +103,7 @@ def command(ctx, include, exclude): # Check if we have a repo for this container. If not, set the context dir to the container-build subdir repo_full_path = os.path.join(dev_root_path, repo_dir) repo_dir_or_build_dir = repo_dir if os.path.exists(repo_full_path) else build_dir - build_command = os.path.join(container_build_dir, "default-build.sh") + f" {container} {repo_dir_or_build_dir}" + build_command = os.path.join(container_build_dir, "default-build.sh") + f" {container}:local {repo_dir_or_build_dir}" if not dry_run: if verbose: print(f"Executing: {build_command}") diff --git a/app/build_npms.py b/app/build_npms.py index 101fde3e..4503de65 100644 --- a/app/build_npms.py +++ b/app/build_npms.py @@ -27,6 +27,8 @@ from python_on_whales import docker, DockerException from .base import get_stack from .util import include_exclude_check, get_parsed_stack_config +builder_js_image_name = "cerc/builder-js:local" + @click.command() @click.option('--include', help="only build these packages") @click.option('--exclude', help="don\'t build these packages") @@ -42,6 +44,8 @@ def command(ctx, include, exclude): stack = ctx.obj.stack continue_on_error = ctx.obj.continue_on_error + _ensure_prerequisites() + # build-npms depends on having access to a writable package registry # so we check here that it is available package_registry_stack = get_stack(ctx.obj, "package-registry") @@ -95,7 +99,7 @@ def command(ctx, include, exclude): print(f"Executing: {build_command}") envs = {"CERC_NPM_AUTH_TOKEN": npm_registry_url_token} | ({"CERC_SCRIPT_DEBUG": "true"} if debug else {}) try: - docker.run("cerc/builder-js", + docker.run(builder_js_image_name, remove=True, interactive=True, tty=True, @@ -126,3 +130,13 @@ def command(ctx, include, exclude): else: if verbose: print(f"Excluding: {package}") + + +def _ensure_prerequisites(): + # Check that the builder-js container is available and + # Tell the user how to build it if not + images = docker.image.list(builder_js_image_name) + if len(images) == 0: + print(f"FATAL: builder image: {builder_js_image_name} is required but was not found") + print("Please run this command to create it: laconic-so --stack build-support build-containers") + sys.exit(1) diff --git a/app/data/container-build/default-build.sh b/app/data/container-build/default-build.sh index b369e2c9..3d5d9919 100755 --- a/app/data/container-build/default-build.sh +++ b/app/data/container-build/default-build.sh @@ -1,6 +1,9 @@ #!/usr/bin/env bash # Usage: default-build.sh [] # if is not supplied, the context is the directory where the Dockerfile lives +if [[ -n "$CERC_SCRIPT_DEBUG" ]]; then + set -x +fi if [[ $# -ne 2 ]]; then echo "Illegal number of parameters" >&2 exit 1 From 92f325a09b76c512fce1daf61097c33389b6e64a Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 21 Feb 2023 05:40:57 -0700 Subject: [PATCH 0270/1010] Update version Former-commit-id: c4fa7fee300eb0d8065318d6cfb88567fb734ef4 --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index af3bcc6a..3a48763e 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.19-10f2fba +v1.0.20-6c1bedc From 0de2db7e9000b2c837436499903375218ba8abde Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 21 Feb 2023 05:59:28 -0700 Subject: [PATCH 0271/1010] Add kubo pod Former-commit-id: 9c00aba8f34c145074344c70ad6511c46f1c8de3 --- app/data/compose/docker-compose-kubo.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 app/data/compose/docker-compose-kubo.yml diff --git a/app/data/compose/docker-compose-kubo.yml b/app/data/compose/docker-compose-kubo.yml new file mode 100644 index 00000000..11c1d2ee --- /dev/null +++ b/app/data/compose/docker-compose-kubo.yml @@ -0,0 +1,13 @@ +version: "3.2" +# See: https://docs.ipfs.tech/install/run-ipfs-inside-docker/#set-up +services: + ipfs: + image: ipfs/kubo:master-2023-02-20-714a968 + restart: always + volumes: + - ./ipfs/import:/import + - ./ipfs/data:/data/ipfs + ports: + - "8080" + - "4001" + - "5001" From c717fd8a599c83b2467064b00b743d9affd5dcb2 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 21 Feb 2023 06:16:59 -0700 Subject: [PATCH 0272/1010] Add ipfs pod Former-commit-id: 6dddceec2743396988ee5065f84ecb8991ef0b3e --- app/data/pod-list.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/data/pod-list.txt b/app/data/pod-list.txt index 64dd0412..81ec9e99 100644 --- a/app/data/pod-list.txt +++ b/app/data/pod-list.txt @@ -18,3 +18,4 @@ test eth-probe keycloak tx-spammer +kubo From c769fce491579c599d1b20592893be8415d856b8 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 21 Feb 2023 06:56:33 -0700 Subject: [PATCH 0273/1010] Copy build tree Former-commit-id: 3b55d012be84e4c58cc33439699787bc66430b17 --- app/build_npms.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/app/build_npms.py b/app/build_npms.py index 4503de65..83f87ede 100644 --- a/app/build_npms.py +++ b/app/build_npms.py @@ -20,6 +20,7 @@ import os import sys +from shutil import rmtree, copytree from decouple import config import click import importlib.resources @@ -65,11 +66,17 @@ def command(ctx, include, exclude): else: dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc")) - if not quiet: + build_root_path = os.path.join(dev_root_path, "build-trees") + + if verbose: print(f'Dev Root is: {dev_root_path}') if not os.path.isdir(dev_root_path): print('Dev root directory doesn\'t exist, creating') + os.makedirs(dev_root_path) + if not os.path.isdir(dev_root_path): + print('Build root directory doesn\'t exist, creating') + os.makedirs(build_root_path) # See: https://stackoverflow.com/a/20885799/1701505 from . import data @@ -92,7 +99,19 @@ def command(ctx, include, exclude): print(f"Building npm package: {package}") repo_dir = package repo_full_path = os.path.join(dev_root_path, repo_dir) - # TODO: make the npm registry url configurable. + # Copy the repo and build that to avoid propagating JS tooling file changes back into the cloned repo + repo_copy_path = os.path.join(build_root_path, repo_dir) + # First delete any old build tree + if os.path.isdir(repo_copy_path): + if verbose: + print(f"Deleting old build tree: {repo_copy_path}") + if not dry_run: + rmtree(repo_copy_path) + # Now copy the repo into the build tree location + if verbose: + print(f"Copying build tree from: {repo_full_path} to: {repo_copy_path}") + if not dry_run: + copytree(repo_full_path, repo_copy_path) build_command = ["sh", "-c", f"cd /workspace && build-npm-package-local-dependencies.sh {npm_registry_url}"] if not dry_run: if verbose: @@ -107,7 +126,7 @@ def command(ctx, include, exclude): envs=envs, # TODO: detect this host name in npm_registry_url rather than hard-wiring it add_hosts=[("gitea.local", "host-gateway")], - volumes=[(repo_full_path, "/workspace")], + volumes=[(repo_copy_path, "/workspace")], command=build_command ) # Note that although the docs say that build_result should contain From f841f8a2def173513e385d775d7e3bb234ac24b2 Mon Sep 17 00:00:00 2001 From: "Rick Manelius, PhD" Date: Tue, 21 Feb 2023 09:30:07 -0600 Subject: [PATCH 0274/1010] Stack syntax for ERC721. Former-commit-id: 463b11bb231f2c206fdf508f616e60ab0da574ac --- app/data/stacks/erc721/README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/data/stacks/erc721/README.md b/app/data/stacks/erc721/README.md index ed5f9c80..7ace03c3 100644 --- a/app/data/stacks/erc721/README.md +++ b/app/data/stacks/erc721/README.md @@ -6,23 +6,23 @@ Instructions to deploy a local ERC721 watcher stack (core + watcher) for demonst * Clone / pull required repositories: - ```bash - $ laconic-so setup-repositories --include cerc-io/go-ethereum,cerc-io/ipld-eth-db,cerc-io/ipld-eth-server,cerc-io/watcher-ts --pull - ``` +```bash +laconic-so --stack erc721 setup-repositories +``` * Build the core and watcher container images: - ```bash - $ laconic-so build-containers --include cerc/go-ethereum,cerc/go-ethereum-foundry,cerc/ipld-eth-db,cerc/ipld-eth-server,cerc/watcher-erc721 - ``` +```bash +laconic-so --stack erc721 build-containers +``` This should create the required docker images in the local image registry. * Deploy the stack: - ```bash - $ laconic-so deploy-system --include db,go-ethereum-foundry,ipld-eth-server,watcher-erc721 up - ``` +```bash +laconic-so --stack erc721 deploy-system up +``` ## Demo @@ -209,6 +209,6 @@ Instructions to deploy a local ERC721 watcher stack (core + watcher) for demonst * To stop all the services running in background: - ```bash - $ laconic-so deploy-system --include db,go-ethereum-foundry,ipld-eth-server,watcher-erc721 down - ``` +```bash +laconic-so --stack erc721 deploy-system down +``` From 8352893d92515148b2b0e7fdebcc4953ec6c9ea2 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 21 Feb 2023 11:25:49 -0700 Subject: [PATCH 0275/1010] Add some doc Former-commit-id: 1f57ec53265a92c3e873950eacca8b86941cd0c0 --- app/base.py | 6 ------ app/data/stacks/build-support/README.md | 0 2 files changed, 6 deletions(-) create mode 100644 app/data/stacks/build-support/README.md diff --git a/app/base.py b/app/base.py index 940d488f..f6cf0650 100644 --- a/app/base.py +++ b/app/base.py @@ -69,9 +69,3 @@ class package_registry_stack(base_stack): def get_url(self): return self.url - -# Temporary helper functions while we figure out a good interface to the stack deploy code - - -def _get_stack_mapped_port(stack, service, exposed_port): - return 3000 diff --git a/app/data/stacks/build-support/README.md b/app/data/stacks/build-support/README.md new file mode 100644 index 00000000..e69de29b From 42696f8165d903f40154f02d61daedb19771c10a Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 23 Feb 2023 07:22:46 -0700 Subject: [PATCH 0276/1010] Add build stack doc Former-commit-id: 187c06ef5a25e0d02527a94a802dd3213a4b417b --- app/data/stacks/build-support/README.md | 30 +++++++++++++++++++++++++ app/data/version.txt | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/app/data/stacks/build-support/README.md b/app/data/stacks/build-support/README.md index e69de29b..9f7a74b4 100644 --- a/app/data/stacks/build-support/README.md +++ b/app/data/stacks/build-support/README.md @@ -0,0 +1,30 @@ +# Build Support Stack + +## Instructions + +JS/TS/NPM builds need an npm registry to store intermediate package artifacts. +This can be supplied by the user (e.g. using a hosted registry or even npmjs.com), or a local registry using gitea can be deployed by stack orchestrator. +To use a user-supplied registry set these environment variables: + +`CERC_NPM_REGISTRY_URL` and +`CERC_NPM_AUTH_TOKEN` + +Leave `CERC_NPM_REGISTRY_URL` un-set to use the local gitea registry. + +### Build support containers +``` +$ laconic-so --stack build-support build-containers +``` +### Deploy Gitea Package Registry + +``` +$ laconic-so --stack package-registry setup-repositories +$ laconic-so --stack package-registry deploy-system up +This is your gitea access token: 84fe66a73698bf11edbdccd0a338236b7d1d5c45. Keep it safe and secure, it can not be fetched again from gitea. +$ export CERC_NPM_AUTH_TOKEN=84fe66a73698bf11edbdccd0a338236b7d1d5c45 +``` +Now npm packages can be built: +### Build npm Packages +``` +$ laconic-so build-npms --include laconic-sdk +``` diff --git a/app/data/version.txt b/app/data/version.txt index 3a48763e..ebda7605 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.20-6c1bedc +v1.0.21-c52f9e6 From e3e96fa75e31de1c46f1634951a7b4c5e1b2454b Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 23 Feb 2023 20:50:20 -0700 Subject: [PATCH 0277/1010] Work around docker uid/gid insanity Former-commit-id: b84a28592df56104fc25ab6337ab5c53bfd658bd --- app/build_npms.py | 6 +++++- .../container-build/cerc-builder-js/Dockerfile | 1 + .../cerc-builder-js/entrypoint.sh | 1 + .../cerc-builder-js/fixup-for-uid.sh | 18 ++++++++++++++++++ 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100755 app/data/container-build/cerc-builder-js/fixup-for-uid.sh diff --git a/app/build_npms.py b/app/build_npms.py index 83f87ede..877916be 100644 --- a/app/build_npms.py +++ b/app/build_npms.py @@ -116,7 +116,11 @@ def command(ctx, include, exclude): if not dry_run: if verbose: print(f"Executing: {build_command}") - envs = {"CERC_NPM_AUTH_TOKEN": npm_registry_url_token} | ({"CERC_SCRIPT_DEBUG": "true"} if debug else {}) + # Originally we used the PEP 584 merge operator: + # envs = {"CERC_NPM_AUTH_TOKEN": npm_registry_url_token} | ({"CERC_SCRIPT_DEBUG": "true"} if debug else {}) + # but that isn't available in Python 3.8 (default in Ubuntu 20) so for now we use dict.update: + envs = {"CERC_NPM_AUTH_TOKEN": npm_registry_url_token} + envs.update({"CERC_SCRIPT_DEBUG": "true"} if debug else {}) try: docker.run(builder_js_image_name, remove=True, diff --git a/app/data/container-build/cerc-builder-js/Dockerfile b/app/data/container-build/cerc-builder-js/Dockerfile index 9f460375..9a1cf680 100644 --- a/app/data/container-build/cerc-builder-js/Dockerfile +++ b/app/data/container-build/cerc-builder-js/Dockerfile @@ -39,6 +39,7 @@ RUN mkdir /scripts COPY build-npm-package.sh /scripts COPY yarn-local-registry-fixup.sh /scripts COPY build-npm-package-local-dependencies.sh /scripts +COPY fixup-for-uid.sh /scripts ENV PATH="${PATH}:/scripts" COPY entrypoint.sh . diff --git a/app/data/container-build/cerc-builder-js/entrypoint.sh b/app/data/container-build/cerc-builder-js/entrypoint.sh index 311cb8cb..cfbce454 100755 --- a/app/data/container-build/cerc-builder-js/entrypoint.sh +++ b/app/data/container-build/cerc-builder-js/entrypoint.sh @@ -1,2 +1,3 @@ #!/bin/sh +/scripts/fixup-for-uid.sh exec "$@" diff --git a/app/data/container-build/cerc-builder-js/fixup-for-uid.sh b/app/data/container-build/cerc-builder-js/fixup-for-uid.sh new file mode 100755 index 00000000..04089d08 --- /dev/null +++ b/app/data/container-build/cerc-builder-js/fixup-for-uid.sh @@ -0,0 +1,18 @@ +#!/bin/bash +# Make the container usable for uid/gid != 1000 +if [[ -n "$CERC_SCRIPT_DEBUG" ]]; then + set -x +fi +current_uid=$(id -u) +current_gid=$(id -g) +user_name="hostuser" +# First check the current uid. If == 1000 then exit, nothing needed because that uid already exists +if [[ ${current_uid} == 1000 ]]; then + exit 0 +fi +# Also exit for root +if [[ ${current_uid} == 0 ]]; then + exit 0 +fi +# Create the user with home dir +useradd -m -d /home/${user_name} -s /bin/bash -g ${current_gid} -u ${current_uid} ${user_name} From 25a755982eb526f1a002abac09ad5ec6d189868d Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 24 Feb 2023 22:14:28 -0700 Subject: [PATCH 0278/1010] Implement new approach: build a uid-specific container Former-commit-id: 6704cd752703159530775718d6d61fdeed027bdb --- app/build_containers.py | 6 ++++-- .../cerc-builder-js/Dockerfile | 18 +++++++++++++++- .../cerc-builder-js/check-uid.sh | 21 +++++++++++++++++++ .../cerc-builder-js/entrypoint.sh | 2 +- .../cerc-builder-js/fixup-for-uid.sh | 18 ---------------- 5 files changed, 43 insertions(+), 22 deletions(-) create mode 100755 app/data/container-build/cerc-builder-js/check-uid.sh delete mode 100755 app/data/container-build/cerc-builder-js/fixup-for-uid.sh diff --git a/app/build_containers.py b/app/build_containers.py index 7ecf4a82..04cecd62 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -83,7 +83,9 @@ def command(ctx, include, exclude): container_build_env = { "CERC_NPM_URL": "http://gitea.local:3000/api/packages/cerc-io/npm/", "CERC_NPM_AUTH_TOKEN": config("CERC_NPM_AUTH_TOKEN", default=""), - "CERC_REPO_BASE_DIR": dev_root_path + "CERC_REPO_BASE_DIR": dev_root_path, + "CERC_HOST_UID": f"{os.getuid()}", + "CERC_HOST_GID": f"{os.getgid()}" } def process_container(container): @@ -106,7 +108,7 @@ def command(ctx, include, exclude): build_command = os.path.join(container_build_dir, "default-build.sh") + f" {container}:local {repo_dir_or_build_dir}" if not dry_run: if verbose: - print(f"Executing: {build_command}") + print(f"Executing: {build_command} with environment: {container_build_env}") build_result = subprocess.run(build_command, shell=True, env=container_build_env) if verbose: print(f"Return code is: {build_result.returncode}") diff --git a/app/data/container-build/cerc-builder-js/Dockerfile b/app/data/container-build/cerc-builder-js/Dockerfile index 9a1cf680..fb7043c9 100644 --- a/app/data/container-build/cerc-builder-js/Dockerfile +++ b/app/data/container-build/cerc-builder-js/Dockerfile @@ -1,14 +1,30 @@ # Originally from: https://github.com/devcontainers/images/blob/main/src/javascript-node/.devcontainer/Dockerfile +# Which depends on: https://github.com/nodejs/docker-node/blob/main/Dockerfile-debian.template # [Choice] Node.js version (use -bullseye variants on local arm64/Apple Silicon): 18, 16, 14, 18-bullseye, 16-bullseye, 14-bullseye, 18-buster, 16-buster, 14-buster ARG VARIANT=16-bullseye FROM node:${VARIANT} +# Set these args to change the uid/gid for the base container's "node" user to match that of the host user (so bind mounts work as expected). +ARG CERC_HOST_UID=1000 +ARG CERC_HOST_GID=1000 +# Make these values available at runtime to allow a consistency check. +ENV HOST_UID=${CERC_HOST_UID} +ENV HOST_GID=${CERC_HOST_GID} + ARG USERNAME=node ARG NPM_GLOBAL=/usr/local/share/npm-global # Add NPM global to PATH. ENV PATH=${NPM_GLOBAL}/bin:${PATH} +RUN \ + if [ ${CERC_HOST_GID} -ne 1000 ] ; then \ + groupmod -g ${CERC_HOST_GID} ${USERNAME} ; \ + fi \ + && if [ ${CERC_HOST_UID} -ne 1000 ] ; then \ + usermod -u ${CERC_HOST_UID} -g ${CERC_HOST_GID} ${USERNAME} ; \ + fi + RUN \ # Configure global npm install location, use group to adapt to UID/GID changes if ! cat /etc/group | grep -e "^npm:" > /dev/null 2>&1; then groupadd -r npm; fi \ @@ -39,7 +55,7 @@ RUN mkdir /scripts COPY build-npm-package.sh /scripts COPY yarn-local-registry-fixup.sh /scripts COPY build-npm-package-local-dependencies.sh /scripts -COPY fixup-for-uid.sh /scripts +COPY check-uid.sh /scripts ENV PATH="${PATH}:/scripts" COPY entrypoint.sh . diff --git a/app/data/container-build/cerc-builder-js/check-uid.sh b/app/data/container-build/cerc-builder-js/check-uid.sh new file mode 100755 index 00000000..a8cbc324 --- /dev/null +++ b/app/data/container-build/cerc-builder-js/check-uid.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# Make the container usable for uid/gid != 1000 +if [[ -n "$CERC_SCRIPT_DEBUG" ]]; then + set -x +fi +current_uid=$(id -u) +current_gid=$(id -g) +# Don't check if running as root +if [[ ${current_uid} == 0 ]]; then + exit 0 +fi +# Check the current uid/gid vs the uid/gid used to build the container. +# We do this because both bind mounts and npm tooling require the uid/gid to match. +if [[ ${current_gid} != ${HOST_GID} ]]; then + echo "Warning: running with gid: ${current_gid} which is not the gid for which this container was built (${HOST_GID})" + exit 0 +fi +if [[ ${current_uid} != ${HOST_UID} ]]; then + echo "Warning: running with gid: ${current_uid} which is not the uid for which this container was built (${HOST_UID})" + exit 0 +fi diff --git a/app/data/container-build/cerc-builder-js/entrypoint.sh b/app/data/container-build/cerc-builder-js/entrypoint.sh index cfbce454..ab80737a 100755 --- a/app/data/container-build/cerc-builder-js/entrypoint.sh +++ b/app/data/container-build/cerc-builder-js/entrypoint.sh @@ -1,3 +1,3 @@ #!/bin/sh -/scripts/fixup-for-uid.sh +/scripts/check-uid.sh exec "$@" diff --git a/app/data/container-build/cerc-builder-js/fixup-for-uid.sh b/app/data/container-build/cerc-builder-js/fixup-for-uid.sh deleted file mode 100755 index 04089d08..00000000 --- a/app/data/container-build/cerc-builder-js/fixup-for-uid.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -# Make the container usable for uid/gid != 1000 -if [[ -n "$CERC_SCRIPT_DEBUG" ]]; then - set -x -fi -current_uid=$(id -u) -current_gid=$(id -g) -user_name="hostuser" -# First check the current uid. If == 1000 then exit, nothing needed because that uid already exists -if [[ ${current_uid} == 1000 ]]; then - exit 0 -fi -# Also exit for root -if [[ ${current_uid} == 0 ]]; then - exit 0 -fi -# Create the user with home dir -useradd -m -d /home/${user_name} -s /bin/bash -g ${current_gid} -u ${current_uid} ${user_name} From 467ff235baf3894bed78f081561a8710ec236734 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 24 Feb 2023 22:26:02 -0700 Subject: [PATCH 0279/1010] Propagate build env vars Former-commit-id: 5022e355ed9a88658e786a569ff1069ad31ecb56 --- app/data/container-build/default-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/container-build/default-build.sh b/app/data/container-build/default-build.sh index 3d5d9919..c52dd043 100755 --- a/app/data/container-build/default-build.sh +++ b/app/data/container-build/default-build.sh @@ -11,4 +11,4 @@ fi image_tag=$1 build_dir=$2 echo "Building ${image_tag} in ${build_dir}" -docker build -t ${image_tag} ${build_dir} +docker build -t ${image_tag} --build-arg CERC_HOST_UID=${CERC_HOST_UID} --build-arg CERC_HOST_GID=${CERC_HOST_GID} ${build_dir} From 9480b4082eeac25e55bbc68a538c65109a820ed4 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 24 Feb 2023 22:44:50 -0700 Subject: [PATCH 0280/1010] usermod does not change group ownership of home dir Former-commit-id: 17355c9e4292a042e7c8416aafafb044e0fde3e2 --- app/data/container-build/cerc-builder-js/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/container-build/cerc-builder-js/Dockerfile b/app/data/container-build/cerc-builder-js/Dockerfile index fb7043c9..35c9a972 100644 --- a/app/data/container-build/cerc-builder-js/Dockerfile +++ b/app/data/container-build/cerc-builder-js/Dockerfile @@ -22,7 +22,7 @@ RUN \ groupmod -g ${CERC_HOST_GID} ${USERNAME} ; \ fi \ && if [ ${CERC_HOST_UID} -ne 1000 ] ; then \ - usermod -u ${CERC_HOST_UID} -g ${CERC_HOST_GID} ${USERNAME} ; \ + usermod -u ${CERC_HOST_UID} -g ${CERC_HOST_GID} ${USERNAME} && chown ${CERC_HOST_UID}:${CERC_HOST_GID} /home/${USERNAME} ; \ fi RUN \ From ca40ffb01270fb8bf25ea6b17435d61a78b5bfa5 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 24 Feb 2023 23:31:17 -0700 Subject: [PATCH 0281/1010] Revert move to BuildKit in new Docker releases Former-commit-id: ced6925e02039b03ef5ae2f628cf530fbf8fe43e --- app/build_containers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/build_containers.py b/app/build_containers.py index 04cecd62..5b85f5bf 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -85,7 +85,8 @@ def command(ctx, include, exclude): "CERC_NPM_AUTH_TOKEN": config("CERC_NPM_AUTH_TOKEN", default=""), "CERC_REPO_BASE_DIR": dev_root_path, "CERC_HOST_UID": f"{os.getuid()}", - "CERC_HOST_GID": f"{os.getgid()}" + "CERC_HOST_GID": f"{os.getgid()}", + "DOCKER_BUILDKIT": "0" } def process_container(container): From 430b884d7259db6d6c012bad101ebde7783d2a6a Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 28 Feb 2023 08:01:36 -0700 Subject: [PATCH 0282/1010] Update version Former-commit-id: 2f29e283dec1a59733100d1856f5824826a163e1 --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index ebda7605..08854ea9 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.21-c52f9e6 +v1.0.22-4fdb442 From 69b6b9a873b206a0571eea66a3aae95987edf811 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 28 Feb 2023 08:47:02 -0700 Subject: [PATCH 0283/1010] Make cluster/docker-compose project name unique Former-commit-id: a1fdeac3b7d48d78437fe367fb36c4761c70c91e --- app/deploy_system.py | 7 +++++-- cli.py | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/deploy_system.py b/app/deploy_system.py index bff573bd..502e0126 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -151,10 +151,13 @@ def _make_cluster_context(ctx, include, exclude, cluster): compose_dir = Path(__file__).absolute().parent.joinpath("data", "compose") if cluster is None: - # Create default unique, stable cluster name from confile file path + # Create default unique, stable cluster name from confile file path and stack name if provided # TODO: change this to the config file path path = os.path.realpath(sys.argv[0]) - hash = hashlib.md5(path.encode()).hexdigest() + unique_cluster_descriptor = f"{path},{ctx.stack},{include},{exclude}" + if ctx.debug: + print(f"pre-hash descriptor: {unique_cluster_descriptor}") + hash = hashlib.md5(unique_cluster_descriptor.encode()).hexdigest() cluster = f"laconic-{hash}" if ctx.verbose: print(f"Using cluster name: {cluster}") diff --git a/cli.py b/cli.py index 04ecd738..72b3ba01 100644 --- a/cli.py +++ b/cli.py @@ -55,5 +55,6 @@ def cli(ctx, stack, quiet, verbose, dry_run, local_stack, debug, continue_on_err cli.add_command(setup_repositories.command, "setup-repositories") cli.add_command(build_containers.command, "build-containers") cli.add_command(build_npms.command, "build-npms") +cli.add_command(deploy_system.command, "deploy") # deploy is an alias for deploy-system cli.add_command(deploy_system.command, "deploy-system") cli.add_command(version.command, "version") From 70d34e67514383ef2ba28667a4f3864f1ba1df0e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 28 Feb 2023 10:22:27 -0700 Subject: [PATCH 0284/1010] Pass uid and gid to compose Former-commit-id: cea4e5a51f42c01e0e6a4edf8de6ee47400ade1a --- app/deploy_system.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/deploy_system.py b/app/deploy_system.py index 502e0126..d90f042f 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -76,8 +76,10 @@ def command(ctx, include, exclude, cluster, command, extra_args): service_name = extra_args_list[0] command_to_exec = extra_args_list[1:] container_exec_env = { - "CERC_SCRIPT_DEBUG": "true" - } if debug else {} + "CERC_HOST_UID": f"{os.getuid()}", + "CERC_HOST_GID": f"{os.getgid()}" + } + container_exec_env.update({"CERC_SCRIPT_DEBUG": "true"} if debug else {}) if verbose: print(f"Running compose exec {service_name} {command_to_exec}") docker.compose.execute(service_name, command_to_exec, envs=container_exec_env) From c3101bc25a1f294635a2c2802d43a7ddc7d9cf77 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 2 Mar 2023 10:32:18 -0700 Subject: [PATCH 0285/1010] Remove debug output Former-commit-id: f99dbfbdf57217b88cc0ec9e1d6a1cbcccb2ce5c --- app/data/container-build/cerc-laconic-registry-cli/Dockerfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/data/container-build/cerc-laconic-registry-cli/Dockerfile b/app/data/container-build/cerc-laconic-registry-cli/Dockerfile index 3341da79..ba22a5c9 100644 --- a/app/data/container-build/cerc-laconic-registry-cli/Dockerfile +++ b/app/data/container-build/cerc-laconic-registry-cli/Dockerfile @@ -48,9 +48,6 @@ RUN npm config set @lirewine:registry ${CERC_NPM_URL} \ # TODO: the image at this point could be made a base image for several different CLI images # that install different Node-based CLI commands -# DEBUG, remove -RUN yarn info @cerc-io/laconic-registry-cli - # Globally install the cli package RUN yarn global add @cerc-io/laconic-registry-cli From f0b711912a621f25fc1a721662ae60839120debe Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 2 Mar 2023 10:53:48 -0700 Subject: [PATCH 0286/1010] Pass environment variables for both exec and up Former-commit-id: be6a47377238596ad3c3f615d62d652be7c358a0 --- app/deploy_system.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/app/deploy_system.py b/app/deploy_system.py index d90f042f..2d58967e 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -56,10 +56,11 @@ def command(ctx, include, exclude, cluster, command, extra_args): if not dry_run: if command == "up": - if debug: - os.environ["CERC_SCRIPT_DEBUG"] = "true" + container_exec_env = _make_runtime_env(ctx.obj) + for attr, value in container_exec_env.items(): + os.environ[attr] = value if verbose: - print(f"Running compose up for extra_args: {extra_args_list}") + print(f"Running compose up with container_exec_env: {container_exec_env}, extra_args: {extra_args_list}") for pre_start_command in cluster_context.pre_start_commands: _run_command(ctx.obj, cluster_context.cluster, pre_start_command) docker.compose.up(detach=True, services=extra_args_list) @@ -75,11 +76,7 @@ def command(ctx, include, exclude, cluster, command, extra_args): sys.exit(1) service_name = extra_args_list[0] command_to_exec = extra_args_list[1:] - container_exec_env = { - "CERC_HOST_UID": f"{os.getuid()}", - "CERC_HOST_GID": f"{os.getgid()}" - } - container_exec_env.update({"CERC_SCRIPT_DEBUG": "true"} if debug else {}) + container_exec_env = _make_runtime_env(ctx.obj) if verbose: print(f"Running compose exec {service_name} {command_to_exec}") docker.compose.execute(service_name, command_to_exec, envs=container_exec_env) @@ -141,6 +138,15 @@ def get_stack_status(ctx, stack): False +def _make_runtime_env(ctx): + container_exec_env = { + "CERC_HOST_UID": f"{os.getuid()}", + "CERC_HOST_GID": f"{os.getgid()}" + } + container_exec_env.update({"CERC_SCRIPT_DEBUG": "true"} if ctx.debug else {}) + return container_exec_env + + def _make_cluster_context(ctx, include, exclude, cluster): if ctx.local_stack: From eb70f2526ea59e53d1b2cf5f9661e70c2a11e631 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sat, 4 Mar 2023 18:45:57 -0700 Subject: [PATCH 0287/1010] Initial commit Former-commit-id: 49c524e8edc27db89f79a13bbe19a8ece221372e --- app/data/compose/docker-compose-fixturenet-laconicd.yml | 5 ++++- .../fixturenet-laconicd/registry-cli-config-template.yml | 7 +++++++ .../container-build/cerc-laconic-registry-cli/Dockerfile | 4 +++- .../cerc-laconic-registry-cli/configure-key.sh | 2 ++ app/deploy_system.py | 2 +- 5 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 app/data/config/fixturenet-laconicd/registry-cli-config-template.yml create mode 100644 app/data/container-build/cerc-laconic-registry-cli/configure-key.sh diff --git a/app/data/compose/docker-compose-fixturenet-laconicd.yml b/app/data/compose/docker-compose-fixturenet-laconicd.yml index 997063db..cfbc574f 100644 --- a/app/data/compose/docker-compose-fixturenet-laconicd.yml +++ b/app/data/compose/docker-compose-fixturenet-laconicd.yml @@ -18,4 +18,7 @@ services: - "9090" - "9091" - "1317" - + cli: + image: cerc/laconic-registry-cli:local + volumes: + - ../config/fixturenet-laconicd/registry-cli-config-template.yml:/registry-cli-config-template.yml diff --git a/app/data/config/fixturenet-laconicd/registry-cli-config-template.yml b/app/data/config/fixturenet-laconicd/registry-cli-config-template.yml new file mode 100644 index 00000000..6074cc6d --- /dev/null +++ b/app/data/config/fixturenet-laconicd/registry-cli-config-template.yml @@ -0,0 +1,7 @@ +services: + cns: + restEndpoint: 'http://laconicd:1317' + gqlEndpoint: 'http://laconicd:9473/api' + userKey: REPLACE_WITH_MYKEY + bondId: + chainId: laconic_9000-1 diff --git a/app/data/container-build/cerc-laconic-registry-cli/Dockerfile b/app/data/container-build/cerc-laconic-registry-cli/Dockerfile index ba22a5c9..d7042207 100644 --- a/app/data/container-build/cerc-laconic-registry-cli/Dockerfile +++ b/app/data/container-build/cerc-laconic-registry-cli/Dockerfile @@ -51,4 +51,6 @@ RUN npm config set @lirewine:registry ${CERC_NPM_URL} \ # Globally install the cli package RUN yarn global add @cerc-io/laconic-registry-cli -ENTRYPOINT ["laconic"] +# Default command sleeps forever so docker doesn't kill it +CMD ["sh", "-c", "while :; do sleep 600; done"] + diff --git a/app/data/container-build/cerc-laconic-registry-cli/configure-key.sh b/app/data/container-build/cerc-laconic-registry-cli/configure-key.sh new file mode 100644 index 00000000..3bafec4b --- /dev/null +++ b/app/data/container-build/cerc-laconic-registry-cli/configure-key.sh @@ -0,0 +1,2 @@ +#!/bin/sh +sed 's/REPLACE_WITH_MYKEY/'${1}'/' registry-cli-config-template.yml > config.yml diff --git a/app/deploy_system.py b/app/deploy_system.py index 2d58967e..7001236f 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -75,7 +75,7 @@ def command(ctx, include, exclude, cluster, command, extra_args): print("Usage: exec ") sys.exit(1) service_name = extra_args_list[0] - command_to_exec = extra_args_list[1:] + command_to_exec = ["sh", "-c"] + extra_args_list[1:] container_exec_env = _make_runtime_env(ctx.obj) if verbose: print(f"Running compose exec {service_name} {command_to_exec}") From e801c28f60f38411d48ebfb7e5dab9e043ba2c96 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 6 Mar 2023 15:19:19 -0700 Subject: [PATCH 0288/1010] Add foundry cli to fixturenet-eth Former-commit-id: b43886a1a9863706a7a36573d66a98f665c86859 --- app/data/compose/docker-compose-foundry.yml | 5 +++++ app/data/pod-list.txt | 1 + app/data/stacks/fixturenet-eth/stack.yml | 1 + 3 files changed, 7 insertions(+) create mode 100644 app/data/compose/docker-compose-foundry.yml diff --git a/app/data/compose/docker-compose-foundry.yml b/app/data/compose/docker-compose-foundry.yml new file mode 100644 index 00000000..c55bda69 --- /dev/null +++ b/app/data/compose/docker-compose-foundry.yml @@ -0,0 +1,5 @@ +# Add-on pod to include foundry tooling within a fixturenet +services: + foundry: + image: ghcr.io/foundry-rs/foundry:latest + command: ["while :; do sleep 600; done"] diff --git a/app/data/pod-list.txt b/app/data/pod-list.txt index 81ec9e99..ac36a9af 100644 --- a/app/data/pod-list.txt +++ b/app/data/pod-list.txt @@ -19,3 +19,4 @@ eth-probe keycloak tx-spammer kubo +foundry diff --git a/app/data/stacks/fixturenet-eth/stack.yml b/app/data/stacks/fixturenet-eth/stack.yml index 500ae186..f6c95e17 100644 --- a/app/data/stacks/fixturenet-eth/stack.yml +++ b/app/data/stacks/fixturenet-eth/stack.yml @@ -11,3 +11,4 @@ containers: - cerc/fixturenet-eth-lighthouse pods: - fixturenet-eth + - foundry From 178de8f496af455f97015f5876c3021b0fb0e95f Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 7 Mar 2023 09:07:15 -0700 Subject: [PATCH 0289/1010] Add simple export/import scheme Former-commit-id: 277be07dcd2bc4473c963119eb5d47d9739b0c21 --- .../container-build/cerc-laconic-registry-cli/Dockerfile | 6 +++++- .../{configure-key.sh => import-key.sh} | 0 app/data/container-build/cerc-laconicd/export-mykey.sh | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) rename app/data/container-build/cerc-laconic-registry-cli/{configure-key.sh => import-key.sh} (100%) create mode 100644 app/data/container-build/cerc-laconicd/export-mykey.sh diff --git a/app/data/container-build/cerc-laconic-registry-cli/Dockerfile b/app/data/container-build/cerc-laconic-registry-cli/Dockerfile index d7042207..bc772d49 100644 --- a/app/data/container-build/cerc-laconic-registry-cli/Dockerfile +++ b/app/data/container-build/cerc-laconic-registry-cli/Dockerfile @@ -51,6 +51,10 @@ RUN npm config set @lirewine:registry ${CERC_NPM_URL} \ # Globally install the cli package RUN yarn global add @cerc-io/laconic-registry-cli +# Add scripts +RUN mkdir /scripts +ENV PATH="${PATH}:/scripts" +COPY ./import.key.sh /scripts + # Default command sleeps forever so docker doesn't kill it CMD ["sh", "-c", "while :; do sleep 600; done"] - diff --git a/app/data/container-build/cerc-laconic-registry-cli/configure-key.sh b/app/data/container-build/cerc-laconic-registry-cli/import-key.sh similarity index 100% rename from app/data/container-build/cerc-laconic-registry-cli/configure-key.sh rename to app/data/container-build/cerc-laconic-registry-cli/import-key.sh diff --git a/app/data/container-build/cerc-laconicd/export-mykey.sh b/app/data/container-build/cerc-laconicd/export-mykey.sh new file mode 100644 index 00000000..a32ac2e6 --- /dev/null +++ b/app/data/container-build/cerc-laconicd/export-mykey.sh @@ -0,0 +1,2 @@ +#!/bin/sh +echo y | docker compose exec laconicd laconicd keys export mykey --unarmored-hex --unsafe From 6ae3c252ea64304496a25a47a922ee9a46dfade6 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 7 Mar 2023 10:08:04 -0700 Subject: [PATCH 0290/1010] Very basic key export/import implementation Former-commit-id: 8a8fef6845edbbde34e561bb1b613df1c5a9cc9b --- app/data/compose/docker-compose-fixturenet-laconicd.yml | 3 ++- app/data/config/fixturenet-laconicd/export-mykey.sh | 2 ++ app/data/container-build/cerc-laconic-registry-cli/Dockerfile | 2 +- app/data/container-build/cerc-laconicd/export-mykey.sh | 2 -- 4 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 app/data/config/fixturenet-laconicd/export-mykey.sh delete mode 100644 app/data/container-build/cerc-laconicd/export-mykey.sh diff --git a/app/data/compose/docker-compose-fixturenet-laconicd.yml b/app/data/compose/docker-compose-fixturenet-laconicd.yml index cfbc574f..9663e7f0 100644 --- a/app/data/compose/docker-compose-fixturenet-laconicd.yml +++ b/app/data/compose/docker-compose-fixturenet-laconicd.yml @@ -5,8 +5,9 @@ services: image: cerc/laconicd:local command: ["sh", "/docker-entrypoint-scripts.d/create-fixturenet.sh"] volumes: - # TODO: look at folding this script into the container + # TODO: look at folding these scripts into the container - ../config/fixturenet-laconicd/create-fixturenet.sh:/docker-entrypoint-scripts.d/create-fixturenet.sh + - ../config/fixturenet-laconicd/export-mykey.sh:/docker-entrypoint-scripts.d/export-mykey.sh # TODO: determine which of the ports below is really needed ports: - "6060" diff --git a/app/data/config/fixturenet-laconicd/export-mykey.sh b/app/data/config/fixturenet-laconicd/export-mykey.sh new file mode 100644 index 00000000..1a5be86e --- /dev/null +++ b/app/data/config/fixturenet-laconicd/export-mykey.sh @@ -0,0 +1,2 @@ +#!/bin/sh +echo y | laconicd keys export mykey --unarmored-hex --unsafe diff --git a/app/data/container-build/cerc-laconic-registry-cli/Dockerfile b/app/data/container-build/cerc-laconic-registry-cli/Dockerfile index bc772d49..cef3b36f 100644 --- a/app/data/container-build/cerc-laconic-registry-cli/Dockerfile +++ b/app/data/container-build/cerc-laconic-registry-cli/Dockerfile @@ -54,7 +54,7 @@ RUN yarn global add @cerc-io/laconic-registry-cli # Add scripts RUN mkdir /scripts ENV PATH="${PATH}:/scripts" -COPY ./import.key.sh /scripts +COPY ./import-key.sh /scripts # Default command sleeps forever so docker doesn't kill it CMD ["sh", "-c", "while :; do sleep 600; done"] diff --git a/app/data/container-build/cerc-laconicd/export-mykey.sh b/app/data/container-build/cerc-laconicd/export-mykey.sh deleted file mode 100644 index a32ac2e6..00000000 --- a/app/data/container-build/cerc-laconicd/export-mykey.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -echo y | docker compose exec laconicd laconicd keys export mykey --unarmored-hex --unsafe From a9009456981e1136c64124fd9e1e60755c5eb797 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 7 Mar 2023 10:14:20 -0700 Subject: [PATCH 0291/1010] Update version Former-commit-id: f97b1e4720008df481f73ec07cfffc046a085cd8 --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index 08854ea9..857da7c0 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.22-4fdb442 +v1.0.24-d80fb5d From fae8fbed5e5b62204be19c95bf7cf92f642a787b Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 7 Mar 2023 11:57:24 -0700 Subject: [PATCH 0292/1010] Implement logs command Former-commit-id: b488d82b8f7f750fb93d6176c9b275dd051bb211 --- app/deploy_system.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/deploy_system.py b/app/deploy_system.py index 7001236f..d242fe6e 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -114,7 +114,8 @@ def command(ctx, include, exclude, cluster, command, extra_args): elif command == "logs": if verbose: print("Running compose logs") - docker.compose.logs() + logs_output = docker.compose.logs(services=extra_args_list if extra_args_list != None else []) + print(logs_output) def get_stack_status(ctx, stack): From edd7d549d9d46b422a731b4ccbe4e2ff69152c30 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 7 Mar 2023 16:04:43 -0700 Subject: [PATCH 0293/1010] Update fixturenet-laconicd docs Former-commit-id: 89b33c0e38383221d29955f240eabfc725d9d38a --- app/data/stacks/build-support/README.md | 13 +++-- app/data/stacks/fixturenet-laconicd/README.md | 50 +++++++++++++++---- app/data/stacks/package-registry/README.md | 5 ++ 3 files changed, 55 insertions(+), 13 deletions(-) create mode 100644 app/data/stacks/package-registry/README.md diff --git a/app/data/stacks/build-support/README.md b/app/data/stacks/build-support/README.md index 9f7a74b4..99747f03 100644 --- a/app/data/stacks/build-support/README.md +++ b/app/data/stacks/build-support/README.md @@ -11,20 +11,25 @@ To use a user-supplied registry set these environment variables: Leave `CERC_NPM_REGISTRY_URL` un-set to use the local gitea registry. -### Build support containers +### 1. Build support containers ``` $ laconic-so --stack build-support build-containers ``` -### Deploy Gitea Package Registry +Note that the scheme/gerbil builder container can take a while to build so if you aren't going to build scheme projects it can be skipped with: +``` +$ laconic-so --stack build-support build-containers --exclude cerc/builder-gerbil +``` +### 2. Deploy Gitea Package Registry ``` $ laconic-so --stack package-registry setup-repositories -$ laconic-so --stack package-registry deploy-system up +$ laconic-so --stack package-registry deploy up This is your gitea access token: 84fe66a73698bf11edbdccd0a338236b7d1d5c45. Keep it safe and secure, it can not be fetched again from gitea. -$ export CERC_NPM_AUTH_TOKEN=84fe66a73698bf11edbdccd0a338236b7d1d5c45 ``` Now npm packages can be built: ### Build npm Packages +Ensure that `CERC_NPM_AUTH_TOKEN` is set with the token printed above when the package-registry stack was deployed (the actual token value will be different than shown in this example): ``` +$ export CERC_NPM_AUTH_TOKEN=84fe66a73698bf11edbdccd0a338236b7d1d5c45 $ laconic-so build-npms --include laconic-sdk ``` diff --git a/app/data/stacks/fixturenet-laconicd/README.md b/app/data/stacks/fixturenet-laconicd/README.md index 7fdc2003..80903b7e 100644 --- a/app/data/stacks/fixturenet-laconicd/README.md +++ b/app/data/stacks/fixturenet-laconicd/README.md @@ -1,18 +1,50 @@ # Laconicd Fixturenet -Instructions for deploying a local Laconic blockchain "fixturenet" for development and testing purposes using laconic-stack-orchestrator (the installation of which is covered [here](https://github.com/cerc-io/stack-orchestrator#user-mode)): +Instructions for deploying a local Laconic blockchain "fixturenet" for development and testing purposes using laconic-stack-orchestrator. -## Clone required repositories +## 1. Install Laconic Stack Orchestrator +Installation is covered in detail [here](https://github.com/cerc-io/stack-orchestrator#user-mode) but if you're on Linux and already have docker installed it should be as simple as: ``` -$ laconic-so setup-repositories --include cerc-io/laconicd,cerc-io/laconic-sdk,cerc-io/laconic-registry-cli +$ mkdir my-working-dir +$ cd my-working-dir +$ curl -L -o ./laconic-so https://github.com/cerc-io/stack-orchestrator/releases/latest/download/laconic-so +$ chmod +x ./laconic-so +$ export PATH=$PATH:$(pwd) # Or move laconic-so to ~/bin or your favorite on-path directory ``` -## Build the laconicd container +## 2. Prepare the local build environment +Note that this step needs only to be done once on a new machine. +Detailed instructions can be found [here](../build-support/README.md). For the impatient run these commands: ``` -$ laconic-so build-containers --include cerc/laconicd +$ laconic-so --stack build-support build-containers --exclude cerc/builder-gerbil +$ laconic-so --stack package-registry setup-repositories +$ laconic-so --stack package-registry deploy-system up ``` -This should create a container with tag `cerc/laconicd` in the local image registry. -## Deploy the stack +Then add the localhost alias `gitea.local` and set `CERC_NPM_AUTH_TOKEN` to the token printed when the package-registry stack was deployed above: ``` -$ laconic-so deploy-system --include fixturenet-laconicd up +$ sudo vi /etc/hosts +$ export CERC_NPM_AUTH_TOKEN= +``` + +## 3. Clone required repositories +``` +$ laconic-so --stack fixturenet-laconicd setup-repositories +``` +## 4. Build the stack's packages and containers +``` +$ laconic-so --stack fixturenet-laconicd build-npms +$ laconic-so --stack fixturenet-laconicd build-containers +``` +## 5. Deploy the stack +``` +$ laconic-so --stack fixturenet-laconicd deploy up +``` +Correct operation should be verified by checking the laconicd container's logs with: +``` +$ laconic-so --stack fixturenet-laconicd deploy logs +``` +## 6. Test with the Registry CLI +``` +$ laconic-so --stack fixturenet-laconicd deploy exec laconicd "sh /docker-entrypoint-scripts.d/export-mykey.sh" +$ laconic-so --stack fixturenet-laconicd deploy exec cli "sh /scripts/import-key.sh xxxxxxxxxxxxxxxxxxxxxxx" +$ laconic-so --stack fixturenet-laconicd deploy exec cli "laconic cns status" ``` -Correct operation should be verified by checking the laconicd container's log. diff --git a/app/data/stacks/package-registry/README.md b/app/data/stacks/package-registry/README.md new file mode 100644 index 00000000..ddb36a3f --- /dev/null +++ b/app/data/stacks/package-registry/README.md @@ -0,0 +1,5 @@ +# Package Registry Stack + +The Package Registry Stack supports a build environment that requires a package registry (initially for NPM packages only). + +Setup instructions can be found [here](../build-support/README.md). From f57b8b4ba0fe7f509a98d554e82ba0fc64281144 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 8 Mar 2023 17:03:14 -0700 Subject: [PATCH 0294/1010] Add very basic cluster config mechanism Former-commit-id: 9cae493458f15c9528b45bc116d2d7563263ef8f --- app/data/stacks/fixturenet-laconicd/stack.yml | 3 + app/data/version.txt | 2 +- app/deploy_system.py | 56 ++++++++++++++++++- 3 files changed, 57 insertions(+), 4 deletions(-) diff --git a/app/data/stacks/fixturenet-laconicd/stack.yml b/app/data/stacks/fixturenet-laconicd/stack.yml index fca9623f..86fb2144 100644 --- a/app/data/stacks/fixturenet-laconicd/stack.yml +++ b/app/data/stacks/fixturenet-laconicd/stack.yml @@ -13,3 +13,6 @@ containers: - cerc/laconic-registry-cli pods: - fixturenet-laconicd +config: + cli: + key: laconicd.mykey diff --git a/app/data/version.txt b/app/data/version.txt index 857da7c0..e9137861 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.24-d80fb5d +v1.0.25-75376d7 diff --git a/app/deploy_system.py b/app/deploy_system.py index d242fe6e..951e3758 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -19,6 +19,7 @@ import hashlib import copy import os import sys +from dataclasses import dataclass from decouple import config import subprocess from python_on_whales import DockerClient @@ -66,6 +67,9 @@ def command(ctx, include, exclude, cluster, command, extra_args): docker.compose.up(detach=True, services=extra_args_list) for post_start_command in cluster_context.post_start_commands: _run_command(ctx.obj, cluster_context.cluster, post_start_command) + + _orchestrate_cluster_config(ctx.obj, cluster_context.config, docker, container_exec_env) + elif command == "down": if verbose: print("Running compose down") @@ -114,7 +118,7 @@ def command(ctx, include, exclude, cluster, command, extra_args): elif command == "logs": if verbose: print("Running compose logs") - logs_output = docker.compose.logs(services=extra_args_list if extra_args_list != None else []) + logs_output = docker.compose.logs(services=extra_args_list if extra_args_list is not None else []) print(logs_output) @@ -219,15 +223,18 @@ def _make_cluster_context(ctx, include, exclude, cluster): if ctx.verbose: print(f"files: {compose_files}") - return cluster_context(cluster, compose_files, pre_start_commands, post_start_commands) + cluster_config = stack_config['config'] if 'config' in stack_config else None + + return cluster_context(cluster, compose_files, pre_start_commands, post_start_commands, cluster_config) class cluster_context: - def __init__(self, cluster, compose_files, pre_start_commands, post_start_commands) -> None: + def __init__(self, cluster, compose_files, pre_start_commands, post_start_commands, config) -> None: self.cluster = cluster self.compose_files = compose_files self.pre_start_commands = pre_start_commands self.post_start_commands = post_start_commands + self.config = config def _convert_to_new_format(old_pod_array): @@ -258,3 +265,46 @@ def _run_command(ctx, cluster_name, command): if command_result.returncode != 0: print(f"FATAL Error running command: {command}") sys.exit(1) + + +def _orchestrate_cluster_config(ctx, cluster_config, docker, container_exec_env): + + @dataclass + class ConfigDirective: + source_container: str + source_variable: str + destination_container: str + destination_variable: str + + + if cluster_config is not None: + for container in cluster_config: + container_config = cluster_config[container] + if ctx.verbose: + print(f"{container} config: {container_config}") + for directive in container_config: + pd = ConfigDirective( + container_config[directive].split(".")[0], + container_config[directive].split(".")[1], + container, + directive + ) + if ctx.verbose: + print(f"Setting {pd.destination_container}.{pd.destination_variable} = {pd.source_container}.{pd.source_variable}") + # TODO: fix the script paths so they're consistent between containers + source_value = docker.compose.execute(pd.source_container, + ["sh", "-c", + f"sh /docker-entrypoint-scripts.d/export-{pd.source_variable}.sh"], + tty=False, + envs=container_exec_env) + # TODO: handle the case that the value is not yet available + if ctx.debug: + print(f"fetched source value: {source_value}") + destination_output = docker.compose.execute(pd.destination_container, + ["sh", "-c", + f"sh /scripts/import-{pd.destination_variable}.sh {pd.source_variable}"], + tty=False, + envs=container_exec_env) + if ctx.debug: + print(f"destination output: {destination_output}") + # TODO: detect errors here From 4fd9e71c84e01241df77c0e259a3bb2fa5fa2a71 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 8 Mar 2023 22:22:43 -0700 Subject: [PATCH 0295/1010] Configure foundry container Former-commit-id: b708bb212279deb5475fdca6a0e01d74bbfd8e6e --- app/data/compose/docker-compose-foundry.yml | 2 ++ .../scripts/status.sh | 2 +- app/data/stacks/fixturenet-eth/README.md | 29 ++++++++++--------- app/deploy_system.py | 7 +++-- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/app/data/compose/docker-compose-foundry.yml b/app/data/compose/docker-compose-foundry.yml index c55bda69..bbd778ec 100644 --- a/app/data/compose/docker-compose-foundry.yml +++ b/app/data/compose/docker-compose-foundry.yml @@ -3,3 +3,5 @@ services: foundry: image: ghcr.io/foundry-rs/foundry:latest command: ["while :; do sleep 600; done"] + volumes: + - ../config/foundry/foundry.toml:/foundry.toml \ No newline at end of file diff --git a/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh index faca9a49..c6e65a68 100755 --- a/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh +++ b/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh @@ -24,7 +24,7 @@ if [ -z "$GETH_BASE_URL" ]; then fi function inc_status() { - echo " DONE!" + echo " done" STATUS=$((STATUS + 1)) if [ $STATUS -lt ${#STATUSES[@]} ]; then echo -n "Waiting for ${STATUSES[$STATUS]}..." diff --git a/app/data/stacks/fixturenet-eth/README.md b/app/data/stacks/fixturenet-eth/README.md index a164f078..643e2141 100644 --- a/app/data/stacks/fixturenet-eth/README.md +++ b/app/data/stacks/fixturenet-eth/README.md @@ -26,21 +26,22 @@ $ laconic-so --stack fixturenet-eth deploy-system up ## Check status ``` -$ container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh -Waiting for geth to generate DAG ..................................................... DONE! -Waiting for beacon phase0 .... DONE! -Waiting for beacon altair .... DONE! -Waiting for beacon bellatrix pre-merge .... DONE! -Waiting for beacon bellatrix merge .... DONE! +$ laconic-so --stack fixturenet-eth deploy exec fixturenet-eth-bootnode-lighthouse /scripts/status-internal.sh +Waiting for geth to generate DAG.... done +Waiting for beacon phase0.... done +Waiting for beacon altair.... done +Waiting for beacon bellatrix pre-merge.... done +Waiting for beacon bellatrix merge.... done -$ docker ps -f 'name=laconic' --format 'table {{.Names}}\t{{.Ports}}' | cut -d'-' -f3- | sort -NAMES PORTS -fixturenet-eth-bootnode-geth-1 8545-8546/tcp, 30303/udp, 0.0.0.0:55847->9898/tcp, 0.0.0.0:55848->30303/tcp -fixturenet-eth-bootnode-lighthouse-1 -fixturenet-eth-geth-1-1 8546/tcp, 30303/tcp, 30303/udp, 0.0.0.0:55851->8545/tcp -fixturenet-eth-geth-2-1 8545-8546/tcp, 30303/tcp, 30303/udp -fixturenet-eth-lighthouse-1-1 0.0.0.0:55858->8001/tcp -fixturenet-eth-lighthouse-2-1 +$ laconic-so --stack fixturenet-eth deploy ps +Running containers: +id: c6538b60c0328dadfa2c5585c4d09674a6a13e6d712ff1cd82a26849e4e5679b, name: laconic-b12fa16e999821562937781f8ab0b1e8-fixturenet-eth-bootnode-geth-1, ports: 0.0.0.0:58909->30303/tcp, 0.0.0.0:58910->9898/tcp +id: 5b70597a8211bc7e78d33e50486cb565a7f4a9ce581ce150b3bb450e342bdeda, name: laconic-b12fa16e999821562937781f8ab0b1e8-fixturenet-eth-bootnode-lighthouse-1, ports: +id: 19ed78867b6c534d893835cdeb1e89a9ea553b8e8c02ab02468e4bd1563a340f, name: laconic-b12fa16e999821562937781f8ab0b1e8-fixturenet-eth-geth-1-1, ports: 0.0.0.0:58911->40000/tcp, 0.0.0.0:58912->6060/tcp, 0.0.0.0:58913->8545/tcp +id: 8da0e30a1ce33122d8fd2225e4d26c7f30eb4bfbfa743f2af04d9db5d0bf7fa6, name: laconic-b12fa16e999821562937781f8ab0b1e8-fixturenet-eth-geth-2-1, ports: +id: 387a42a14971034588ba9aeb9b9e2ca7fc0cc61b96f8fe8c2ab770c9d6fb1e0f, name: laconic-b12fa16e999821562937781f8ab0b1e8-fixturenet-eth-lighthouse-1-1, ports: 0.0.0.0:58917->8001/tcp +id: de5115bf89087bae03b291664a73ffe3554fe23e79e4b8345e088b040d5580ac, name: laconic-b12fa16e999821562937781f8ab0b1e8-fixturenet-eth-lighthouse-2-1, ports: +id: 2a7e5a0fb2be7fc9261a7b725a40818facbbe6d0cb2497d82c0e02de0a8e959b, name: laconic-b12fa16e999821562937781f8ab0b1e8-foundry-1, ports: ``` ## Additional pieces diff --git a/app/deploy_system.py b/app/deploy_system.py index 951e3758..dc674848 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -22,7 +22,7 @@ import sys from dataclasses import dataclass from decouple import config import subprocess -from python_on_whales import DockerClient +from python_on_whales import DockerClient, DockerException import click import importlib.resources from pathlib import Path @@ -83,7 +83,10 @@ def command(ctx, include, exclude, cluster, command, extra_args): container_exec_env = _make_runtime_env(ctx.obj) if verbose: print(f"Running compose exec {service_name} {command_to_exec}") - docker.compose.execute(service_name, command_to_exec, envs=container_exec_env) + try: + docker.compose.execute(service_name, command_to_exec, envs=container_exec_env) + except DockerException as error: + print(f"container command returned error exit status") elif command == "port": if extra_args_list is None or len(extra_args_list) < 2: print("Usage: port ") From 49b9983b3af6de660cf09b72905e890e272cc599 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 8 Mar 2023 22:49:00 -0700 Subject: [PATCH 0296/1010] Update doc Former-commit-id: c07f6c51e2de3b9e070d249668339c53c050a888 --- app/data/compose/docker-compose-foundry.yml | 3 ++- app/data/stacks/fixturenet-eth/README.md | 15 +++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/data/compose/docker-compose-foundry.yml b/app/data/compose/docker-compose-foundry.yml index bbd778ec..ed5a018a 100644 --- a/app/data/compose/docker-compose-foundry.yml +++ b/app/data/compose/docker-compose-foundry.yml @@ -4,4 +4,5 @@ services: image: ghcr.io/foundry-rs/foundry:latest command: ["while :; do sleep 600; done"] volumes: - - ../config/foundry/foundry.toml:/foundry.toml \ No newline at end of file + - ../config/foundry/foundry.toml:/foundry.toml + - ./foundry/workspace:/workspace diff --git a/app/data/stacks/fixturenet-eth/README.md b/app/data/stacks/fixturenet-eth/README.md index 643e2141..3aa41dec 100644 --- a/app/data/stacks/fixturenet-eth/README.md +++ b/app/data/stacks/fixturenet-eth/README.md @@ -20,7 +20,7 @@ This should create several container images in the local image registry: ## Deploy the stack ``` -$ laconic-so --stack fixturenet-eth deploy-system up +$ laconic-so --stack fixturenet-eth deploy up ``` ## Check status @@ -42,6 +42,9 @@ id: 8da0e30a1ce33122d8fd2225e4d26c7f30eb4bfbfa743f2af04d9db5d0bf7fa6, name: laco id: 387a42a14971034588ba9aeb9b9e2ca7fc0cc61b96f8fe8c2ab770c9d6fb1e0f, name: laconic-b12fa16e999821562937781f8ab0b1e8-fixturenet-eth-lighthouse-1-1, ports: 0.0.0.0:58917->8001/tcp id: de5115bf89087bae03b291664a73ffe3554fe23e79e4b8345e088b040d5580ac, name: laconic-b12fa16e999821562937781f8ab0b1e8-fixturenet-eth-lighthouse-2-1, ports: id: 2a7e5a0fb2be7fc9261a7b725a40818facbbe6d0cb2497d82c0e02de0a8e959b, name: laconic-b12fa16e999821562937781f8ab0b1e8-foundry-1, ports: + +$ laconic-so --stack fixturenet-eth deploy exec foundry "cast block-number" +3 ``` ## Additional pieces @@ -70,11 +73,11 @@ $ laconic-so deploy-system --include db,fixturenet-eth,ipld-eth-server,ipld-eth- # Status $ container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh -Waiting for geth to generate DAG.... DONE! -Waiting for beacon phase0.... DONE! -Waiting for beacon altair.... DONE! -Waiting for beacon bellatrix pre-merge.... DONE! -Waiting for beacon bellatrix merge.... DONE! +Waiting for geth to generate DAG.... done +Waiting for beacon phase0.... done +Waiting for beacon altair.... done +Waiting for beacon bellatrix pre-merge.... done +Waiting for beacon bellatrix merge.... done $ docker ps -f 'name=laconic' --format 'table {{.Names}}\t{{.Ports}}' | cut -d'-' -f3- | sort NAMES PORTS From f096c014ce1b8682e91edec1caa19a465f03f5f5 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 9 Mar 2023 06:43:51 -0700 Subject: [PATCH 0297/1010] Add omitted file Former-commit-id: a3440ad05bc41e4fcdcf739dfa75d032fb5c8f2f --- app/data/config/foundry/foundry.toml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/data/config/foundry/foundry.toml diff --git a/app/data/config/foundry/foundry.toml b/app/data/config/foundry/foundry.toml new file mode 100644 index 00000000..933f895c --- /dev/null +++ b/app/data/config/foundry/foundry.toml @@ -0,0 +1,2 @@ +[profile.default] +eth-rpc-url = "http://fixturenet-eth-geth-1:8545" From 030ad25b78fd5b603ad2ef5e6aa3c5f06a3073e6 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 9 Mar 2023 08:30:18 -0700 Subject: [PATCH 0298/1010] Fix for #212 - exception on non-stack deploy Former-commit-id: ecc4302c3441981840395b4c68eb03f11861a9dd --- app/deploy_system.py | 5 ++--- tests/smoke-test/run-smoke-test.sh | 7 +++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/deploy_system.py b/app/deploy_system.py index 951e3758..e1b25f31 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -185,8 +185,10 @@ def _make_cluster_context(ctx, include, exclude, cluster): stack_config = get_parsed_stack_config(ctx.stack) # TODO: syntax check the input here pods_in_scope = stack_config['pods'] + cluster_config = stack_config['config'] if 'config' in stack_config else None else: pods_in_scope = all_pods + cluster_config = None # Convert all pod definitions to v1.1 format pods_in_scope = _convert_to_new_format(pods_in_scope) @@ -223,8 +225,6 @@ def _make_cluster_context(ctx, include, exclude, cluster): if ctx.verbose: print(f"files: {compose_files}") - cluster_config = stack_config['config'] if 'config' in stack_config else None - return cluster_context(cluster, compose_files, pre_start_commands, post_start_commands, cluster_config) @@ -276,7 +276,6 @@ def _orchestrate_cluster_config(ctx, cluster_config, docker, container_exec_env) destination_container: str destination_variable: str - if cluster_config is not None: for container in cluster_config: container_config = cluster_config[container] diff --git a/tests/smoke-test/run-smoke-test.sh b/tests/smoke-test/run-smoke-test.sh index b4006f01..777c608e 100755 --- a/tests/smoke-test/run-smoke-test.sh +++ b/tests/smoke-test/run-smoke-test.sh @@ -24,4 +24,11 @@ $TEST_TARGET_SO --stack test deploy-system up # TODO: test that we can use the deployed container somehow # Clean up $TEST_TARGET_SO --stack test deploy-system down +# Run same test but not using the stack definition +# Test building the a stack container +$TEST_TARGET_SO build-containers --include cerc/test-container +# Deploy the test container +$TEST_TARGET_SO deploy-system --include test up +# Clean up +$TEST_TARGET_SO deploy-system --include test down echo "Test passed" From 139626ef8e4021314741b864f08dc9cbc2b61931 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 9 Mar 2023 08:37:20 -0700 Subject: [PATCH 0299/1010] Update version Former-commit-id: 01c1230cd109f4aa692a1f64678fe108ca13fae1 --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index e9137861..d716fbfc 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.25-75376d7 +v1.0.26-ee77835 From 75e5c1d7f1e27384490283a9638bbc5c9006fe62 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 9 Mar 2023 14:26:15 -0700 Subject: [PATCH 0300/1010] Drive by bug fix Former-commit-id: 21104f6b186153d16aca102ef879c4f791e44b25 --- app/deploy_system.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/deploy_system.py b/app/deploy_system.py index 6a473684..94cf0263 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -304,7 +304,7 @@ def _orchestrate_cluster_config(ctx, cluster_config, docker, container_exec_env) print(f"fetched source value: {source_value}") destination_output = docker.compose.execute(pd.destination_container, ["sh", "-c", - f"sh /scripts/import-{pd.destination_variable}.sh {pd.source_variable}"], + f"sh /scripts/import-{pd.destination_variable}.sh {source_value}"], tty=False, envs=container_exec_env) if ctx.debug: From 8d3bca602ac0f5d6a6abc989818e823cafc1033f Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 9 Mar 2023 17:06:07 -0700 Subject: [PATCH 0301/1010] Build foundry locally Former-commit-id: 6735a0d3785966147c37416628342a1d01f75644 --- app/data/compose/docker-compose-foundry.yml | 2 +- app/data/container-build/cerc-foundry/build.sh | 3 +++ app/data/container-build/foundry-rs-foundry/build.sh | 4 ---- app/data/container-image-list.txt | 2 +- app/data/repository-list.txt | 2 +- app/data/stacks/fixturenet-eth/stack.yml | 2 ++ 6 files changed, 8 insertions(+), 7 deletions(-) create mode 100755 app/data/container-build/cerc-foundry/build.sh delete mode 100755 app/data/container-build/foundry-rs-foundry/build.sh diff --git a/app/data/compose/docker-compose-foundry.yml b/app/data/compose/docker-compose-foundry.yml index c55bda69..ffb8ccb6 100644 --- a/app/data/compose/docker-compose-foundry.yml +++ b/app/data/compose/docker-compose-foundry.yml @@ -1,5 +1,5 @@ # Add-on pod to include foundry tooling within a fixturenet services: foundry: - image: ghcr.io/foundry-rs/foundry:latest + image: cerc/foundry:local command: ["while :; do sleep 600; done"] diff --git a/app/data/container-build/cerc-foundry/build.sh b/app/data/container-build/cerc-foundry/build.sh new file mode 100755 index 00000000..9dfad156 --- /dev/null +++ b/app/data/container-build/cerc-foundry/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +# Build a local version of the foundry-rs/foundry image +docker build -t cerc/foundry:local ${CERC_REPO_BASE_DIR}/foundry diff --git a/app/data/container-build/foundry-rs-foundry/build.sh b/app/data/container-build/foundry-rs-foundry/build.sh deleted file mode 100755 index 7bfbf873..00000000 --- a/app/data/container-build/foundry-rs-foundry/build.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env bash -# Build foundry-rs/foundry -# HACK below : TARGETARCH needs to be derived from the host environment -docker build -t foundry-rs/foundry:local ${CERC_REPO_BASE_DIR}/foundry diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index f22b4543..9fe22a4a 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -1,4 +1,4 @@ -foundry-rs/foundry +cerc/foundry cerc/test-contract cerc/eth-statediff-fill-service cerc/eth-statediff-service diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index 35f47c07..61b7290e 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -16,4 +16,4 @@ vulcanize/uniswap-v3-info vulcanize/assemblyscript cerc-io/eth-probe cerc-io/tx-spammer -foundry-rs/foundry +dboreham/foundry diff --git a/app/data/stacks/fixturenet-eth/stack.yml b/app/data/stacks/fixturenet-eth/stack.yml index f6c95e17..db3f4231 100644 --- a/app/data/stacks/fixturenet-eth/stack.yml +++ b/app/data/stacks/fixturenet-eth/stack.yml @@ -4,11 +4,13 @@ decription: "Ethereum Fixturenet" repos: - cerc-io/go-ethereum - cerc-io/tx-spammer + - dboreham/foundry containers: - cerc/go-ethereum - cerc/lighthouse - cerc/fixturenet-eth-geth - cerc/fixturenet-eth-lighthouse + - cerc/foundry pods: - fixturenet-eth - foundry From 49092305e43300110b68af273f3c95f3aa63d429 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 19 Mar 2023 17:30:22 -0600 Subject: [PATCH 0302/1010] Remove now unnecessary commands Former-commit-id: a3541586804e3d19a2e46232f6e642101fcf2ade --- app/data/stacks/fixturenet-laconicd/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/data/stacks/fixturenet-laconicd/README.md b/app/data/stacks/fixturenet-laconicd/README.md index 80903b7e..77a017a2 100644 --- a/app/data/stacks/fixturenet-laconicd/README.md +++ b/app/data/stacks/fixturenet-laconicd/README.md @@ -44,7 +44,5 @@ $ laconic-so --stack fixturenet-laconicd deploy logs ``` ## 6. Test with the Registry CLI ``` -$ laconic-so --stack fixturenet-laconicd deploy exec laconicd "sh /docker-entrypoint-scripts.d/export-mykey.sh" -$ laconic-so --stack fixturenet-laconicd deploy exec cli "sh /scripts/import-key.sh xxxxxxxxxxxxxxxxxxxxxxx" $ laconic-so --stack fixturenet-laconicd deploy exec cli "laconic cns status" ``` From 4d3042bfcce4618072ca630bdb9b48b3100e2eb8 Mon Sep 17 00:00:00 2001 From: Nabarun Gogoi <95nikass@gmail.com> Date: Mon, 20 Mar 2023 18:25:39 +0530 Subject: [PATCH 0303/1010] Add a stack for mobymask-v2-watcher to run peer tests (#222) * Add mobymask-v2-watcher stack with peer tests * Rename stack and container * Avoid building react-peer container * Improve step for getting container ID Former-commit-id: 78310788729e245040d3144d41c57160be14d774 --- .../docker-compose-watcher-mobymask-v2.yml | 47 +++++++++++++ app/data/config/watcher-mobymask-v2/.env | 1 + .../config/watcher-mobymask-v2/config.json | 8 +++ .../config/watcher-mobymask-v2/relay-id.json | 5 ++ .../config/watcher-mobymask-v2/watcher.toml | 70 +++++++++++++++++++ .../cerc-mobymask-ui/Dockerfile | 12 ++++ .../container-build/cerc-mobymask-ui/build.sh | 7 ++ .../cerc-react-peer/Dockerfile | 12 ++++ .../container-build/cerc-react-peer/build.sh | 7 ++ .../cerc-watcher-mobymask-v2/Dockerfile | 20 ++++++ .../cerc-watcher-mobymask-v2/build.sh | 7 ++ app/data/container-image-list.txt | 3 + app/data/pod-list.txt | 1 + app/data/repository-list.txt | 2 + app/data/stacks/mobymask-v2/README.md | 61 ++++++++++++++++ app/data/stacks/mobymask-v2/stack.yml | 11 +++ 16 files changed, 274 insertions(+) create mode 100644 app/data/compose/docker-compose-watcher-mobymask-v2.yml create mode 100644 app/data/config/watcher-mobymask-v2/.env create mode 100644 app/data/config/watcher-mobymask-v2/config.json create mode 100644 app/data/config/watcher-mobymask-v2/relay-id.json create mode 100644 app/data/config/watcher-mobymask-v2/watcher.toml create mode 100644 app/data/container-build/cerc-mobymask-ui/Dockerfile create mode 100755 app/data/container-build/cerc-mobymask-ui/build.sh create mode 100644 app/data/container-build/cerc-react-peer/Dockerfile create mode 100755 app/data/container-build/cerc-react-peer/build.sh create mode 100644 app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile create mode 100755 app/data/container-build/cerc-watcher-mobymask-v2/build.sh create mode 100644 app/data/stacks/mobymask-v2/README.md create mode 100644 app/data/stacks/mobymask-v2/stack.yml diff --git a/app/data/compose/docker-compose-watcher-mobymask-v2.yml b/app/data/compose/docker-compose-watcher-mobymask-v2.yml new file mode 100644 index 00000000..250653f1 --- /dev/null +++ b/app/data/compose/docker-compose-watcher-mobymask-v2.yml @@ -0,0 +1,47 @@ +version: '3.2' + +services: + mobymask-watcher-db: + restart: unless-stopped + image: postgres:14-alpine + environment: + - POSTGRES_USER=vdbm + - POSTGRES_MULTIPLE_DATABASES=mobymask-watcher,mobymask-watcher-job-queue + - POSTGRES_EXTENSION=mobymask-watcher-job-queue:pgcrypto + - POSTGRES_PASSWORD=password + volumes: + - ../config/postgresql/multiple-postgressql-databases.sh:/docker-entrypoint-initdb.d/multiple-postgressql-databases.sh + - mobymask_watcher_db_data:/var/lib/postgresql/data + ports: + - "0.0.0.0:15432:5432" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "5432"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 10s + + mobymask-watcher-server: + restart: unless-stopped + depends_on: + mobymask-watcher-db: + condition: service_healthy + image: cerc/watcher-mobymask-v2:local + command: ["sh", "-c", "yarn server"] + volumes: + - ../config/watcher-mobymask-v2/watcher.toml:/app/packages/mobymask-v2-watcher/environments/local.toml + - ../config/watcher-mobymask-v2/.env:/app/packages/peer/.env + - ../config/watcher-mobymask-v2/relay-id.json:/app/packages/mobymask-v2-watcher/relay-id.json + ports: + - "0.0.0.0:3001:3001" + - "0.0.0.0:9001:9001" + - "0.0.0.0:9090:9090" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "9090"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s + +volumes: + mobymask_watcher_db_data: diff --git a/app/data/config/watcher-mobymask-v2/.env b/app/data/config/watcher-mobymask-v2/.env new file mode 100644 index 00000000..05af7658 --- /dev/null +++ b/app/data/config/watcher-mobymask-v2/.env @@ -0,0 +1 @@ +RELAY="/ip4/127.0.0.1/tcp/9090/http/p2p-webrtc-direct/p2p/12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t" diff --git a/app/data/config/watcher-mobymask-v2/config.json b/app/data/config/watcher-mobymask-v2/config.json new file mode 100644 index 00000000..35c6f609 --- /dev/null +++ b/app/data/config/watcher-mobymask-v2/config.json @@ -0,0 +1,8 @@ +{ + "relayNodes": [ + "/ip4/127.0.0.1/tcp/9090/http/p2p-webrtc-direct/p2p/12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t" + ], + "peer": { + "enableDebugInfo": true + } +} diff --git a/app/data/config/watcher-mobymask-v2/relay-id.json b/app/data/config/watcher-mobymask-v2/relay-id.json new file mode 100644 index 00000000..d7edc6dc --- /dev/null +++ b/app/data/config/watcher-mobymask-v2/relay-id.json @@ -0,0 +1,5 @@ +{ + "id": "12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t", + "privKey": "CAESQGsqG5o4VlWJZM9XlA3MjabyZOXWQ2MLZU5AhBQsjXGt9iSlGtTuNOrHX5xSRgLBxLuMoqWsjGxE/dDB9c46RI8=", + "pubKey": "CAESIPYkpRrU7jTqx1+cUkYCwcS7jKKlrIxsRP3QwfXOOkSP" +} diff --git a/app/data/config/watcher-mobymask-v2/watcher.toml b/app/data/config/watcher-mobymask-v2/watcher.toml new file mode 100644 index 00000000..f765db61 --- /dev/null +++ b/app/data/config/watcher-mobymask-v2/watcher.toml @@ -0,0 +1,70 @@ +[server] + host = "0.0.0.0" + port = 3001 + kind = "lazy" + + # Checkpointing state. + checkpointing = true + + # Checkpoint interval in number of blocks. + checkpointInterval = 2000 + + # Enable state creation + enableState = true + + # Boolean to filter logs by contract. + filterLogs = true + + # Max block range for which to return events in eventsInRange GQL query. + # Use -1 for skipping check on block range. + maxEventsBlockRange = -1 + + [server.p2p] + enableRelay = true + enablePeer = false + + [server.p2p.relay] + host = "0.0.0.0" + port = 9090 + relayPeers = [] + peerIdFile = './relay-id.json' + enableDebugInfo = true + + [server.p2p.peer] + relayMultiaddr = '/ip4/mobymask-watcher-server/tcp/9090/http/p2p-webrtc-direct/p2p/12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t' + pubSubTopic = 'mobymask' + peerIdFile = './peer-id.json' + enableDebugInfo = true + +[metrics] + host = "0.0.0.0" + port = 9000 + [metrics.gql] + port = 9001 + +[database] + type = "postgres" + host = "mobymask-watcher-db" + port = 5432 + database = "mobymask-watcher" + username = "vdbm" + password = "password" + synchronize = true + logging = false + +[upstream] + [upstream.ethServer] + gqlApiEndpoint = "http://ipld-eth-server:8083/graphql" + rpcProviderEndpoint = "http://ipld-eth-server:8082" + blockDelayInMilliSecs = 60000 + + [upstream.cache] + name = "requests" + enabled = false + deleteOnStart = false + +[jobQueue] + dbConnectionString = "postgres://vdbm:password@mobymask-watcher-db/mobymask-watcher-job-queue" + maxCompletionLagInSecs = 300 + jobDelayInMilliSecs = 100 + eventsInBatch = 50 diff --git a/app/data/container-build/cerc-mobymask-ui/Dockerfile b/app/data/container-build/cerc-mobymask-ui/Dockerfile new file mode 100644 index 00000000..86a056b7 --- /dev/null +++ b/app/data/container-build/cerc-mobymask-ui/Dockerfile @@ -0,0 +1,12 @@ +FROM node:18.15.0-alpine3.16 + +RUN apk --update --no-cache add make git + +WORKDIR /app + +COPY . . + +RUN echo "Building mobymask-ui" && \ + npm install + +WORKDIR /app diff --git a/app/data/container-build/cerc-mobymask-ui/build.sh b/app/data/container-build/cerc-mobymask-ui/build.sh new file mode 100755 index 00000000..cabd63ff --- /dev/null +++ b/app/data/container-build/cerc-mobymask-ui/build.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# Build cerc/mobymask-ui + +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t cerc/mobymask-ui:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/mobymask-ui diff --git a/app/data/container-build/cerc-react-peer/Dockerfile b/app/data/container-build/cerc-react-peer/Dockerfile new file mode 100644 index 00000000..2511d623 --- /dev/null +++ b/app/data/container-build/cerc-react-peer/Dockerfile @@ -0,0 +1,12 @@ +FROM node:18.15.0-alpine3.16 + +RUN apk --update --no-cache add make git + +WORKDIR /app + +COPY . . + +RUN echo "Building react-peer" && \ + yarn && yarn workspace @cerc-io/react-peer build + +WORKDIR /app diff --git a/app/data/container-build/cerc-react-peer/build.sh b/app/data/container-build/cerc-react-peer/build.sh new file mode 100755 index 00000000..a3d328de --- /dev/null +++ b/app/data/container-build/cerc-react-peer/build.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# Build cerc/react-peer + +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t cerc/react-peer:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/react-peer diff --git a/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile b/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile new file mode 100644 index 00000000..501c8f10 --- /dev/null +++ b/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile @@ -0,0 +1,20 @@ +FROM ubuntu:22.04 + +RUN apt-get update \ + && apt-get install -y curl gnupg build-essential \ + && curl --silent --location https://deb.nodesource.com/setup_18.x | bash - \ + && apt-get update \ + && apt-get install -y nodejs git \ + && node -v + +RUN corepack enable \ + && yarn --version + +WORKDIR /app + +COPY . . + +RUN echo "Building watcher-ts" && \ + yarn && yarn build + +WORKDIR /app/packages/mobymask-v2-watcher diff --git a/app/data/container-build/cerc-watcher-mobymask-v2/build.sh b/app/data/container-build/cerc-watcher-mobymask-v2/build.sh new file mode 100755 index 00000000..19e82818 --- /dev/null +++ b/app/data/container-build/cerc-watcher-mobymask-v2/build.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# Build cerc/watcher-mobymask-v2 + +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t cerc/watcher-mobymask-v2:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/watcher-ts diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index 9fe22a4a..58e5e054 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -18,6 +18,9 @@ cerc/watcher-erc20 cerc/watcher-erc721 cerc/watcher-uniswap-v3 cerc/uniswap-v3-info +cerc/watcher-mobymask-v2 +cerc/react-peer +cerc/mobymask-ui cerc/test-container cerc/eth-probe cerc/builder-js diff --git a/app/data/pod-list.txt b/app/data/pod-list.txt index ac36a9af..99974fa6 100644 --- a/app/data/pod-list.txt +++ b/app/data/pod-list.txt @@ -14,6 +14,7 @@ watcher-mobymask watcher-erc20 watcher-erc721 watcher-uniswap-v3 +watcher-mobymask-v2 test eth-probe keycloak diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index 61b7290e..073c664b 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -11,6 +11,8 @@ cerc-io/laconic-sdk cerc-io/laconic-registry-cli cerc-io/mobymask-watcher cerc-io/watcher-ts +cerc-io/react-peer +cerc-io/mobymask-ui vulcanize/uniswap-watcher-ts vulcanize/uniswap-v3-info vulcanize/assemblyscript diff --git a/app/data/stacks/mobymask-v2/README.md b/app/data/stacks/mobymask-v2/README.md new file mode 100644 index 00000000..82886783 --- /dev/null +++ b/app/data/stacks/mobymask-v2/README.md @@ -0,0 +1,61 @@ +# MobyMask v2 watcher + +Instructions to deploy MobyMask v2 watcher stack using [laconic-stack-orchestrator](/README.md#install) + +## Setup + +Clone required repositories: + +```bash +laconic-so --stack mobymask-v2 setup-repositories +``` + +Build the container images: + +```bash +laconic-so --stack mobymask-v2 build-containers +``` + +This should create the required docker images in the local image registry. + +Deploy the stack: + +```bash +laconic-so --stack mobymask-v2 deploy-system up +``` + +## Tests + +Find the watcher container's id: + +```bash +docker ps | grep "cerc/watcher-mobymask-v2:local" +``` + +Example output + +``` +8b38e9a64d7e cerc/watcher-mobymask-v2:local "sh -c 'yarn server'" 35 seconds ago Up 14 seconds (health: starting) 0.0.0.0:3001->3001/tcp, 0.0.0.0:9001->9001/tcp, 0.0.0.0:9090->9090/tcp laconic-aeb84676de2b0a7671ae90d537fc7d26-mobymask-watcher-server-1 +``` + +In above output the container ID is `8b38e9a64d7e` + +Export it for later use: + +```bash +export CONTAINER_ID= +``` + +Run the peer tests: + +```bash +docker exec -w /app/packages/peer $CONTAINER_ID yarn test +``` + +## Clean up + +To stop all the services running in background run: + +```bash +laconic-so --stack mobymask-v2 deploy-system down +``` diff --git a/app/data/stacks/mobymask-v2/stack.yml b/app/data/stacks/mobymask-v2/stack.yml new file mode 100644 index 00000000..c9b13aa5 --- /dev/null +++ b/app/data/stacks/mobymask-v2/stack.yml @@ -0,0 +1,11 @@ +version: "1.0" +name: mobymask-v2 +repos: + - cerc-io/watcher-ts + - cerc-io/react-peer + - cerc-io/mobymask-ui +containers: + - cerc/watcher-mobymask-v2 + - cerc/mobymask-ui +pods: + - watcher-mobymask-v2 From 6ee7c3bbbafafce553883f531d25bdd9f6bec2f3 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 20 Mar 2023 08:21:41 -0600 Subject: [PATCH 0304/1010] Update version Former-commit-id: 4c92391faf54b87620c5dcb4c250aa498fb6d2e6 --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index d716fbfc..7c4c6d5d 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.26-ee77835 +v1.0.27-7831078 From 48a761875a67056cfd47b96c6d0bb7c92e681ab8 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 20 Mar 2023 10:08:59 -0600 Subject: [PATCH 0305/1010] Update registry deploy instructions Former-commit-id: ea6f28a3deb8c09e56d0c68779fa5d212f869c33 --- app/data/stacks/build-support/README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/app/data/stacks/build-support/README.md b/app/data/stacks/build-support/README.md index 99747f03..bb9fca16 100644 --- a/app/data/stacks/build-support/README.md +++ b/app/data/stacks/build-support/README.md @@ -24,8 +24,31 @@ $ laconic-so --stack build-support build-containers --exclude cerc/builder-gerbi ``` $ laconic-so --stack package-registry setup-repositories $ laconic-so --stack package-registry deploy up +[+] Running 3/3 + ⠿ Network laconic-aecc4a21d3a502b14522db97d427e850_gitea Created 0.0s + ⠿ Container laconic-aecc4a21d3a502b14522db97d427e850-db-1 Started 1.2s + ⠿ Container laconic-aecc4a21d3a502b14522db97d427e850-server-1 Started 1.9s +New user 'gitea_admin' has been successfully created! This is your gitea access token: 84fe66a73698bf11edbdccd0a338236b7d1d5c45. Keep it safe and secure, it can not be fetched again from gitea. +To use with laconic-so set this environment variable: export CERC_NPM_AUTH_TOKEN=3e493e77b3e83fe9e882f7e3a79dd4d5441c308b +Created the organization cerc-io +Gitea was configured to use host name: gitea.local, ensure that this resolves to localhost, e.g. with sudo vi /etc/hosts +Success, gitea is properly initialized +$ ``` +### 3. Configure the hostname gitea.local +How to do this is OS-dependent but usually involves editing a `hosts` file. For example on Linux add this line to the file `/etc/hosts` (needs sudo): +``` +127.0.0.1 gitea.local +``` +Test with: +``` +$ ping gitea.local +PING gitea.local (127.0.0.1) 56(84) bytes of data. +64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.147 ms +64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.033 ms +``` + Now npm packages can be built: ### Build npm Packages Ensure that `CERC_NPM_AUTH_TOKEN` is set with the token printed above when the package-registry stack was deployed (the actual token value will be different than shown in this example): From 39741b2e8f723d21c962425cba812861295294d6 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 20 Mar 2023 10:14:58 -0600 Subject: [PATCH 0306/1010] Add Gitea note Former-commit-id: 74be51b8928494663216ff3e80b5fcb241b833db --- app/data/stacks/build-support/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/app/data/stacks/build-support/README.md b/app/data/stacks/build-support/README.md index bb9fca16..72001518 100644 --- a/app/data/stacks/build-support/README.md +++ b/app/data/stacks/build-support/README.md @@ -48,6 +48,7 @@ PING gitea.local (127.0.0.1) 56(84) bytes of data. 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.147 ms 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.033 ms ``` +Although not necessary in order to build and publish packages, you can now access the Gitea web interface at: [http://gitea.local:3000](http://gitea.local:3000) using these credentials: gitea_admin/admin1234 (Note: please properly secure Gitea if public internet access is allowed). Now npm packages can be built: ### Build npm Packages From d5f5eccedaa065eff3d8adc863c5d399905f5c1c Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 20 Mar 2023 19:36:05 -0600 Subject: [PATCH 0307/1010] Update README to reflect user experience and to use --stack directive in examples Former-commit-id: 2c151cb8ce3adeb9a4ac7b930936bec0f07a84e4 --- README.md | 45 ++++++++++++++++----------------------------- 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index b2c86f4b..6eb5b94d 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,10 @@ Stack Orchestrator allows building and deployment of a Laconic Stack on a single Ensure that the following are already installed: -- [Python3](https://wiki.python.org/moin/BeginnersGuide/Download): `python3 --version` >= `3.10.8` +- [Python3](https://wiki.python.org/moin/BeginnersGuide/Download): `python3 --version` >= `3.8.10` (the Python3 shipped in Ubuntu 20+ is good to go) - [Docker](https://docs.docker.com/get-docker/): `docker --version` >= `20.10.21` -- [Docker Compose](https://docs.docker.com/compose/install/): `docker-compose --version` >= `2.13.0` -Note: if installing docker-compose via package manager (as opposed to Docker Desktop), you must [install the plugin](https://docs.docker.com/compose/install/linux/#install-the-plugin-manually), e.g., on Linux: +Note: if installing docker-compose via package manager on Linux (as opposed to Docker Desktop), you must [install the plugin](https://docs.docker.com/compose/install/linux/#install-the-plugin-manually), e.g. : ```bash mkdir -p ~/.docker/cli-plugins @@ -20,39 +19,27 @@ curl -SL https://github.com/docker/compose/releases/download/v2.11.2/docker-comp chmod +x ~/.docker/cli-plugins/docker-compose ``` -Next, download the latest release from [this page](https://github.com/cerc-io/stack-orchestrator/tags), into a suitable directory (e.g. `~/bin`): +Next decide on a directory where you would like to put the stack-orchestrator program. Typically this would be +a "user" binary directory such as `~/bin` or perhaps `/usr/local/laconic` or possibly just the current working directory. + +Now, having selected that directory, download the latest release from [this page](https://github.com/cerc-io/stack-orchestrator/tags) into it (we're using `~/bin` below for concreteness but edit to suit if you selected a different directory). Also be sure that the destination directory exists and is writable: ```bash curl -L -o ~/bin/laconic-so https://github.com/cerc-io/stack-orchestrator/releases/latest/download/laconic-so ``` -Give it permissions: +Give it execute permissions: ```bash chmod +x ~/bin/laconic-so ``` Ensure `laconic-so` is on the [`PATH`](https://unix.stackexchange.com/a/26059) -Verify operation: +Verify operation (your version will probably be different, just check here that you see some version outut and not an error): ``` -laconic-so --help -Usage: python -m laconic-so [OPTIONS] COMMAND [ARGS]... - - Laconic Stack Orchestrator - -Options: - --quiet - --verbose - --dry-run - --local-stack - -h, --help Show this message and exit. - -Commands: - build-containers build the set of containers required for a complete... - build-npms build the set of npm packages required for a... - deploy-system deploy a stack - setup-repositories git clone the set of repositories required to build... +laconic-so version +Version: v1.0.27-7831078 ``` ## Usage @@ -64,25 +51,25 @@ Three sub-commands: `setup-repositories`, `build-containers` and `deploy-system` Clone the set of git repositories necessary to build a system: ```bash -laconic-so --verbose setup-repositories --include cerc-io/go-ethereum,cerc-io/ipld-eth-db,cerc-io/ipld-eth-server,cerc-io/watcher-ts +laconic-so --stack erc20 setup-repositories ``` -This will default to `~/cerc` or - if set - the environment variable `CERC_REPO_BASE_DIR` +This will default to cloning git reposiories into: `~/cerc` or - if set - the environment variable `CERC_REPO_BASE_DIR` ### Build Containers Build the set of docker container images required to run a system. It takes around 10 minutes to build all the containers from scratch. ```bash -laconic-so --verbose build-containers --include cerc/go-ethereum,cerc/go-ethereum-foundry,cerc/ipld-eth-db,cerc/ipld-eth-server,cerc/watcher-erc20 +laconic-so --stack erc20 build-containers ``` ### Deploy System -Uses `docker-compose` to deploy a system (with most recently built container images). +Uses `docker compose` to deploy a system (with most recently built container images). ```bash -laconic-so --verbose deploy-system --include ipld-eth-db,go-ethereum-foundry,ipld-eth-server,watcher-erc20 up +laconic-so --stack erc20 deploy-system up ``` Check out he GraphQL playground here: [http://localhost:3002/graphql](http://localhost:3002/graphql) @@ -92,7 +79,7 @@ See the [erc20 watcher demo](/app/data/stacks/erc20) to continue further. ### Cleanup ```bash -laconic-so --verbose deploy-system --include ipld-eth-db,go-ethereum-foundry,ipld-eth-server,watcher-erc20 down +laconic-so --stack erc20 deploy-system down ``` ## Contributing From c537d787c259e3d45c60828f8cf789198d2528c7 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 21 Mar 2023 09:55:40 -0600 Subject: [PATCH 0308/1010] Update version Former-commit-id: 91ba0ae011be10bcbea44267a3ebbde7aec1037b --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index 7c4c6d5d..4235a1ea 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.27-7831078 +v1.0.28-33bbbcc From 84bad13934cd81bb2628d550774ef77f7e6ca424 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 22 Mar 2023 14:52:39 -0600 Subject: [PATCH 0309/1010] Update fixturenet create script Former-commit-id: 01c69990273ac9c9d0d7d6547e853662f4dc63df --- .../fixturenet-laconicd/create-fixturenet.sh | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/app/data/config/fixturenet-laconicd/create-fixturenet.sh b/app/data/config/fixturenet-laconicd/create-fixturenet.sh index a4c8b73c..9c30bff8 100644 --- a/app/data/config/fixturenet-laconicd/create-fixturenet.sh +++ b/app/data/config/fixturenet-laconicd/create-fixturenet.sh @@ -1,8 +1,8 @@ -#!/bin/sh - -# Originally from: https://github.com/cerc-io/laconicd/blob/main/init.sh -# TODO: fold this back into the laconicd repo +#!/bin/bash +# TODO: this file is now an unmodified copy of cerc-io/laconicd/init.sh +# so we should have a mechanism to bundle it inside the container rather than link from here +# at deploy time. KEY="mykey" CHAINID="laconic_9000-1" @@ -10,7 +10,7 @@ MONIKER="localtestnet" KEYRING="test" KEYALGO="eth_secp256k1" LOGLEVEL="info" -# to trace evm +# trace evm TRACE="--trace" # TRACE="" @@ -28,7 +28,7 @@ laconicd config chain-id $CHAINID # if $KEY exists it should be deleted laconicd keys add $KEY --keyring-backend $KEYRING --algo $KEYALGO -# Set moniker and chain-id for laconic (Moniker can be anything, chain-id must be an integer) +# Set moniker and chain-id for Ethermint (Moniker can be anything, chain-id must be an integer) laconicd init $MONIKER --chain-id $CHAINID # Change parameter token denominations to aphoton @@ -37,28 +37,28 @@ cat $HOME/.laconicd/config/genesis.json | jq '.app_state["crisis"]["constant_fee cat $HOME/.laconicd/config/genesis.json | jq '.app_state["gov"]["deposit_params"]["min_deposit"][0]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json cat $HOME/.laconicd/config/genesis.json | jq '.app_state["mint"]["params"]["mint_denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json # Custom modules -cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["record_rent"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json -cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_rent"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json -cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_auction_commit_fee"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json -cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_auction_reveal_fee"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json -cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_auction_minimum_bid"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json +cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["record_rent"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json +cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_rent"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json +cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_auction_commit_fee"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json +cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_auction_reveal_fee"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json +cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_auction_minimum_bid"]["denom"]="aphoton"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json -if [[ "$TEST_NAMESERVICE_EXPIRY" == "true" ]]; then +if [[ "$TEST_REGISTRY_EXPIRY" == "true" ]]; then echo "Setting timers for expiry tests." - cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["record_rent_duration"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json - cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_grace_period"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json - cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_rent_duration"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["record_rent_duration"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_grace_period"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_rent_duration"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json fi if [[ "$TEST_AUCTION_ENABLED" == "true" ]]; then echo "Enabling auction and setting timers." - cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_auction_enabled"]=true' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json - cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_rent_duration"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json - cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_grace_period"]="300s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json - cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_auction_commits_duration"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json - cat $HOME/.laconicd/config/genesis.json | jq '.app_state["nameservice"]["params"]["authority_auction_reveals_duration"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_auction_enabled"]=true' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_rent_duration"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_grace_period"]="300s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_auction_commits_duration"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json + cat $HOME/.laconicd/config/genesis.json | jq '.app_state["registry"]["params"]["authority_auction_reveals_duration"]="60s"' > $HOME/.laconicd/config/tmp_genesis.json && mv $HOME/.laconicd/config/tmp_genesis.json $HOME/.laconicd/config/genesis.json fi # increase block time (?) From be761d10b183b60807288623543f7d3d9461b9d4 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 22 Mar 2023 17:05:04 -0600 Subject: [PATCH 0310/1010] Initial commit Former-commit-id: f55aeee5838441cf1f69e3ad9e5f60862beb9125 --- .../fixturenet-laconic-loaded/README.md | 50 +++++++++++++++++++ .../fixturenet-laconic-loaded/stack.yml | 19 +++++++ 2 files changed, 69 insertions(+) create mode 100644 app/data/stacks/fixturenet-laconic-loaded/README.md create mode 100644 app/data/stacks/fixturenet-laconic-loaded/stack.yml diff --git a/app/data/stacks/fixturenet-laconic-loaded/README.md b/app/data/stacks/fixturenet-laconic-loaded/README.md new file mode 100644 index 00000000..000596ee --- /dev/null +++ b/app/data/stacks/fixturenet-laconic-loaded/README.md @@ -0,0 +1,50 @@ +# Laconic Fixturenet (experimental) + +Testing a "Loaded" fixturenet with console. + +Instructions for deploying a local Laconic blockchain "fixturenet" for development and testing purposes using laconic-stack-orchestrator. + +## 1. Install Laconic Stack Orchestrator +Installation is covered in detail [here](https://github.com/cerc-io/stack-orchestrator#user-mode) but if you're on Linux and already have docker installed it should be as simple as: +``` +$ mkdir my-working-dir +$ cd my-working-dir +$ curl -L -o ./laconic-so https://github.com/cerc-io/stack-orchestrator/releases/latest/download/laconic-so +$ chmod +x ./laconic-so +$ export PATH=$PATH:$(pwd) # Or move laconic-so to ~/bin or your favorite on-path directory +``` +## 2. Prepare the local build environment +Note that this step needs only to be done once on a new machine. +Detailed instructions can be found [here](../build-support/README.md). For the impatient run these commands: +``` +$ laconic-so --stack build-support build-containers --exclude cerc/builder-gerbil +$ laconic-so --stack package-registry setup-repositories +$ laconic-so --stack package-registry deploy-system up +``` +Then add the localhost alias `gitea.local` and set `CERC_NPM_AUTH_TOKEN` to the token printed when the package-registry stack was deployed above: +``` +$ sudo vi /etc/hosts +$ export CERC_NPM_AUTH_TOKEN= +``` + +## 3. Clone required repositories +``` +$ laconic-so --stack fixturenet-laconicd setup-repositories +``` +## 4. Build the stack's packages and containers +``` +$ laconic-so --stack fixturenet-laconicd build-npms +$ laconic-so --stack fixturenet-laconicd build-containers +``` +## 5. Deploy the stack +``` +$ laconic-so --stack fixturenet-laconicd deploy up +``` +Correct operation should be verified by checking the laconicd container's logs with: +``` +$ laconic-so --stack fixturenet-laconicd deploy logs +``` +## 6. Test with the Registry CLI +``` +$ laconic-so --stack fixturenet-laconicd deploy exec cli "laconic cns status" +``` diff --git a/app/data/stacks/fixturenet-laconic-loaded/stack.yml b/app/data/stacks/fixturenet-laconic-loaded/stack.yml new file mode 100644 index 00000000..a82e9e5f --- /dev/null +++ b/app/data/stacks/fixturenet-laconic-loaded/stack.yml @@ -0,0 +1,19 @@ +version: "1.0" +name: fixturenet-laconic-loaded +description: "A full featured laconic fixturenet" +repos: + - cerc-io/laconicd + - cerc-io/laconic-sdk + - cerc-io/laconic-registry-cli + - cerc-io/laconic-console +npms: + - laconic-sdk + - laconic-registry-cli +containers: + - cerc/laconicd + - cerc/laconic-registry-cli +pods: + - fixturenet-laconicd +config: + cli: + key: laconicd.mykey From dac22b19b7a1555698e76d26d1bd0656ff8591e2 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 22 Mar 2023 21:35:48 -0600 Subject: [PATCH 0311/1010] Update version Former-commit-id: d5fd880bba76204e46053a26d7b4186621f413b6 --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index 4235a1ea..df76da3b 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.28-33bbbcc +v1.0.29-5fca9bd From 653f4c7d0a5855ee422c93607efd12cbd764b812 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 23 Mar 2023 14:04:31 -0600 Subject: [PATCH 0312/1010] Update to Node 18 Former-commit-id: 56ff7d210bef007a48057b2e5cb6d7bc20a7b3bf --- app/data/container-build/cerc-builder-js/Dockerfile | 2 +- app/data/container-build/cerc-laconic-registry-cli/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/data/container-build/cerc-builder-js/Dockerfile b/app/data/container-build/cerc-builder-js/Dockerfile index 35c9a972..71c770c0 100644 --- a/app/data/container-build/cerc-builder-js/Dockerfile +++ b/app/data/container-build/cerc-builder-js/Dockerfile @@ -1,7 +1,7 @@ # Originally from: https://github.com/devcontainers/images/blob/main/src/javascript-node/.devcontainer/Dockerfile # Which depends on: https://github.com/nodejs/docker-node/blob/main/Dockerfile-debian.template # [Choice] Node.js version (use -bullseye variants on local arm64/Apple Silicon): 18, 16, 14, 18-bullseye, 16-bullseye, 14-bullseye, 18-buster, 16-buster, 14-buster -ARG VARIANT=16-bullseye +ARG VARIANT=18-bullseye FROM node:${VARIANT} # Set these args to change the uid/gid for the base container's "node" user to match that of the host user (so bind mounts work as expected). diff --git a/app/data/container-build/cerc-laconic-registry-cli/Dockerfile b/app/data/container-build/cerc-laconic-registry-cli/Dockerfile index cef3b36f..0650b670 100644 --- a/app/data/container-build/cerc-laconic-registry-cli/Dockerfile +++ b/app/data/container-build/cerc-laconic-registry-cli/Dockerfile @@ -1,6 +1,6 @@ # Originally from: https://github.com/devcontainers/images/blob/main/src/javascript-node/.devcontainer/Dockerfile # [Choice] Node.js version (use -bullseye variants on local arm64/Apple Silicon): 18, 16, 14, 18-bullseye, 16-bullseye, 14-bullseye, 18-buster, 16-buster, 14-buster -ARG VARIANT=16-bullseye +ARG VARIANT=18-bullseye FROM node:${VARIANT} ARG USERNAME=node From 9e138d8a6a9690e400825b63250ce0b5562d5764 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 23 Mar 2023 16:02:55 -0600 Subject: [PATCH 0313/1010] Initial commit Former-commit-id: c9e931c212f9871f7f328f34a9bad69a490f0db8 --- .../cerc-laconic-console-host/Dockerfile | 55 +++++++++++++++++++ .../cerc-laconic-console-host/build.sh | 9 +++ app/data/container-image-list.txt | 1 + .../fixturenet-laconic-loaded/stack.yml | 1 + 4 files changed, 66 insertions(+) create mode 100644 app/data/container-build/cerc-laconic-console-host/Dockerfile create mode 100755 app/data/container-build/cerc-laconic-console-host/build.sh diff --git a/app/data/container-build/cerc-laconic-console-host/Dockerfile b/app/data/container-build/cerc-laconic-console-host/Dockerfile new file mode 100644 index 00000000..a3dc9b1f --- /dev/null +++ b/app/data/container-build/cerc-laconic-console-host/Dockerfile @@ -0,0 +1,55 @@ +# Originally from: https://github.com/devcontainers/images/blob/main/src/javascript-node/.devcontainer/Dockerfile +# [Choice] Node.js version (use -bullseye variants on local arm64/Apple Silicon): 18, 16, 14, 18-bullseye, 16-bullseye, 14-bullseye, 18-buster, 16-buster, 14-buster +ARG VARIANT=16-bullseye +FROM node:${VARIANT} + +ARG USERNAME=node +ARG NPM_GLOBAL=/usr/local/share/npm-global + +# This container pulls npm packages from a local registry configured via these env vars +ARG CERC_NPM_URL +ARG CERC_NPM_AUTH_TOKEN + +# Add NPM global to PATH. +ENV PATH=${NPM_GLOBAL}/bin:${PATH} + +RUN \ + # Configure global npm install location, use group to adapt to UID/GID changes + if ! cat /etc/group | grep -e "^npm:" > /dev/null 2>&1; then groupadd -r npm; fi \ + && usermod -a -G npm ${USERNAME} \ + && umask 0002 \ + && mkdir -p ${NPM_GLOBAL} \ + && touch /usr/local/etc/npmrc \ + && chown ${USERNAME}:npm ${NPM_GLOBAL} /usr/local/etc/npmrc \ + && chmod g+s ${NPM_GLOBAL} \ + && npm config -g set prefix ${NPM_GLOBAL} \ + && su ${USERNAME} -c "npm config -g set prefix ${NPM_GLOBAL}" \ + # Install eslint + && su ${USERNAME} -c "umask 0002 && npm install -g eslint" \ + && npm cache clean --force > /dev/null 2>&1 + +# [Optional] Uncomment this section to install additional OS packages. +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ + && apt-get -y install --no-install-recommends jq + +# [Optional] Uncomment if you want to install an additional version of node using nvm +# ARG EXTRA_NODE_VERSION=10 +# RUN su node -c "source /usr/local/share/nvm/nvm.sh && nvm install ${EXTRA_NODE_VERSION}" + +# [Optional] Uncomment if you want to install more global node modules +# RUN su node -c "npm install -g " + +# Configure the local npm registry +RUN npm config set @lirewine:registry ${CERC_NPM_URL} \ + && npm config set @cerc-io:registry ${CERC_NPM_URL} \ + && npm config set @lirewine:registry ${CERC_NPM_URL} \ + && npm config set -- ${CERC_NPM_URL}:_authToken ${CERC_NPM_AUTH_TOKEN} + +# TODO: the image at this point could be made a base image for several different CLI images +# that install different Node-based CLI commands + +# Globally install the cli package +RUN yarn global add @cerc-io/console-app + +# Default command sleeps forever so docker doesn't kill it +CMD ["sh", "-c", "while :; do sleep 600; done"] diff --git a/app/data/container-build/cerc-laconic-console-host/build.sh b/app/data/container-build/cerc-laconic-console-host/build.sh new file mode 100755 index 00000000..cc84d249 --- /dev/null +++ b/app/data/container-build/cerc-laconic-console-host/build.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +# Build cerc/laconic-registry-cli + +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t cerc/laconic-console-host:local -f ${SCRIPT_DIR}/Dockerfile \ + --add-host gitea.local:host-gateway \ + --build-arg CERC_NPM_AUTH_TOKEN --build-arg CERC_NPM_URL ${SCRIPT_DIR} diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index 58e5e054..a822fe6b 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -11,6 +11,7 @@ cerc/ipld-eth-beacon-indexer cerc/ipld-eth-server cerc/laconicd cerc/laconic-registry-cli +cerc/laconic-console-host cerc/fixturenet-eth-geth cerc/fixturenet-eth-lighthouse cerc/watcher-mobymask diff --git a/app/data/stacks/fixturenet-laconic-loaded/stack.yml b/app/data/stacks/fixturenet-laconic-loaded/stack.yml index a82e9e5f..345430f0 100644 --- a/app/data/stacks/fixturenet-laconic-loaded/stack.yml +++ b/app/data/stacks/fixturenet-laconic-loaded/stack.yml @@ -9,6 +9,7 @@ repos: npms: - laconic-sdk - laconic-registry-cli + - laconic-console containers: - cerc/laconicd - cerc/laconic-registry-cli From 4420f45924c248526adb6c4fcbd1d811df12d8ca Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 23 Mar 2023 16:03:35 -0600 Subject: [PATCH 0314/1010] Build foundry with Debian base container Former-commit-id: 21e9f9677173cee479b894c7ea96b6a562d035d9 --- app/data/container-build/cerc-foundry/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/container-build/cerc-foundry/build.sh b/app/data/container-build/cerc-foundry/build.sh index 9dfad156..a2fe605f 100755 --- a/app/data/container-build/cerc-foundry/build.sh +++ b/app/data/container-build/cerc-foundry/build.sh @@ -1,3 +1,3 @@ #!/usr/bin/env bash # Build a local version of the foundry-rs/foundry image -docker build -t cerc/foundry:local ${CERC_REPO_BASE_DIR}/foundry +docker build -t cerc/foundry:local -f ${CERC_REPO_BASE_DIR}/Dockerfile.debian ${CERC_REPO_BASE_DIR}/foundry From 23fab04ec8cded42b11b4713ff32fd3d73af14ae Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 23 Mar 2023 16:09:27 -0600 Subject: [PATCH 0315/1010] Fix filename Former-commit-id: 06288fd9e19b35e8b2e14a126ce52cecbe15d33e --- app/data/container-build/cerc-foundry/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/container-build/cerc-foundry/build.sh b/app/data/container-build/cerc-foundry/build.sh index a2fe605f..c765f03d 100755 --- a/app/data/container-build/cerc-foundry/build.sh +++ b/app/data/container-build/cerc-foundry/build.sh @@ -1,3 +1,3 @@ #!/usr/bin/env bash # Build a local version of the foundry-rs/foundry image -docker build -t cerc/foundry:local -f ${CERC_REPO_BASE_DIR}/Dockerfile.debian ${CERC_REPO_BASE_DIR}/foundry +docker build -t cerc/foundry:local -f ${CERC_REPO_BASE_DIR}/foundry/Dockerfile-debian ${CERC_REPO_BASE_DIR}/foundry From d96a6def14701c8dbe69fc6ecadd6da6de55d626 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 24 Mar 2023 02:08:56 -0600 Subject: [PATCH 0316/1010] Add lirewine repos and npms Former-commit-id: 870a9877603f5b1d0e2839575e56dff84bcd31b0 --- app/data/npm-package-list.txt | 1 + app/data/repository-list.txt | 3 +++ 2 files changed, 4 insertions(+) diff --git a/app/data/npm-package-list.txt b/app/data/npm-package-list.txt index 3adedb5a..34ec73f8 100644 --- a/app/data/npm-package-list.txt +++ b/app/data/npm-package-list.txt @@ -2,3 +2,4 @@ gem laconic-sdk debug laconic-registry-cli +gem diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index 073c664b..2922d8cb 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -19,3 +19,6 @@ vulcanize/assemblyscript cerc-io/eth-probe cerc-io/tx-spammer dboreham/foundry +lirewine/gem +lirewine/debug +lirewine/crypto From 364a71d694b21cf4c87a67bdb1cf8c5430bb472b Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 24 Mar 2023 02:30:04 -0600 Subject: [PATCH 0317/1010] Support the @lirewine npm scope Former-commit-id: 9e322203e9f07364a4ba28b28920aa6c9b945144 --- .../build-npm-package-local-dependencies.sh | 28 ++++++++++--------- .../cerc-builder-js/build-npm-package.sh | 2 +- .../cerc-laconic-registry-cli/Dockerfile | 3 +- app/data/npm-package-list.txt | 2 ++ 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh b/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh index 69e8e99e..7f372af7 100755 --- a/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh +++ b/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh @@ -1,7 +1,7 @@ #!/bin/bash # Usage: build-npm-package-local-dependencies.sh # Runs build-npm-package.sh after first fixing up yarn.lock to use a local -# npm registry for all packages in a spcific scope (currently @cerc-io) +# npm registry for all packages in a spcific scope (currently @cerc-io and @lirewine) if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi @@ -17,18 +17,20 @@ fi set -e local_npm_registry_url=$1 package_publish_version=$2 -# TODO: make this a paramater and allow a list of scopes -npm_scope_for_local="@cerc-io" -# We need to configure the local registry -npm config set ${npm_scope_for_local}:registry ${local_npm_registry_url} -npm config set -- ${local_npm_registry_url}:_authToken ${CERC_NPM_AUTH_TOKEN} -# Find the set of dependencies from the specified scope -mapfile -t dependencies_from_scope < <(cat package.json | jq -r '.dependencies | with_entries(if (.key|test("^'${npm_scope_for_local}'/.*$")) then ( {key: .key, value: .value } ) else empty end ) | keys[]') -echo "Fixing up dependencies" -for package in "${dependencies_from_scope[@]}" -do - echo "Fixing up package ${package}" - yarn-local-registry-fixup.sh $package ${local_npm_registry_url} +# If we need to handle an additional scope, add it to the list below: +npm_scopes_to_handle=("@cerc-io" "@lirewine") +for npm_scope_for_local in ${npm_scopes_to_handle[@]}; do + # We need to configure the local registry + npm config set ${npm_scope_for_local}:registry ${local_npm_registry_url} + npm config set -- ${local_npm_registry_url}:_authToken ${CERC_NPM_AUTH_TOKEN} + # Find the set of dependencies from the specified scope + mapfile -t dependencies_from_scope < <(cat package.json | jq -r '.dependencies | with_entries(if (.key|test("^'${npm_scope_for_local}'/.*$")) then ( {key: .key, value: .value } ) else empty end ) | keys[]') + echo "Fixing up dependencies" + for package in "${dependencies_from_scope[@]}" + do + echo "Fixing up package ${package}" + yarn-local-registry-fixup.sh $package ${local_npm_registry_url} + done done echo "Running build" build-npm-package.sh ${local_npm_registry_url} ${package_publish_version} diff --git a/app/data/container-build/cerc-builder-js/build-npm-package.sh b/app/data/container-build/cerc-builder-js/build-npm-package.sh index e0d19481..c8c1e810 100755 --- a/app/data/container-build/cerc-builder-js/build-npm-package.sh +++ b/app/data/container-build/cerc-builder-js/build-npm-package.sh @@ -22,8 +22,8 @@ set -e # Get the name of this package from package.json since we weren't passed that package_name=$( cat package.json | jq -r .name ) local_npm_registry_url=$1 -npm config set @lirewine:registry ${local_npm_registry_url} npm config set @cerc-io:registry ${local_npm_registry_url} +npm config set @lirewine:registry ${local_npm_registry_url} npm config set -- ${local_npm_registry_url}:_authToken ${CERC_NPM_AUTH_TOKEN} # First check if the version of this package we're trying to build already exists in the registry package_exists=$( yarn info --json ${package_name}@${package_publish_version} 2>/dev/null | jq -r .data.dist.tarball ) diff --git a/app/data/container-build/cerc-laconic-registry-cli/Dockerfile b/app/data/container-build/cerc-laconic-registry-cli/Dockerfile index cef3b36f..e0b1ae1e 100644 --- a/app/data/container-build/cerc-laconic-registry-cli/Dockerfile +++ b/app/data/container-build/cerc-laconic-registry-cli/Dockerfile @@ -40,8 +40,7 @@ RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ # RUN su node -c "npm install -g " # Configure the local npm registry -RUN npm config set @lirewine:registry ${CERC_NPM_URL} \ - && npm config set @cerc-io:registry ${CERC_NPM_URL} \ +RUN npm config set @cerc-io:registry ${CERC_NPM_URL} \ && npm config set @lirewine:registry ${CERC_NPM_URL} \ && npm config set -- ${CERC_NPM_URL}:_authToken ${CERC_NPM_AUTH_TOKEN} diff --git a/app/data/npm-package-list.txt b/app/data/npm-package-list.txt index 34ec73f8..3def3d63 100644 --- a/app/data/npm-package-list.txt +++ b/app/data/npm-package-list.txt @@ -3,3 +3,5 @@ laconic-sdk debug laconic-registry-cli gem +debug +crypto From c4e3aa54f1253b06a8a06b295af7f0f860ba926a Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 24 Mar 2023 02:31:19 -0600 Subject: [PATCH 0318/1010] Remove trailing whitespace Former-commit-id: 2e7ef1e52eefbd4fc995cdc371be7930650a09c1 --- .../cerc-builder-js/build-npm-package-local-dependencies.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh b/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh index 7f372af7..47869e16 100755 --- a/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh +++ b/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh @@ -20,7 +20,7 @@ package_publish_version=$2 # If we need to handle an additional scope, add it to the list below: npm_scopes_to_handle=("@cerc-io" "@lirewine") for npm_scope_for_local in ${npm_scopes_to_handle[@]}; do - # We need to configure the local registry + # We need to configure the local registry npm config set ${npm_scope_for_local}:registry ${local_npm_registry_url} npm config set -- ${local_npm_registry_url}:_authToken ${CERC_NPM_AUTH_TOKEN} # Find the set of dependencies from the specified scope From aa01feb98a1878cdf08c8f8a31a94981f7f0b997 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 24 Mar 2023 02:52:37 -0600 Subject: [PATCH 0319/1010] Fix up script and npm list Former-commit-id: e6b91acdeacc5eb27e03fb7d12f13ad23cd7e681 --- .../cerc-builder-js/build-npm-package-local-dependencies.sh | 5 +++-- app/data/npm-package-list.txt | 2 -- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh b/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh index 47869e16..33b6c613 100755 --- a/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh +++ b/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh @@ -19,13 +19,14 @@ local_npm_registry_url=$1 package_publish_version=$2 # If we need to handle an additional scope, add it to the list below: npm_scopes_to_handle=("@cerc-io" "@lirewine") -for npm_scope_for_local in ${npm_scopes_to_handle[@]}; do +for npm_scope_for_local in ${npm_scopes_to_handle[@]} +do # We need to configure the local registry npm config set ${npm_scope_for_local}:registry ${local_npm_registry_url} npm config set -- ${local_npm_registry_url}:_authToken ${CERC_NPM_AUTH_TOKEN} # Find the set of dependencies from the specified scope mapfile -t dependencies_from_scope < <(cat package.json | jq -r '.dependencies | with_entries(if (.key|test("^'${npm_scope_for_local}'/.*$")) then ( {key: .key, value: .value } ) else empty end ) | keys[]') - echo "Fixing up dependencies" + echo "Fixing up dependencies in scope ${npm_scope_for_local}" for package in "${dependencies_from_scope[@]}" do echo "Fixing up package ${package}" diff --git a/app/data/npm-package-list.txt b/app/data/npm-package-list.txt index 3def3d63..3b6656be 100644 --- a/app/data/npm-package-list.txt +++ b/app/data/npm-package-list.txt @@ -1,6 +1,4 @@ -gem laconic-sdk -debug laconic-registry-cli gem debug From 2d64f49dc5e07b42d54ac731e242bc68196806bd Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 24 Mar 2023 02:59:03 -0600 Subject: [PATCH 0320/1010] Fix npm config Former-commit-id: 5b8c91d19d40d868d89c6037f9f498f003c8aab9 --- app/data/container-build/cerc-laconic-console-host/Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/data/container-build/cerc-laconic-console-host/Dockerfile b/app/data/container-build/cerc-laconic-console-host/Dockerfile index a3dc9b1f..5a62cc7d 100644 --- a/app/data/container-build/cerc-laconic-console-host/Dockerfile +++ b/app/data/container-build/cerc-laconic-console-host/Dockerfile @@ -40,8 +40,7 @@ RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ # RUN su node -c "npm install -g " # Configure the local npm registry -RUN npm config set @lirewine:registry ${CERC_NPM_URL} \ - && npm config set @cerc-io:registry ${CERC_NPM_URL} \ +RUN npm config set @cerc-io:registry ${CERC_NPM_URL} \ && npm config set @lirewine:registry ${CERC_NPM_URL} \ && npm config set -- ${CERC_NPM_URL}:_authToken ${CERC_NPM_AUTH_TOKEN} From 1951a5d3985fabdd7ab7335a97f46126685544b6 Mon Sep 17 00:00:00 2001 From: Nabarun Gogoi Date: Fri, 24 Mar 2023 17:23:54 +0530 Subject: [PATCH 0321/1010] Add web-apps and laconicd in MobyMask v2 watcher stack (#226) * Rename .env file * Add web app services to docker compose file * Add laconicd to deploy contract and send txs * Add demo with steps for running mobymask app with L2 chain * Add fix for yarn install on M1 platform in react-peer * Update multiaddrs to use websockets * Add notes in readmes --------- Co-authored-by: prathamesh0 Former-commit-id: cacd306b22dbd12096c3b78d3c4222a8b8772489 --- .../docker-compose-mobymask-laconicd.yml | 25 ++++ .../docker-compose-watcher-mobymask-v2.yml | 87 +++++++++++- app/data/config/watcher-mobymask-v2/.env | 1 - .../config/watcher-mobymask-v2/config.json | 8 -- .../mobymask-app-config.json | 8 ++ .../watcher-mobymask-v2/mobymask-app-start.sh | 9 ++ .../watcher-mobymask-v2/mobymask-app.env | 1 + .../config/watcher-mobymask-v2/peer-id.json | 5 + .../config/watcher-mobymask-v2/peer-start.sh | 10 ++ app/data/config/watcher-mobymask-v2/peer.env | 1 + .../config/watcher-mobymask-v2/secrets.json | 5 + .../watcher-mobymask-v2/test-app-config.json | 8 ++ .../config/watcher-mobymask-v2/watcher.toml | 4 +- .../cerc-mobymask-ui/Dockerfile | 4 +- .../container-build/cerc-mobymask/Dockerfile | 13 ++ .../container-build/cerc-mobymask/build.sh | 7 + .../cerc-react-peer/Dockerfile | 6 +- .../cerc-watcher-mobymask-v2/Dockerfile | 2 +- app/data/container-image-list.txt | 1 + app/data/pod-list.txt | 1 + app/data/repository-list.txt | 1 + app/data/stacks/mobymask-v2/README.md | 131 ++++++++++++++++-- app/data/stacks/mobymask-v2/demo.md | 130 +++++++++++++++++ app/data/stacks/mobymask-v2/stack.yml | 6 + 24 files changed, 449 insertions(+), 25 deletions(-) create mode 100644 app/data/compose/docker-compose-mobymask-laconicd.yml delete mode 100644 app/data/config/watcher-mobymask-v2/.env delete mode 100644 app/data/config/watcher-mobymask-v2/config.json create mode 100644 app/data/config/watcher-mobymask-v2/mobymask-app-config.json create mode 100755 app/data/config/watcher-mobymask-v2/mobymask-app-start.sh create mode 100644 app/data/config/watcher-mobymask-v2/mobymask-app.env create mode 100644 app/data/config/watcher-mobymask-v2/peer-id.json create mode 100755 app/data/config/watcher-mobymask-v2/peer-start.sh create mode 100644 app/data/config/watcher-mobymask-v2/peer.env create mode 100644 app/data/config/watcher-mobymask-v2/secrets.json create mode 100644 app/data/config/watcher-mobymask-v2/test-app-config.json create mode 100644 app/data/container-build/cerc-mobymask/Dockerfile create mode 100755 app/data/container-build/cerc-mobymask/build.sh create mode 100644 app/data/stacks/mobymask-v2/demo.md diff --git a/app/data/compose/docker-compose-mobymask-laconicd.yml b/app/data/compose/docker-compose-mobymask-laconicd.yml new file mode 100644 index 00000000..4847aeb3 --- /dev/null +++ b/app/data/compose/docker-compose-mobymask-laconicd.yml @@ -0,0 +1,25 @@ +version: "3.2" + +services: + laconicd: + restart: unless-stopped + image: cerc/laconicd:local + command: ["sh", "/docker-entrypoint-scripts.d/create-fixturenet.sh"] + volumes: + - ../config/fixturenet-laconicd/create-fixturenet.sh:/docker-entrypoint-scripts.d/create-fixturenet.sh + ports: + - "9473" + - "8545" + - "8546" + - "1317" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "8545"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 10s + +networks: + # https://docs.docker.com/compose/networking/#configure-the-default-network + default: + name: mobymask-v2-network diff --git a/app/data/compose/docker-compose-watcher-mobymask-v2.yml b/app/data/compose/docker-compose-watcher-mobymask-v2.yml index 250653f1..9835ada4 100644 --- a/app/data/compose/docker-compose-watcher-mobymask-v2.yml +++ b/app/data/compose/docker-compose-watcher-mobymask-v2.yml @@ -21,6 +21,26 @@ services: retries: 15 start_period: 10s + mobymask: + restart: unless-stopped + depends_on: + mobymask-watcher-db: + condition: service_healthy + image: cerc/mobymask:local + working_dir: /app/packages/server + environment: + - ENV=PROD + command: ["sh", "-c", "npm start"] + volumes: + - ../config/watcher-mobymask-v2/secrets.json:/app/packages/server/secrets.json + - moby_data_server:/app/packages/server + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "3330"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 10s + mobymask-watcher-server: restart: unless-stopped depends_on: @@ -30,18 +50,81 @@ services: command: ["sh", "-c", "yarn server"] volumes: - ../config/watcher-mobymask-v2/watcher.toml:/app/packages/mobymask-v2-watcher/environments/local.toml - - ../config/watcher-mobymask-v2/.env:/app/packages/peer/.env + - ../config/watcher-mobymask-v2/peer.env:/app/packages/peer/.env - ../config/watcher-mobymask-v2/relay-id.json:/app/packages/mobymask-v2-watcher/relay-id.json ports: - "0.0.0.0:3001:3001" - "0.0.0.0:9001:9001" - "0.0.0.0:9090:9090" healthcheck: - test: ["CMD", "nc", "-v", "localhost", "9090"] + test: ["CMD", "busybox", "nc", "localhost", "9090"] interval: 20s timeout: 5s retries: 15 start_period: 5s + mobymask-watcher-peer: + restart: unless-stopped + depends_on: + mobymask: + condition: service_healthy + image: cerc/watcher-mobymask-v2:local + command: ["sh", "peer-start.sh"] + volumes: + - ../config/watcher-mobymask-v2/watcher.toml:/app/packages/mobymask-v2-watcher/environments/local.toml + - ../config/watcher-mobymask-v2/peer-id.json:/app/packages/mobymask-v2-watcher/peer-id.json + - ../config/watcher-mobymask-v2/peer-start.sh:/app/packages/mobymask-v2-watcher/peer-start.sh + - moby_data_server:/server + + mobymask-app: + depends_on: + mobymask-watcher-server: + condition: service_healthy + mobymask: + condition: service_healthy + image: cerc/mobymask-ui:local + command: ["sh", "mobymask-app-start.sh"] + volumes: + - ../config/watcher-mobymask-v2/mobymask-app.env:/app/.env + - ../config/watcher-mobymask-v2/mobymask-app-config.json:/app/src/mobymask-app-config.json + - ../config/watcher-mobymask-v2/mobymask-app-start.sh:/app/mobymask-app-start.sh + - moby_data_server:/server + ports: + - "0.0.0.0:3002:3000" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "3000"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 10s + shm_size: '1GB' + + peer-test-app: + depends_on: + mobymask-watcher-server: + condition: service_healthy + image: cerc/react-peer:local + working_dir: /app/packages/test-app + command: ["sh", "-c", "yarn build && serve -s build"] + volumes: + - ../config/watcher-mobymask-v2/test-app-config.json:/app/packages/test-app/src/config.json + ports: + - "0.0.0.0:3003:3000" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "3000"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 10s + volumes: mobymask_watcher_db_data: + moby_data_server: + +networks: + # https://docs.docker.com/compose/networking/#configure-the-default-network + default: + # https://docs.docker.com/compose/networking/#use-a-pre-existing-network + name: mobymask-v2-network + external: true + diff --git a/app/data/config/watcher-mobymask-v2/.env b/app/data/config/watcher-mobymask-v2/.env deleted file mode 100644 index 05af7658..00000000 --- a/app/data/config/watcher-mobymask-v2/.env +++ /dev/null @@ -1 +0,0 @@ -RELAY="/ip4/127.0.0.1/tcp/9090/http/p2p-webrtc-direct/p2p/12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t" diff --git a/app/data/config/watcher-mobymask-v2/config.json b/app/data/config/watcher-mobymask-v2/config.json deleted file mode 100644 index 35c6f609..00000000 --- a/app/data/config/watcher-mobymask-v2/config.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "relayNodes": [ - "/ip4/127.0.0.1/tcp/9090/http/p2p-webrtc-direct/p2p/12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t" - ], - "peer": { - "enableDebugInfo": true - } -} diff --git a/app/data/config/watcher-mobymask-v2/mobymask-app-config.json b/app/data/config/watcher-mobymask-v2/mobymask-app-config.json new file mode 100644 index 00000000..3b00674f --- /dev/null +++ b/app/data/config/watcher-mobymask-v2/mobymask-app-config.json @@ -0,0 +1,8 @@ +{ + "relayNodes": [ + "/ip4/127.0.0.1/tcp/9090/ws/p2p/12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t" + ], + "peer": { + "enableDebugInfo": true + } +} diff --git a/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh b/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh new file mode 100755 index 00000000..fa3870cf --- /dev/null +++ b/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh @@ -0,0 +1,9 @@ +#!/bin/sh +set -e + +# Merging config files to get deployed contract address +jq -s '.[0] * .[1]' /app/src/mobymask-app-config.json /server/config.json > /app/src/config.json + +npm run build + +serve -s build diff --git a/app/data/config/watcher-mobymask-v2/mobymask-app.env b/app/data/config/watcher-mobymask-v2/mobymask-app.env new file mode 100644 index 00000000..698d3502 --- /dev/null +++ b/app/data/config/watcher-mobymask-v2/mobymask-app.env @@ -0,0 +1 @@ +REACT_APP_WATCHER_URI=http://localhost:3001/graphql diff --git a/app/data/config/watcher-mobymask-v2/peer-id.json b/app/data/config/watcher-mobymask-v2/peer-id.json new file mode 100644 index 00000000..ceb55fc0 --- /dev/null +++ b/app/data/config/watcher-mobymask-v2/peer-id.json @@ -0,0 +1,5 @@ +{ + "id": "12D3KooWK6myjc8r1KBnfP9igp31qJkPaVfsKDjKrjoSefV5SDEo", + "privKey": "CAESQJMHbMaH+UEOtjGOzXYtoPO/cdHakCtN1hcnknIWzx/6ie1lxb+8kfzBjwt7apfj8fHlTCYSIVK8Q2AWu9a2h3g=", + "pubKey": "CAESIIntZcW/vJH8wY8Le2qX4/Hx5UwmEiFSvENgFrvWtod4" +} diff --git a/app/data/config/watcher-mobymask-v2/peer-start.sh b/app/data/config/watcher-mobymask-v2/peer-start.sh new file mode 100755 index 00000000..9749f97a --- /dev/null +++ b/app/data/config/watcher-mobymask-v2/peer-start.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +# Private key of account with balance +PRIVATE_KEY= + +# Assign deployed contract address from server config +CONTRACT_ADDRESS=`jq '.address' /server/config.json` + +echo 'yarn peer-listener --contract-address --private-key ' +yarn peer-listener --contract-address $CONTRACT_ADDRESS --private-key $PRIVATE_KEY diff --git a/app/data/config/watcher-mobymask-v2/peer.env b/app/data/config/watcher-mobymask-v2/peer.env new file mode 100644 index 00000000..4cce4d9a --- /dev/null +++ b/app/data/config/watcher-mobymask-v2/peer.env @@ -0,0 +1 @@ +RELAY="/ip4/127.0.0.1/tcp/9090/ws/p2p/12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t" diff --git a/app/data/config/watcher-mobymask-v2/secrets.json b/app/data/config/watcher-mobymask-v2/secrets.json new file mode 100644 index 00000000..127735cd --- /dev/null +++ b/app/data/config/watcher-mobymask-v2/secrets.json @@ -0,0 +1,5 @@ +{ + "rpcUrl": "http://laconicd:8545", + "privateKey": "GENESIS_ACCOUNT_PRIVATE_KEY", + "baseURI": "http://127.0.0.1:3002/#" +} diff --git a/app/data/config/watcher-mobymask-v2/test-app-config.json b/app/data/config/watcher-mobymask-v2/test-app-config.json new file mode 100644 index 00000000..3b00674f --- /dev/null +++ b/app/data/config/watcher-mobymask-v2/test-app-config.json @@ -0,0 +1,8 @@ +{ + "relayNodes": [ + "/ip4/127.0.0.1/tcp/9090/ws/p2p/12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t" + ], + "peer": { + "enableDebugInfo": true + } +} diff --git a/app/data/config/watcher-mobymask-v2/watcher.toml b/app/data/config/watcher-mobymask-v2/watcher.toml index f765db61..3f50d137 100644 --- a/app/data/config/watcher-mobymask-v2/watcher.toml +++ b/app/data/config/watcher-mobymask-v2/watcher.toml @@ -31,7 +31,7 @@ enableDebugInfo = true [server.p2p.peer] - relayMultiaddr = '/ip4/mobymask-watcher-server/tcp/9090/http/p2p-webrtc-direct/p2p/12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t' + relayMultiaddr = '/dns4/mobymask-watcher-server/tcp/9090/ws/p2p/12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t' pubSubTopic = 'mobymask' peerIdFile = './peer-id.json' enableDebugInfo = true @@ -55,7 +55,7 @@ [upstream] [upstream.ethServer] gqlApiEndpoint = "http://ipld-eth-server:8083/graphql" - rpcProviderEndpoint = "http://ipld-eth-server:8082" + rpcProviderEndpoint = "http://laconicd:8545" blockDelayInMilliSecs = 60000 [upstream.cache] diff --git a/app/data/container-build/cerc-mobymask-ui/Dockerfile b/app/data/container-build/cerc-mobymask-ui/Dockerfile index 86a056b7..68e3c77c 100644 --- a/app/data/container-build/cerc-mobymask-ui/Dockerfile +++ b/app/data/container-build/cerc-mobymask-ui/Dockerfile @@ -1,11 +1,13 @@ FROM node:18.15.0-alpine3.16 -RUN apk --update --no-cache add make git +RUN apk --update --no-cache add make git jq WORKDIR /app COPY . . +RUN npm install -g serve + RUN echo "Building mobymask-ui" && \ npm install diff --git a/app/data/container-build/cerc-mobymask/Dockerfile b/app/data/container-build/cerc-mobymask/Dockerfile new file mode 100644 index 00000000..e7b09cf8 --- /dev/null +++ b/app/data/container-build/cerc-mobymask/Dockerfile @@ -0,0 +1,13 @@ +FROM node:16.17.1-alpine3.16 + +RUN apk --update --no-cache add python3 alpine-sdk + +WORKDIR /app + +COPY . . + +RUN yarn + +# Add scripts +RUN mkdir /scripts +ENV PATH="${PATH}:/scripts" diff --git a/app/data/container-build/cerc-mobymask/build.sh b/app/data/container-build/cerc-mobymask/build.sh new file mode 100755 index 00000000..7628a228 --- /dev/null +++ b/app/data/container-build/cerc-mobymask/build.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# Build cerc/mobymask + +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t cerc/mobymask:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/MobyMask diff --git a/app/data/container-build/cerc-react-peer/Dockerfile b/app/data/container-build/cerc-react-peer/Dockerfile index 2511d623..cc852441 100644 --- a/app/data/container-build/cerc-react-peer/Dockerfile +++ b/app/data/container-build/cerc-react-peer/Dockerfile @@ -1,12 +1,14 @@ FROM node:18.15.0-alpine3.16 -RUN apk --update --no-cache add make git +RUN apk --update --no-cache add make git python3 WORKDIR /app COPY . . +RUN yarn global add serve + RUN echo "Building react-peer" && \ - yarn && yarn workspace @cerc-io/react-peer build + yarn install --ignore-scripts && yarn build --ignore @cerc-io/test-app WORKDIR /app diff --git a/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile b/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile index 501c8f10..18aff5cd 100644 --- a/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile +++ b/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile @@ -4,7 +4,7 @@ RUN apt-get update \ && apt-get install -y curl gnupg build-essential \ && curl --silent --location https://deb.nodesource.com/setup_18.x | bash - \ && apt-get update \ - && apt-get install -y nodejs git \ + && apt-get install -y nodejs git busybox jq \ && node -v RUN corepack enable \ diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index 58e5e054..4dc4b137 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -21,6 +21,7 @@ cerc/uniswap-v3-info cerc/watcher-mobymask-v2 cerc/react-peer cerc/mobymask-ui +cerc/mobymask cerc/test-container cerc/eth-probe cerc/builder-js diff --git a/app/data/pod-list.txt b/app/data/pod-list.txt index 99974fa6..abb4ab1f 100644 --- a/app/data/pod-list.txt +++ b/app/data/pod-list.txt @@ -15,6 +15,7 @@ watcher-erc20 watcher-erc721 watcher-uniswap-v3 watcher-mobymask-v2 +mobymask-laconicd test eth-probe keycloak diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index 2922d8cb..440d093a 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -13,6 +13,7 @@ cerc-io/mobymask-watcher cerc-io/watcher-ts cerc-io/react-peer cerc-io/mobymask-ui +cerc-io/MobyMask vulcanize/uniswap-watcher-ts vulcanize/uniswap-v3-info vulcanize/assemblyscript diff --git a/app/data/stacks/mobymask-v2/README.md b/app/data/stacks/mobymask-v2/README.md index 82886783..83bfd259 100644 --- a/app/data/stacks/mobymask-v2/README.md +++ b/app/data/stacks/mobymask-v2/README.md @@ -10,6 +10,30 @@ Clone required repositories: laconic-so --stack mobymask-v2 setup-repositories ``` +Checkout to the required versions and branches in repos + +```bash +# watcher-ts +cd ~/cerc/watcher-ts +git checkout v0.2.31 + +# react-peer +cd ~/cerc/react-peer +git checkout v0.2.29 + +# mobymask-ui +cd ~/cerc/mobymask-ui +git checkout laconic + +# laconicd +cd ~/cerc/laconicd +git checkout v0.8.0 + +# MobyMask +cd ~/cerc/MobyMask +git checkout v0.1.1 +``` + Build the container images: ```bash @@ -20,25 +44,75 @@ This should create the required docker images in the local image registry. Deploy the stack: -```bash -laconic-so --stack mobymask-v2 deploy-system up -``` +* Deploy the laconic chain + + ```bash + laconic-so --stack mobymask-v2 deploy-system --include mobymask-laconicd up + ``` + +* Check that laconic chain status is healthy + + ```bash + docker ps + ``` + +* Export the private key from laconicd + + ```bash + laconic-so --stack mobymask-v2 deploy-system --include mobymask-laconicd exec laconicd "echo y | laconicd keys export mykey --unarmored-hex --unsafe" + ``` + +* Set the private key in [secrets.json](../../config/watcher-mobymask-v2/secrets.json) file that will be used by mobymask container to deploy contract + +* Create a new account + + ```bash + laconic-so --stack mobymask-v2 deploy-system --include mobymask-laconicd exec laconicd "laconicd keys add alice" + ``` + +* Transfer balance to new account + + ```bash + laconic-so --stack mobymask-v2 deploy-system --include mobymask-laconicd exec laconicd 'laconicd tx bank send $(laconicd keys show mykey -a) $(laconicd keys show alice -a) 1000000000000000000000000aphoton --fees 2000aphoton' + ``` + +* Export the private key of new account from laconicd + + ```bash + laconic-so --stack mobymask-v2 deploy-system --include mobymask-laconicd exec laconicd "echo y | laconicd keys export alice --unarmored-hex --unsafe" + ``` + +* Set the private key (`PRIVATE_KEY`) in [peer-start.sh](../../config/watcher-mobymask-v2/peer-start.sh) file that will be used to start the peer that sends txs to L2 chain + +* Deploy the other containers + + ```bash + laconic-so --stack mobymask-v2 deploy-system --include watcher-mobymask-v2 up + ``` + +* Check that all containers are healthy using `docker ps` + + NOTE: The `mobymask-ui` container might not start. If mobymask-app is not running at http://localhost:3002, run command again to start the container + + ```bash + laconic-so --stack mobymask-v2 deploy-system --include watcher-mobymask-v2 up + ``` ## Tests Find the watcher container's id: ```bash -docker ps | grep "cerc/watcher-mobymask-v2:local" +laconic-so --stack mobymask-v2 deploy-system --include watcher-mobymask-v2 ps | grep "mobymask-watcher-server" ``` Example output ``` -8b38e9a64d7e cerc/watcher-mobymask-v2:local "sh -c 'yarn server'" 35 seconds ago Up 14 seconds (health: starting) 0.0.0.0:3001->3001/tcp, 0.0.0.0:9001->9001/tcp, 0.0.0.0:9090->9090/tcp laconic-aeb84676de2b0a7671ae90d537fc7d26-mobymask-watcher-server-1 +id: 5d3aae4b22039fcd1c9b18feeb91318ede1100581e75bb5ac54f9e436066b02c, name: laconic-bfb01caf98b1b8f7c8db4d33f11b905a-mobymask-watcher-server-1, ports: 0.0.0.0:3001->3001/tcp, 0.0.0.0:9001->9001/tcp, 0.0.0.0:9090->9090/tcp ``` -In above output the container ID is `8b38e9a64d7e` +In above output the container ID is `5d3aae4b22039fcd1c9b18feeb91318ede1100581e75bb5ac54f9e436066b02c` Export it for later use: @@ -52,10 +126,51 @@ Run the peer tests: docker exec -w /app/packages/peer $CONTAINER_ID yarn test ``` +## Web Apps + +Check that the status for web-app containers are healthy by using `docker ps` + +### mobymask-app + +The mobymask-app should be running at http://localhost:3002 + +### peer-test-app + +The peer-test-app should be running at http://localhost:3003 + +## Details + +* The relay node for p2p network is running at http://localhost:9090 + +* The [peer package](https://github.com/cerc-io/watcher-ts/tree/main/packages/peer) (published in [gitea](https://git.vdb.to/cerc-io/-/packages/npm/@cerc-io%2Fpeer)) can be used in client code for connecting to the network + +* The [react-peer package](https://github.com/cerc-io/react-peer/tree/main/packages/react-peer) (published in [gitea](https://git.vdb.to/cerc-io/-/packages/npm/@cerc-io%2Freact-peer)) which uses the peer package can be used in react app for connecting to the network + +## Demo + +Follow the [demo](./demo.md) to try out the MobyMask app with L2 chain + ## Clean up -To stop all the services running in background run: +Stop all the services running in background run: ```bash -laconic-so --stack mobymask-v2 deploy-system down +laconic-so --stack mobymask-v2 deploy-system --include watcher-mobymask-v2 down + +laconic-so --stack mobymask-v2 deploy-system --include mobymask-laconicd down ``` + +Clear volumes: + +* List all volumes + + ```bash + docker volume ls + ``` + +* Remove volumes created by this stack + + Example: + ```bash + docker volume rm laconic-bfb01caf98b1b8f7c8db4d33f11b905a_moby_data_server + ``` diff --git a/app/data/stacks/mobymask-v2/demo.md b/app/data/stacks/mobymask-v2/demo.md new file mode 100644 index 00000000..af5ec2d0 --- /dev/null +++ b/app/data/stacks/mobymask-v2/demo.md @@ -0,0 +1,130 @@ +# Demo + +* Get the root invite link URL for mobymask-app + + ``` + laconic-so --stack mobymask-v2 deploy-system --include watcher-mobymask-v2 logs mobymask + ``` + + NOTE: Clear the browser cache (local storage) for http://127.0.0.1:3002 to remove old invitations + + The invite link is seen at the end of the logs + Example: + ``` + laconic-bfb01caf98b1b8f7c8db4d33f11b905a-mobymask-1 | http://127.0.0.1:3002/#/members?invitation=%7B%22v%22%3A1%2C%22signedDelegations%22%3A%5B%7B%22signature%22%3A%220x7559bd412f02677d60820e38243acf61547f79339395a34f7d4e1630e645aeb30535fc219f79b6fbd3af0ce3bd05132ad46d2b274a9fbc4c36bc71edd09850891b%22%2C%22delegation%22%3A%7B%22delegate%22%3A%220xc0838c92B2b71756E0eAD5B3C1e1F186baeEAAac%22%2C%22authority%22%3A%220x0000000000000000000000000000000000000000000000000000000000000000%22%2C%22caveats%22%3A%5B%7B%22enforcer%22%3A%220x558024C7d593B840E1BfD83E9B287a5CDad4db15%22%2C%22terms%22%3A%220x0000000000000000000000000000000000000000000000000000000000000000%22%7D%5D%7D%7D%5D%2C%22key%22%3A%220x98da9805821f1802196443e578fd32af567bababa0a249c07c82df01ecaa7d8d%22%7D + ``` + +* In the debug panel, check if it is connected to the p2p network (It should be connected to atleast one other peer for pubsub to work). + +* Create an invite link in the app by clicking on `Create new invite link` button. + +* Switch to the `MESSAGES` tab in debug panel for viewing incoming messages later. + +* Open the invite link in a new browser with different profile (to simulate remote browser) + * Check that it is connected to any other peer in the network. + +* In `Report a phishing attempt` section, report multiple phishers using the `submit` button. Click on the `Submit batch to p2p network` button. This broadcasts signed invocations to the connected peers. + +* In the `MESSAGES` tab of other browsers, a message can be seen with the signed invocations. + +* In a terminal check logs from the watcher peer container. + + * Get the container id + + ```bash + laconic-so --stack mobymask-v2 deploy-system --include watcher-mobymask-v2 ps | grep mobymask-watcher-peer + ``` + + * Check logs + + ```bash + docker logs -f CONTAINER_ID + ``` + +* It should have received the message, sent transaction to L2 chain and received a transaction receipt with block details. + + Example log: + + ``` + 2023-03-23T10:25:19.771Z vulcanize:peer-listener [10:25:19] Received a message on mobymask P2P network from peer: PeerId(12D3KooWAVNswtcrX12iDYukEoxdQwD34kJyRWcQTfZ4unGg2xjd) + 2023-03-23T10:25:24.143Z laconic:libp2p-utils Transaction receipt for invoke message { + to: '0x558024C7d593B840E1BfD83E9B287a5CDad4db15', + blockNumber: 1996, + blockHash: '0xebef19c21269654804b2ef2d4bb5cb6c88743b37ed77e82222dc5671debf3afb', + transactionHash: '0xf8c5a093a93f793012196073a7d0cb3ed6fbd2846126c066cb31c72100960cb1', + effectiveGasPrice: '1500000007', + gasUsed: '250000' + } + ``` + +* Check the phisher in watcher GQL: http://localhost:3001/graphql + * Use the blockHash from transaction receipt details or query for latest block + + ```gql + query { + latestBlock { + hash + number + } + } + ``` + + * Get the deployed contract address + + ```bash + laconic-so --stack mobymask-v2 deploy-system --include watcher-mobymask-v2 exec mobymask-app "cat src/config.json" + ``` + + The value of `address` field is the deployed contract address + + * Check for phisher value + + ```gql + query { + isPhisher( + blockHash: "TX_OR_LATEST_BLOCK_HASH", + contractAddress: "CONTRACT_ADDRESS", + # If reported phisher name was "test" then key0 value is "TWT:test" + key0: "TWT:PHISHER_NAME" + ) { + value + } + } + ``` + + It should return true for reported phisher names. + + * Watcher internally is using L2 chain `eth_getStorageAt` method. + +* Check the phisher name in mobymask app in `Check Phisher Status` section. + * Watcher GQL API is used for checking phisher. + +* Manage the invitations by clicking on the `Outstanding Invitations in p2p network`. + +* Revoke the created invitation by clicking on `Revoke (p2p network)` + +* Revocation messages can be seen in the debug panel `MESSAGES` tab of other browsers. + +* Check the watcher peer logs. It should receive a message and log the transaction receipt for revoke message. + +* Try reporting a phisher from the revoked invitee's browser. + + * The invocation message for reporting phisher would be broadcasted to all peers. + + * Check the watcher peer logs. A transaction failed error should be logged. + + * Check the reported phisher in [watcher GQL](https://localhost:3001/graphql) + + ```gql + query { + isPhisher( + blockHash: "LATEST_BLOCK_HASH", + contractAddress: "CONTRACT_ADDRESS", + key0: "TWT:PHISHER_NAME" + ) { + value + } + } + ``` + + It should return false as the invitation/delegation used for reporting phishers has been revoked. diff --git a/app/data/stacks/mobymask-v2/stack.yml b/app/data/stacks/mobymask-v2/stack.yml index c9b13aa5..e3b36bfe 100644 --- a/app/data/stacks/mobymask-v2/stack.yml +++ b/app/data/stacks/mobymask-v2/stack.yml @@ -4,8 +4,14 @@ repos: - cerc-io/watcher-ts - cerc-io/react-peer - cerc-io/mobymask-ui + - cerc-io/laconicd + - cerc-io/MobyMask containers: - cerc/watcher-mobymask-v2 + - cerc/react-peer - cerc/mobymask-ui + - cerc/laconicd + - cerc/mobymask pods: + - mobymask-laconicd - watcher-mobymask-v2 From af44d005c3cba2463cdc6ad9bd3dc13bbe137124 Mon Sep 17 00:00:00 2001 From: Zach Date: Fri, 24 Mar 2023 08:56:01 -0400 Subject: [PATCH 0322/1010] doc jq requirement Former-commit-id: a5dd62e457c1ef1a865e96fe190c2aeb8834cd97 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6eb5b94d..607a41bb 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ Ensure that the following are already installed: - [Python3](https://wiki.python.org/moin/BeginnersGuide/Download): `python3 --version` >= `3.8.10` (the Python3 shipped in Ubuntu 20+ is good to go) - [Docker](https://docs.docker.com/get-docker/): `docker --version` >= `20.10.21` +- [jq](https://stedolan.github.io/jq/download/): `jq --version` >= `1.5` Note: if installing docker-compose via package manager on Linux (as opposed to Docker Desktop), you must [install the plugin](https://docs.docker.com/compose/install/linux/#install-the-plugin-manually), e.g. : From 38feddb266cff066e670652aadac24ff45af7b18 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 24 Mar 2023 10:26:48 -0600 Subject: [PATCH 0323/1010] Update version file Former-commit-id: 07de83e6d7a1495659260ccb62e4d84a81c7fb65 --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index df76da3b..14872d47 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.29-5fca9bd +v1.0.30-3d03b10 From e608dca17590f9d883fd3644b55e7a67bf6c56ef Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 24 Mar 2023 17:31:41 -0600 Subject: [PATCH 0324/1010] Add sdk repo and npm Former-commit-id: f67e367ead160ec27ac2ac894be2cdfa8bf058ff --- app/data/npm-package-list.txt | 1 + app/data/repository-list.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/app/data/npm-package-list.txt b/app/data/npm-package-list.txt index 3b6656be..f7c43b73 100644 --- a/app/data/npm-package-list.txt +++ b/app/data/npm-package-list.txt @@ -3,3 +3,4 @@ laconic-registry-cli gem debug crypto +sdk diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index 2922d8cb..5abfca75 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -22,3 +22,4 @@ dboreham/foundry lirewine/gem lirewine/debug lirewine/crypto +lirewine/sdk From 5767b93e6aa543843ca2387c31c0d3b1c59d9ac6 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 24 Mar 2023 18:23:35 -0600 Subject: [PATCH 0325/1010] Use our locally built foundry container Former-commit-id: da24a4edf66f9475d5f7c730ff0342b52cd7fa4c --- app/data/container-build/cerc-go-ethereum-foundry/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/container-build/cerc-go-ethereum-foundry/Dockerfile b/app/data/container-build/cerc-go-ethereum-foundry/Dockerfile index bbbc64fc..b9a5a30b 100644 --- a/app/data/container-build/cerc-go-ethereum-foundry/Dockerfile +++ b/app/data/container-build/cerc-go-ethereum-foundry/Dockerfile @@ -1,4 +1,4 @@ -FROM ghcr.io/foundry-rs/foundry +FROM cerc/foundry:local RUN apk update ; apk add --no-cache --allow-untrusted ca-certificates curl bash git jq RUN apk add --no-cache --upgrade grep From 741b2257067a318c344fc79c063f4620f70f62ce Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 24 Mar 2023 19:32:41 -0600 Subject: [PATCH 0326/1010] Console host container builds Former-commit-id: 4ad2729ae8d8b009254756a703e49ce4b814f0ef --- app/data/npm-package-list.txt | 3 ++- app/data/repository-list.txt | 1 + app/data/stacks/fixturenet-laconic-loaded/stack.yml | 4 ++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/data/npm-package-list.txt b/app/data/npm-package-list.txt index f7c43b73..f194e627 100644 --- a/app/data/npm-package-list.txt +++ b/app/data/npm-package-list.txt @@ -1,6 +1,7 @@ laconic-sdk laconic-registry-cli -gem +laconic-console debug crypto sdk +gem diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index 59dcb3d4..0f2f9768 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -9,6 +9,7 @@ cerc-io/ipld-eth-beacon-db cerc-io/laconicd cerc-io/laconic-sdk cerc-io/laconic-registry-cli +cerc-io/laconic-console cerc-io/mobymask-watcher cerc-io/watcher-ts cerc-io/react-peer diff --git a/app/data/stacks/fixturenet-laconic-loaded/stack.yml b/app/data/stacks/fixturenet-laconic-loaded/stack.yml index 345430f0..efa3b199 100644 --- a/app/data/stacks/fixturenet-laconic-loaded/stack.yml +++ b/app/data/stacks/fixturenet-laconic-loaded/stack.yml @@ -3,6 +3,10 @@ name: fixturenet-laconic-loaded description: "A full featured laconic fixturenet" repos: - cerc-io/laconicd + - lirewine/debug + - lirewine/crypto + - lirewine/gem + - lirewine/sdk - cerc-io/laconic-sdk - cerc-io/laconic-registry-cli - cerc-io/laconic-console From aa7697dd3e3c060a81f66ea4359fc29611e6f3c1 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sat, 25 Mar 2023 12:07:44 -0600 Subject: [PATCH 0327/1010] Add lirewine packages Former-commit-id: ca82d39c0cf9217bd5ebce29f810fc78b3195323 --- app/data/stacks/fixturenet-laconic-loaded/stack.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/data/stacks/fixturenet-laconic-loaded/stack.yml b/app/data/stacks/fixturenet-laconic-loaded/stack.yml index efa3b199..12fe28b7 100644 --- a/app/data/stacks/fixturenet-laconic-loaded/stack.yml +++ b/app/data/stacks/fixturenet-laconic-loaded/stack.yml @@ -13,6 +13,10 @@ repos: npms: - laconic-sdk - laconic-registry-cli + - debug + - crypto + - sdk + - gem - laconic-console containers: - cerc/laconicd From 788b2141168e3e16aa78d76d1b0f73a82f536853 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Fri, 24 Mar 2023 22:24:40 -0500 Subject: [PATCH 0328/1010] Add Gitea action support via act_runner. Former-commit-id: 74077d7704109802824dbb8f2e30709a3e1321b8 --- .../container-build/cerc-act_runner-task-executor/build.sh | 3 +++ app/data/container-build/cerc-act_runner/build.sh | 3 +++ app/data/container-image-list.txt | 2 ++ app/data/repository-list.txt | 1 + app/data/stacks/package-registry/stack.yml | 4 ++++ 5 files changed, 13 insertions(+) create mode 100755 app/data/container-build/cerc-act_runner-task-executor/build.sh create mode 100755 app/data/container-build/cerc-act_runner/build.sh diff --git a/app/data/container-build/cerc-act_runner-task-executor/build.sh b/app/data/container-build/cerc-act_runner-task-executor/build.sh new file mode 100755 index 00000000..9d357b30 --- /dev/null +++ b/app/data/container-build/cerc-act_runner-task-executor/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +# Build a local version of the task executor for act_runner +docker build -t cerc/act_runner-task-executor:local -f ${CERC_REPO_BASE_DIR}/act_runner/Dockerfile.task-executor ${CERC_REPO_BASE_DIR}/act_runner diff --git a/app/data/container-build/cerc-act_runner/build.sh b/app/data/container-build/cerc-act_runner/build.sh new file mode 100755 index 00000000..025dc7a7 --- /dev/null +++ b/app/data/container-build/cerc-act_runner/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +# Build a local version of the act_runner image +docker build -t cerc/act_runner:local -f ${CERC_REPO_BASE_DIR}/act_runner/Dockerfile ${CERC_REPO_BASE_DIR}/act_runner diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index 4dc4b137..974a6936 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -28,3 +28,5 @@ cerc/builder-js cerc/keycloak cerc/tx-spammer cerc/builder-gerbil +cerc/act_runner +cerc/act_runner-task-executor diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index 440d093a..cc78b080 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -23,3 +23,4 @@ dboreham/foundry lirewine/gem lirewine/debug lirewine/crypto +telackey/act_runner diff --git a/app/data/stacks/package-registry/stack.yml b/app/data/stacks/package-registry/stack.yml index 771149ed..22720cac 100644 --- a/app/data/stacks/package-registry/stack.yml +++ b/app/data/stacks/package-registry/stack.yml @@ -3,6 +3,10 @@ name: package-registry decription: "Local Package Registry" repos: - cerc-io/hosting + - telackey/act_runner +containers: + - cerc/act_runner + - cerc/act_runner-task-executor pods: - name: gitea repository: cerc-io/hosting From 16ff576413a1e0f4c5e233894339b8f2513c763b Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sat, 25 Mar 2023 18:26:21 -0600 Subject: [PATCH 0329/1010] Use dashes not underscore to match docker-compose file in hosting repo and convention Former-commit-id: 022afdc352cb61cecb57db7bbc7282efef111818 --- .../container-build/cerc-act-runner-task-executor/build.sh | 3 +++ app/data/container-build/cerc-act-runner/build.sh | 3 +++ .../container-build/cerc-act_runner-task-executor/build.sh | 3 --- app/data/container-build/cerc-act_runner/build.sh | 3 --- app/data/stacks/package-registry/stack.yml | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) create mode 100755 app/data/container-build/cerc-act-runner-task-executor/build.sh create mode 100755 app/data/container-build/cerc-act-runner/build.sh delete mode 100755 app/data/container-build/cerc-act_runner-task-executor/build.sh delete mode 100755 app/data/container-build/cerc-act_runner/build.sh diff --git a/app/data/container-build/cerc-act-runner-task-executor/build.sh b/app/data/container-build/cerc-act-runner-task-executor/build.sh new file mode 100755 index 00000000..843e86af --- /dev/null +++ b/app/data/container-build/cerc-act-runner-task-executor/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +# Build a local version of the task executor for act-runner +docker build -t cerc/act-runner-task-executor:local -f ${CERC_REPO_BASE_DIR}/act_runner/Dockerfile.task-executor ${CERC_REPO_BASE_DIR}/act_runner diff --git a/app/data/container-build/cerc-act-runner/build.sh b/app/data/container-build/cerc-act-runner/build.sh new file mode 100755 index 00000000..2fdb3f2e --- /dev/null +++ b/app/data/container-build/cerc-act-runner/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +# Build a local version of the act-runner image +docker build -t cerc/act-runner:local -f ${CERC_REPO_BASE_DIR}/act_runner/Dockerfile ${CERC_REPO_BASE_DIR}/act_runner diff --git a/app/data/container-build/cerc-act_runner-task-executor/build.sh b/app/data/container-build/cerc-act_runner-task-executor/build.sh deleted file mode 100755 index 9d357b30..00000000 --- a/app/data/container-build/cerc-act_runner-task-executor/build.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash -# Build a local version of the task executor for act_runner -docker build -t cerc/act_runner-task-executor:local -f ${CERC_REPO_BASE_DIR}/act_runner/Dockerfile.task-executor ${CERC_REPO_BASE_DIR}/act_runner diff --git a/app/data/container-build/cerc-act_runner/build.sh b/app/data/container-build/cerc-act_runner/build.sh deleted file mode 100755 index 025dc7a7..00000000 --- a/app/data/container-build/cerc-act_runner/build.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash -# Build a local version of the act_runner image -docker build -t cerc/act_runner:local -f ${CERC_REPO_BASE_DIR}/act_runner/Dockerfile ${CERC_REPO_BASE_DIR}/act_runner diff --git a/app/data/stacks/package-registry/stack.yml b/app/data/stacks/package-registry/stack.yml index 22720cac..596f6e72 100644 --- a/app/data/stacks/package-registry/stack.yml +++ b/app/data/stacks/package-registry/stack.yml @@ -5,8 +5,8 @@ repos: - cerc-io/hosting - telackey/act_runner containers: - - cerc/act_runner - - cerc/act_runner-task-executor + - cerc/act-runner + - cerc/act-runner-task-executor pods: - name: gitea repository: cerc-io/hosting From e7c5d5157e0aeddf7a6477c401664bfed680fc8b Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sat, 25 Mar 2023 18:57:36 -0600 Subject: [PATCH 0330/1010] Fix missing container name change Former-commit-id: e70dca7687ec04936a630729f1abe05179f9bcb6 --- app/data/container-image-list.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index 974a6936..8be9f085 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -28,5 +28,5 @@ cerc/builder-js cerc/keycloak cerc/tx-spammer cerc/builder-gerbil -cerc/act_runner -cerc/act_runner-task-executor +cerc/act-runner +cerc/act-runner-task-executor From 97da39c68be43d7faaac9594876586bb9f5a627e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 26 Mar 2023 21:35:01 -0600 Subject: [PATCH 0331/1010] Update version Former-commit-id: 3706dfd7db3f6b7f3c51d9e4ed8dfd05677ca67e --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index 14872d47..bce03635 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.30-3d03b10 +v1.0.31-e70dca7 From bed5e262cc02eb59a0371d687350bc555a99b88c Mon Sep 17 00:00:00 2001 From: Nabarun Gogoi Date: Mon, 27 Mar 2023 11:17:12 +0530 Subject: [PATCH 0332/1010] Add missing notes and steps in mobymask-v2 stack readme (#241) * Add missing notes and steps in readme * Mention clearing of browser cache before opening invite link Former-commit-id: 1aeb44d5ad0f112685ef3b239a3ec3e5dffca257 --- app/data/stacks/mobymask-v2/README.md | 3 +++ app/data/stacks/mobymask-v2/demo.md | 6 ++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/data/stacks/mobymask-v2/README.md b/app/data/stacks/mobymask-v2/README.md index 83bfd259..5cea8570 100644 --- a/app/data/stacks/mobymask-v2/README.md +++ b/app/data/stacks/mobymask-v2/README.md @@ -10,6 +10,9 @@ Clone required repositories: laconic-so --stack mobymask-v2 setup-repositories ``` +NOTE: If repositories already exist and are checked out to different versions, `setup-repositories` command will throw an error. +For getting around this, the repositories mentioned below can be removed and then run the command. + Checkout to the required versions and branches in repos ```bash diff --git a/app/data/stacks/mobymask-v2/demo.md b/app/data/stacks/mobymask-v2/demo.md index af5ec2d0..63ad0a21 100644 --- a/app/data/stacks/mobymask-v2/demo.md +++ b/app/data/stacks/mobymask-v2/demo.md @@ -6,14 +6,16 @@ laconic-so --stack mobymask-v2 deploy-system --include watcher-mobymask-v2 logs mobymask ``` - NOTE: Clear the browser cache (local storage) for http://127.0.0.1:3002 to remove old invitations - The invite link is seen at the end of the logs Example: ``` laconic-bfb01caf98b1b8f7c8db4d33f11b905a-mobymask-1 | http://127.0.0.1:3002/#/members?invitation=%7B%22v%22%3A1%2C%22signedDelegations%22%3A%5B%7B%22signature%22%3A%220x7559bd412f02677d60820e38243acf61547f79339395a34f7d4e1630e645aeb30535fc219f79b6fbd3af0ce3bd05132ad46d2b274a9fbc4c36bc71edd09850891b%22%2C%22delegation%22%3A%7B%22delegate%22%3A%220xc0838c92B2b71756E0eAD5B3C1e1F186baeEAAac%22%2C%22authority%22%3A%220x0000000000000000000000000000000000000000000000000000000000000000%22%2C%22caveats%22%3A%5B%7B%22enforcer%22%3A%220x558024C7d593B840E1BfD83E9B287a5CDad4db15%22%2C%22terms%22%3A%220x0000000000000000000000000000000000000000000000000000000000000000%22%7D%5D%7D%7D%5D%2C%22key%22%3A%220x98da9805821f1802196443e578fd32af567bababa0a249c07c82df01ecaa7d8d%22%7D ``` +* Open the invite link in browser to use the mobymask-app. + + NOTE: Before opening the invite link, clear the browser cache (local storage) for http://127.0.0.1:3002 to remove old invitations + * In the debug panel, check if it is connected to the p2p network (It should be connected to atleast one other peer for pubsub to work). * Create an invite link in the app by clicking on `Create new invite link` button. From 616f85ce6ba7028dec39724bb5a873f8ec02444e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 27 Mar 2023 08:00:19 -0600 Subject: [PATCH 0333/1010] Update version Former-commit-id: 7e1137f81147103ddd45153ae059b60215eb537e --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index bce03635..6532c004 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.31-e70dca7 +v1.0.32-1aeb44d From 126d671bb09eb35437b84148244c01605e1853ed Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 28 Mar 2023 07:17:06 -0600 Subject: [PATCH 0334/1010] Update version Former-commit-id: 3caf0da9566eb47cc79af30837af13908e122895 --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index 6532c004..16d2611d 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.32-1aeb44d +v1.0.33-7e1137f From ce04ca2be5cf30c8217549c0c061b6cdcfbbb4ed Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 28 Mar 2023 09:52:34 -0600 Subject: [PATCH 0335/1010] Update go-ethereum-foundry container for Debian base image Former-commit-id: 82acc99e2db8f08c282fd714eb98adbae026cb59 --- .../container-build/cerc-go-ethereum-foundry/Dockerfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/data/container-build/cerc-go-ethereum-foundry/Dockerfile b/app/data/container-build/cerc-go-ethereum-foundry/Dockerfile index b9a5a30b..3f73abc7 100644 --- a/app/data/container-build/cerc-go-ethereum-foundry/Dockerfile +++ b/app/data/container-build/cerc-go-ethereum-foundry/Dockerfile @@ -1,7 +1,9 @@ +# Note: cerc/foundry is Debian based FROM cerc/foundry:local -RUN apk update ; apk add --no-cache --allow-untrusted ca-certificates curl bash git jq -RUN apk add --no-cache --upgrade grep +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ + && apt-get -y install --no-install-recommends jq curl netcat + WORKDIR /root ARG GENESIS_FILE_PATH=genesis.json From b3ae2159eeb7ab37ce38d6af0baeec6f49bfae70 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 28 Mar 2023 10:46:26 -0600 Subject: [PATCH 0336/1010] Fix health checks in erc20 containers Former-commit-id: 35ca979068b764ed53f4705f62f67ee5f5b6bcbd --- app/data/compose/docker-compose-go-ethereum-foundry.yml | 2 +- app/data/compose/docker-compose-watcher-erc20.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/data/compose/docker-compose-go-ethereum-foundry.yml b/app/data/compose/docker-compose-go-ethereum-foundry.yml index 20d008f9..3da40d7f 100644 --- a/app/data/compose/docker-compose-go-ethereum-foundry.yml +++ b/app/data/compose/docker-compose-go-ethereum-foundry.yml @@ -8,7 +8,7 @@ services: condition: service_healthy image: cerc/go-ethereum-foundry:local healthcheck: - test: ["CMD", "nc", "-v", "localhost", "8545"] + test: ["CMD", "nc", "-vz", "localhost", "8545"] interval: 30s timeout: 3s retries: 10 diff --git a/app/data/compose/docker-compose-watcher-erc20.yml b/app/data/compose/docker-compose-watcher-erc20.yml index 82e76120..a094250c 100644 --- a/app/data/compose/docker-compose-watcher-erc20.yml +++ b/app/data/compose/docker-compose-watcher-erc20.yml @@ -39,7 +39,7 @@ services: - "0.0.0.0:3002:3001" - "0.0.0.0:9002:9001" healthcheck: - test: ["CMD", "nc", "-v", "localhost", "3002"] + test: ["CMD", "nc", "-vz", "localhost", "3001"] interval: 20s timeout: 5s retries: 15 From 75ca0d413832bee14d6222ab3040881c073f2aed Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 28 Mar 2023 11:44:02 -0600 Subject: [PATCH 0337/1010] Detect transient errors exporting variables and re-try Former-commit-id: 15c0a92f30057d292baf2770cda2dd4bcf6b43bc --- app/deploy_system.py | 56 ++++++++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/app/deploy_system.py b/app/deploy_system.py index 94cf0263..9371a2f8 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -292,21 +292,41 @@ def _orchestrate_cluster_config(ctx, cluster_config, docker, container_exec_env) directive ) if ctx.verbose: - print(f"Setting {pd.destination_container}.{pd.destination_variable} = {pd.source_container}.{pd.source_variable}") - # TODO: fix the script paths so they're consistent between containers - source_value = docker.compose.execute(pd.source_container, - ["sh", "-c", - f"sh /docker-entrypoint-scripts.d/export-{pd.source_variable}.sh"], - tty=False, - envs=container_exec_env) - # TODO: handle the case that the value is not yet available - if ctx.debug: - print(f"fetched source value: {source_value}") - destination_output = docker.compose.execute(pd.destination_container, - ["sh", "-c", - f"sh /scripts/import-{pd.destination_variable}.sh {source_value}"], - tty=False, - envs=container_exec_env) - if ctx.debug: - print(f"destination output: {destination_output}") - # TODO: detect errors here + print(f"Setting {pd.destination_container}.{pd.destination_variable}" + f" = {pd.source_container}.{pd.source_variable}") + # TODO: add a timeout + waiting_for_data = True + while waiting_for_data: + # TODO: fix the script paths so they're consistent between containers + source_value = None + try: + source_value = docker.compose.execute(pd.source_container, + ["sh", "-c", + "sh /docker-entrypoint-scripts.d/export-" + f"{pd.source_variable}.sh"], + tty=False, + envs=container_exec_env) + except DockerException as error: + if ctx.debug: + print(f"Docker exception reading config source: {error}") + # If the script executed failed for some reason, we get: + # "It returned with code 1" + if "It returned with code 1" in str(error): + if ctx.verbose: + print("Config export script returned an error, re-trying") + # If the script failed to execute (e.g. the file is not there) then we get: + # "It returned with code 2" + if "It returned with code 2" in str(error): + print(f"Fatal error reading config source: {error}") + if source_value: + if ctx.debug: + print(f"fetched source value: {source_value}") + destination_output = docker.compose.execute(pd.destination_container, + ["sh", "-c", + f"sh /scripts/import-{pd.destination_variable}.sh" + f" {source_value}"], + tty=False, + envs=container_exec_env) + waiting_for_data = False + if ctx.debug: + print(f"destination output: {destination_output}") From cb7b6f05f284e036a978c235f28130331abd1859 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 28 Mar 2023 11:49:58 -0600 Subject: [PATCH 0338/1010] Update version Former-commit-id: 1266ab88be4e55aaff2855a80973325c30a031a1 --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index 16d2611d..35ec87bd 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.33-7e1137f +v1.0.34-a4a9607 From 51ad55b1d14e628b02ddb22674427092210aaeeb Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 28 Mar 2023 19:52:42 -0600 Subject: [PATCH 0339/1010] Do not switch gid/uid for root and system users Former-commit-id: b6fb3b396bd48bc434590d3a6723157144d7f924 --- app/data/container-build/cerc-builder-js/Dockerfile | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/app/data/container-build/cerc-builder-js/Dockerfile b/app/data/container-build/cerc-builder-js/Dockerfile index 71c770c0..d8475d2b 100644 --- a/app/data/container-build/cerc-builder-js/Dockerfile +++ b/app/data/container-build/cerc-builder-js/Dockerfile @@ -17,12 +17,16 @@ ARG NPM_GLOBAL=/usr/local/share/npm-global # Add NPM global to PATH. ENV PATH=${NPM_GLOBAL}/bin:${PATH} +SHELL ["/bin/bash", "-c"] + RUN \ - if [ ${CERC_HOST_GID} -ne 1000 ] ; then \ - groupmod -g ${CERC_HOST_GID} ${USERNAME} ; \ + # Don't switch container uid/gid if the host uid/gid is 1000 (which means it's already correct), + # or root (which won't work anyway) or <= 100 (which also won't work). + if [[ ${CERC_HOST_GID} -ne 1000 && ${CERC_HOST_GID} -ne 0 && ${CERC_HOST_GID} -gt 100 ]]; then \ + groupmod -g ${CERC_HOST_GID} ${USERNAME}; \ fi \ - && if [ ${CERC_HOST_UID} -ne 1000 ] ; then \ - usermod -u ${CERC_HOST_UID} -g ${CERC_HOST_GID} ${USERNAME} && chown ${CERC_HOST_UID}:${CERC_HOST_GID} /home/${USERNAME} ; \ + && if [[ ${CERC_HOST_UID} -ne 1000 && ${CERC_HOST_UID} -ne 0 && ${CERC_HOST_UID} -gt 100 ]]; then \ + usermod -u ${CERC_HOST_UID} -g ${CERC_HOST_GID} ${USERNAME} && chown ${CERC_HOST_UID}:${CERC_HOST_GID} /home/${USERNAME}; \ fi RUN \ From 75ca36e5f78a3656690c7f0ceef6cd55a3435dbc Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 28 Mar 2023 20:00:16 -0600 Subject: [PATCH 0340/1010] Update version Former-commit-id: e23ee1b176aa5db132c94ddf058076dab3aacb8b --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index 35ec87bd..7a0035e1 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.34-a4a9607 +v1.0.35-df23476 From 79ad4fb15a2b158491768581778291f988c2ce8b Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Thu, 30 Mar 2023 09:44:15 +0530 Subject: [PATCH 0341/1010] Upgrade dependencies and start inline watcher peer in mobymask-v2 stack (#256) * Upgrade dependencies in mobymask-v2 stack * Run inline watcher peer in mobymask v2 stack --------- Co-authored-by: nabarun Former-commit-id: 71aaa41069196836f2186e83583c91b6c6cae161 --- .../docker-compose-watcher-mobymask-v2.yml | 25 ++++++------------- .../config/watcher-mobymask-v2/peer-start.sh | 10 -------- .../watcher-mobymask-v2/server-start.sh | 9 +++++++ ...cher.toml => watcher-config-template.toml} | 6 ++++- app/data/stacks/mobymask-v2/README.md | 13 +++++++--- app/data/stacks/mobymask-v2/demo.md | 2 +- 6 files changed, 31 insertions(+), 34 deletions(-) delete mode 100755 app/data/config/watcher-mobymask-v2/peer-start.sh create mode 100755 app/data/config/watcher-mobymask-v2/server-start.sh rename app/data/config/watcher-mobymask-v2/{watcher.toml => watcher-config-template.toml} (92%) diff --git a/app/data/compose/docker-compose-watcher-mobymask-v2.yml b/app/data/compose/docker-compose-watcher-mobymask-v2.yml index 9835ada4..dc4f6928 100644 --- a/app/data/compose/docker-compose-watcher-mobymask-v2.yml +++ b/app/data/compose/docker-compose-watcher-mobymask-v2.yml @@ -23,9 +23,6 @@ services: mobymask: restart: unless-stopped - depends_on: - mobymask-watcher-db: - condition: service_healthy image: cerc/mobymask:local working_dir: /app/packages/server environment: @@ -46,12 +43,17 @@ services: depends_on: mobymask-watcher-db: condition: service_healthy + mobymask: + condition: service_healthy image: cerc/watcher-mobymask-v2:local - command: ["sh", "-c", "yarn server"] + command: ["sh", "server-start.sh"] volumes: - - ../config/watcher-mobymask-v2/watcher.toml:/app/packages/mobymask-v2-watcher/environments/local.toml + - ../config/watcher-mobymask-v2/watcher-config-template.toml:/app/packages/mobymask-v2-watcher/environments/watcher-config-template.toml - ../config/watcher-mobymask-v2/peer.env:/app/packages/peer/.env - ../config/watcher-mobymask-v2/relay-id.json:/app/packages/mobymask-v2-watcher/relay-id.json + - ../config/watcher-mobymask-v2/peer-id.json:/app/packages/mobymask-v2-watcher/peer-id.json + - ../config/watcher-mobymask-v2/server-start.sh:/app/packages/mobymask-v2-watcher/server-start.sh + - moby_data_server:/server ports: - "0.0.0.0:3001:3001" - "0.0.0.0:9001:9001" @@ -63,19 +65,6 @@ services: retries: 15 start_period: 5s - mobymask-watcher-peer: - restart: unless-stopped - depends_on: - mobymask: - condition: service_healthy - image: cerc/watcher-mobymask-v2:local - command: ["sh", "peer-start.sh"] - volumes: - - ../config/watcher-mobymask-v2/watcher.toml:/app/packages/mobymask-v2-watcher/environments/local.toml - - ../config/watcher-mobymask-v2/peer-id.json:/app/packages/mobymask-v2-watcher/peer-id.json - - ../config/watcher-mobymask-v2/peer-start.sh:/app/packages/mobymask-v2-watcher/peer-start.sh - - moby_data_server:/server - mobymask-app: depends_on: mobymask-watcher-server: diff --git a/app/data/config/watcher-mobymask-v2/peer-start.sh b/app/data/config/watcher-mobymask-v2/peer-start.sh deleted file mode 100755 index 9749f97a..00000000 --- a/app/data/config/watcher-mobymask-v2/peer-start.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -# Private key of account with balance -PRIVATE_KEY= - -# Assign deployed contract address from server config -CONTRACT_ADDRESS=`jq '.address' /server/config.json` - -echo 'yarn peer-listener --contract-address --private-key ' -yarn peer-listener --contract-address $CONTRACT_ADDRESS --private-key $PRIVATE_KEY diff --git a/app/data/config/watcher-mobymask-v2/server-start.sh b/app/data/config/watcher-mobymask-v2/server-start.sh new file mode 100755 index 00000000..80bf4d34 --- /dev/null +++ b/app/data/config/watcher-mobymask-v2/server-start.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +# Assign deployed contract address from server config +CONTRACT_ADDRESS=`jq '.address' /server/config.json` + +sed "s/REPLACE_WITH_CONTRACT_ADDRESS/${CONTRACT_ADDRESS}/" environments/watcher-config-template.toml > environments/local.toml + +echo 'yarn server' +yarn server diff --git a/app/data/config/watcher-mobymask-v2/watcher.toml b/app/data/config/watcher-mobymask-v2/watcher-config-template.toml similarity index 92% rename from app/data/config/watcher-mobymask-v2/watcher.toml rename to app/data/config/watcher-mobymask-v2/watcher-config-template.toml index 3f50d137..1a05e225 100644 --- a/app/data/config/watcher-mobymask-v2/watcher.toml +++ b/app/data/config/watcher-mobymask-v2/watcher-config-template.toml @@ -21,7 +21,7 @@ [server.p2p] enableRelay = true - enablePeer = false + enablePeer = true [server.p2p.relay] host = "0.0.0.0" @@ -36,6 +36,10 @@ peerIdFile = './peer-id.json' enableDebugInfo = true + [server.p2p.peer.l2TxConfig] + privateKey = '' + contractAddress = REPLACE_WITH_CONTRACT_ADDRESS + [metrics] host = "0.0.0.0" port = 9000 diff --git a/app/data/stacks/mobymask-v2/README.md b/app/data/stacks/mobymask-v2/README.md index 5cea8570..fc6f6b05 100644 --- a/app/data/stacks/mobymask-v2/README.md +++ b/app/data/stacks/mobymask-v2/README.md @@ -18,11 +18,11 @@ Checkout to the required versions and branches in repos ```bash # watcher-ts cd ~/cerc/watcher-ts -git checkout v0.2.31 +git checkout v0.2.34 # react-peer cd ~/cerc/react-peer -git checkout v0.2.29 +git checkout v0.2.31 # mobymask-ui cd ~/cerc/mobymask-ui @@ -67,7 +67,7 @@ Deploy the stack: * Set the private key in [secrets.json](../../config/watcher-mobymask-v2/secrets.json) file that will be used by mobymask container to deploy contract -* Create a new account +* Create a new account named `alice` ```bash laconic-so --stack mobymask-v2 deploy-system --include mobymask-laconicd exec laconicd "laconicd keys add alice" @@ -85,7 +85,12 @@ Deploy the stack: laconic-so --stack mobymask-v2 deploy-system --include mobymask-laconicd exec laconicd "echo y | laconicd keys export alice --unarmored-hex --unsafe" ``` -* Set the private key (`PRIVATE_KEY`) in [peer-start.sh](../../config/watcher-mobymask-v2/peer-start.sh) file that will be used to start the peer that sends txs to L2 chain +* Set the private key (`server.p2p.peer.l2TxConfig.privateKey`) in [watcher.toml](../../config/watcher-mobymask-v2/watcher.toml) file that will be used to start the peer that sends txs to L2 chain + + ```toml + [server.p2p.peer.l2TxConfig] + privateKey = 'ALICE_PRIVATE_KEY' + ``` * Deploy the other containers diff --git a/app/data/stacks/mobymask-v2/demo.md b/app/data/stacks/mobymask-v2/demo.md index 63ad0a21..09085b89 100644 --- a/app/data/stacks/mobymask-v2/demo.md +++ b/app/data/stacks/mobymask-v2/demo.md @@ -34,7 +34,7 @@ * Get the container id ```bash - laconic-so --stack mobymask-v2 deploy-system --include watcher-mobymask-v2 ps | grep mobymask-watcher-peer + laconic-so --stack mobymask-v2 deploy-system --include watcher-mobymask-v2 ps | grep mobymask-watcher-server ``` * Check logs From fbe76f4713ef928e1eedffd352957de3abd39e32 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 29 Mar 2023 22:46:58 -0600 Subject: [PATCH 0342/1010] Handle semver spec in package.json local dependencies Former-commit-id: c5a532c02bb44c9bdac9bdd97220c57b27d4d201 --- .../cerc-builder-js/yarn-local-registry-fixup.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/data/container-build/cerc-builder-js/yarn-local-registry-fixup.sh b/app/data/container-build/cerc-builder-js/yarn-local-registry-fixup.sh index 3f4f095a..ad11ce80 100755 --- a/app/data/container-build/cerc-builder-js/yarn-local-registry-fixup.sh +++ b/app/data/container-build/cerc-builder-js/yarn-local-registry-fixup.sh @@ -18,8 +18,9 @@ fi set -e target_package=$1 local_npm_registry_url=$2 -# TODO: use jq rather than sed here: -versioned_target_package=$(grep ${target_package} package.json | sed -e 's#[[:space:]]\{1,\}\"\('${target_package}'\)\":[[:space:]]\{1,\}\"\(.*\)\",#\1@\2#' ) +# Extract the actual version pinned in yarn.lock +# See: https://stackoverflow.com/questions/60454251/how-to-know-the-version-of-currently-installed-package-from-yarn-lock +versioned_target_package=$(yarn list --pattern ${target_package} --depth=0 --json --non-interactive --no-progress | jq -r '.data.trees[].name') # Use yarn info to get URL checksums etc from the new registry yarn_info_output=$(yarn info --json $versioned_target_package 2>/dev/null) # First check if the target version actually exists. From 9b2268548476f2eb58691d7d9fdc308e2055cd0e Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 30 Mar 2023 00:15:36 -0600 Subject: [PATCH 0343/1010] Add web server to host container Former-commit-id: d01fb777d4ca03f24ba607dac6156f08d69f53e5 --- .../container-build/cerc-laconic-console-host/Dockerfile | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/data/container-build/cerc-laconic-console-host/Dockerfile b/app/data/container-build/cerc-laconic-console-host/Dockerfile index 5a62cc7d..7f86c69b 100644 --- a/app/data/container-build/cerc-laconic-console-host/Dockerfile +++ b/app/data/container-build/cerc-laconic-console-host/Dockerfile @@ -44,11 +44,14 @@ RUN npm config set @cerc-io:registry ${CERC_NPM_URL} \ && npm config set @lirewine:registry ${CERC_NPM_URL} \ && npm config set -- ${CERC_NPM_URL}:_authToken ${CERC_NPM_AUTH_TOKEN} -# TODO: the image at this point could be made a base image for several different CLI images -# that install different Node-based CLI commands +# Install simple web server for now (use nginx perhaps later) +RUN yarn global add http-server -# Globally install the cli package +# Globally install the payload web app package RUN yarn global add @cerc-io/console-app +# Expose port for http +EXPOSE 80 + # Default command sleeps forever so docker doesn't kill it CMD ["sh", "-c", "while :; do sleep 600; done"] From 1fdfb9f568d3800da8112314897ecd28991e012c Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 30 Mar 2023 00:27:19 -0600 Subject: [PATCH 0344/1010] Add console container pod Former-commit-id: 3fb968c9cfe905c3a98f97d888ece0c707a3f1f9 --- .../compose/docker-compose-fixturenet-laconic-console.yml | 6 ++++++ .../container-build/cerc-laconic-console-host/Dockerfile | 2 +- app/data/stacks/fixturenet-laconic-loaded/stack.yml | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 app/data/compose/docker-compose-fixturenet-laconic-console.yml diff --git a/app/data/compose/docker-compose-fixturenet-laconic-console.yml b/app/data/compose/docker-compose-fixturenet-laconic-console.yml new file mode 100644 index 00000000..f402fa70 --- /dev/null +++ b/app/data/compose/docker-compose-fixturenet-laconic-console.yml @@ -0,0 +1,6 @@ +services: + laconic-console: + restart: unless-stopped + image: cerc/laconic-console-host:local + ports: + - "80" diff --git a/app/data/container-build/cerc-laconic-console-host/Dockerfile b/app/data/container-build/cerc-laconic-console-host/Dockerfile index 7f86c69b..d2bac367 100644 --- a/app/data/container-build/cerc-laconic-console-host/Dockerfile +++ b/app/data/container-build/cerc-laconic-console-host/Dockerfile @@ -54,4 +54,4 @@ RUN yarn global add @cerc-io/console-app EXPOSE 80 # Default command sleeps forever so docker doesn't kill it -CMD ["sh", "-c", "while :; do sleep 600; done"] +CMD ["http-server", "-p", "80", "/usr/local/share/.config/yarn/global/node_modules/@cerc-io/console-app/dist/production"] diff --git a/app/data/stacks/fixturenet-laconic-loaded/stack.yml b/app/data/stacks/fixturenet-laconic-loaded/stack.yml index 12fe28b7..5dcb3c7b 100644 --- a/app/data/stacks/fixturenet-laconic-loaded/stack.yml +++ b/app/data/stacks/fixturenet-laconic-loaded/stack.yml @@ -23,6 +23,7 @@ containers: - cerc/laconic-registry-cli pods: - fixturenet-laconicd + - fixturenet-laconic-console config: cli: key: laconicd.mykey From d25de90df2e7acf1366843ba500c5022c0790ce0 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 31 Mar 2023 07:59:43 -0600 Subject: [PATCH 0345/1010] Add console host container to stack Former-commit-id: c45dd545dd6fe45593a9c603a7dd85f02a5c8206 --- app/data/stacks/fixturenet-laconic-loaded/stack.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/data/stacks/fixturenet-laconic-loaded/stack.yml b/app/data/stacks/fixturenet-laconic-loaded/stack.yml index 5dcb3c7b..03d0a4c9 100644 --- a/app/data/stacks/fixturenet-laconic-loaded/stack.yml +++ b/app/data/stacks/fixturenet-laconic-loaded/stack.yml @@ -21,6 +21,7 @@ npms: containers: - cerc/laconicd - cerc/laconic-registry-cli + - cerc/laconic-console-host pods: - fixturenet-laconicd - fixturenet-laconic-console From 1342be5723b28fae363a370548512e5e465b5882 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 31 Mar 2023 08:00:24 -0600 Subject: [PATCH 0346/1010] Add a temporary version of config to the hosting container Former-commit-id: 3372cac35e282e7b6d7d6963fe4d5f94d30c31d2 --- app/data/container-build/cerc-laconic-console-host/Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/data/container-build/cerc-laconic-console-host/Dockerfile b/app/data/container-build/cerc-laconic-console-host/Dockerfile index d2bac367..de477a8c 100644 --- a/app/data/container-build/cerc-laconic-console-host/Dockerfile +++ b/app/data/container-build/cerc-laconic-console-host/Dockerfile @@ -50,6 +50,10 @@ RUN yarn global add http-server # Globally install the payload web app package RUN yarn global add @cerc-io/console-app +# Temp hack to fix up config +RUN cd /usr/local/share/.config/yarn/global/node_modules/@cerc-io/console-app/dist/production && \ + find . -type f -exec sed -i 's#LACONIC_HOSTED_CONFIG_SERVICES_WNS_SERVER#http://laconicd:9473/api#g' {} + + # Expose port for http EXPOSE 80 From 31f9f0e864497cbd9366efdc58531087a0479d03 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 31 Mar 2023 16:29:59 -0600 Subject: [PATCH 0347/1010] Implement deploy time config Former-commit-id: 409f61d68d756c605501f76fbfc41730cc239a1e --- .../cerc-laconic-console-host/Dockerfile | 14 ++++++-- .../apply-webapp-config.sh | 34 +++++++++++++++++++ .../cerc-laconic-console-host/config.yml | 6 ++++ .../start-serving-app.sh | 4 +++ 4 files changed, 55 insertions(+), 3 deletions(-) create mode 100755 app/data/container-build/cerc-laconic-console-host/apply-webapp-config.sh create mode 100644 app/data/container-build/cerc-laconic-console-host/config.yml create mode 100644 app/data/container-build/cerc-laconic-console-host/start-serving-app.sh diff --git a/app/data/container-build/cerc-laconic-console-host/Dockerfile b/app/data/container-build/cerc-laconic-console-host/Dockerfile index de477a8c..fe5e50ae 100644 --- a/app/data/container-build/cerc-laconic-console-host/Dockerfile +++ b/app/data/container-build/cerc-laconic-console-host/Dockerfile @@ -36,6 +36,12 @@ RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ # ARG EXTRA_NODE_VERSION=10 # RUN su node -c "source /usr/local/share/nvm/nvm.sh && nvm install ${EXTRA_NODE_VERSION}" +# We do this to get a yq binary from the published container, for the correct architecture we're building here +COPY --from=docker.io/mikefarah/yq:latest /usr/bin/yq /usr/local/bin/yq + +RUN mkdir -p /scripts +COPY ./apply-webapp-config.sh /scripts + # [Optional] Uncomment if you want to install more global node modules # RUN su node -c "npm install -g " @@ -44,15 +50,17 @@ RUN npm config set @cerc-io:registry ${CERC_NPM_URL} \ && npm config set @lirewine:registry ${CERC_NPM_URL} \ && npm config set -- ${CERC_NPM_URL}:_authToken ${CERC_NPM_AUTH_TOKEN} +RUN mkdir -p /config +COPY ./config.yml /config + # Install simple web server for now (use nginx perhaps later) RUN yarn global add http-server # Globally install the payload web app package RUN yarn global add @cerc-io/console-app -# Temp hack to fix up config -RUN cd /usr/local/share/.config/yarn/global/node_modules/@cerc-io/console-app/dist/production && \ - find . -type f -exec sed -i 's#LACONIC_HOSTED_CONFIG_SERVICES_WNS_SERVER#http://laconicd:9473/api#g' {} + +# Run this script to substitute the config values into the unpackaged webapp files: +# ./scripts/apply-webapp-config.sh ./config/config.yml /usr/local/share/.config/yarn/global/node_modules/@cerc-io/console-app/dist/production # Expose port for http EXPOSE 80 diff --git a/app/data/container-build/cerc-laconic-console-host/apply-webapp-config.sh b/app/data/container-build/cerc-laconic-console-host/apply-webapp-config.sh new file mode 100755 index 00000000..a453cc87 --- /dev/null +++ b/app/data/container-build/cerc-laconic-console-host/apply-webapp-config.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi +if [[ $# -ne 2 ]]; then + echo "Illegal number of parameters" >&2 + exit 1 +fi +config_file_name=$1 +webapp_files_dir=$2 +if ![[ -f ${config_file_name} ]]; then + echo "Config file ${config_file_name} does not exist" >&2 + exit 1 +fi +if ![[ -d ${webapp_files_dir} ]]; then + echo "Webapp directory ${webapp_files_dir} does not exist" >&2 + exit 1 +fi +# First some magic using yq to translate our yaml config file into an array of key value pairs like: +# LACONIC_HOSTED_CONFIG_= +readarray -t config_kv_pair_array < <( yq '.. | select(length > 2) | ([path | join("_"), .] | join("=") )' ${config_file_name} | sed 's/^/LACONIC_HOSTED_CONFIG_/' ) +declare -p config_kv_pair_array +# Then iterate over that kv array making the template substitution in our web app files +for kv_pair_string in "${config_kv_pair_array[@]}" +do + kv_pair=(${kv_pair_string//=/ }) + template_string_to_replace=${kv_pair[0]} + template_value_to_substitute=${kv_pair[1]} + # Run find and sed to do the substitution of one variable over all files + # See: https://stackoverflow.com/a/21479607/1701505 + echo "Substituting: ${template_string_to_replace} = ${template_value_to_substitute}" + # Note: we do not escape our strings, on the expectation they do not container the '#' char. + find ${webapp_files_dir} -type f -exec sed -i 's#'${template_string_to_replace}'#'${template_value_to_substitute}'#g' {} + +done diff --git a/app/data/container-build/cerc-laconic-console-host/config.yml b/app/data/container-build/cerc-laconic-console-host/config.yml new file mode 100644 index 00000000..dc385bf3 --- /dev/null +++ b/app/data/container-build/cerc-laconic-console-host/config.yml @@ -0,0 +1,6 @@ +# Config for laconic-console running in a fixturenet with laconicd + +services: + wns: + server: 'http:/laconicd:9473/api' + webui: 'http://laconicd:9473/console' diff --git a/app/data/container-build/cerc-laconic-console-host/start-serving-app.sh b/app/data/container-build/cerc-laconic-console-host/start-serving-app.sh new file mode 100644 index 00000000..ab466678 --- /dev/null +++ b/app/data/container-build/cerc-laconic-console-host/start-serving-app.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi From 2b94ed12c272e98816bb251b7e943ee8b2bbfc3b Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 31 Mar 2023 16:33:48 -0600 Subject: [PATCH 0348/1010] Run template substitution on start Former-commit-id: e072a6bc4bd5072905b32f9739cfeadca04288fb --- .../container-build/cerc-laconic-console-host/Dockerfile | 6 ++---- .../cerc-laconic-console-host/start-serving-app.sh | 4 ++++ 2 files changed, 6 insertions(+), 4 deletions(-) mode change 100644 => 100755 app/data/container-build/cerc-laconic-console-host/start-serving-app.sh diff --git a/app/data/container-build/cerc-laconic-console-host/Dockerfile b/app/data/container-build/cerc-laconic-console-host/Dockerfile index fe5e50ae..66eec1f5 100644 --- a/app/data/container-build/cerc-laconic-console-host/Dockerfile +++ b/app/data/container-build/cerc-laconic-console-host/Dockerfile @@ -41,6 +41,7 @@ COPY --from=docker.io/mikefarah/yq:latest /usr/bin/yq /usr/local/bin/yq RUN mkdir -p /scripts COPY ./apply-webapp-config.sh /scripts +COPY ./start-serving-app.sh /scripts # [Optional] Uncomment if you want to install more global node modules # RUN su node -c "npm install -g " @@ -59,11 +60,8 @@ RUN yarn global add http-server # Globally install the payload web app package RUN yarn global add @cerc-io/console-app -# Run this script to substitute the config values into the unpackaged webapp files: -# ./scripts/apply-webapp-config.sh ./config/config.yml /usr/local/share/.config/yarn/global/node_modules/@cerc-io/console-app/dist/production - # Expose port for http EXPOSE 80 # Default command sleeps forever so docker doesn't kill it -CMD ["http-server", "-p", "80", "/usr/local/share/.config/yarn/global/node_modules/@cerc-io/console-app/dist/production"] +CMD ["/scripts/start-serving-app.sh"] diff --git a/app/data/container-build/cerc-laconic-console-host/start-serving-app.sh b/app/data/container-build/cerc-laconic-console-host/start-serving-app.sh old mode 100644 new mode 100755 index ab466678..a322e5fb --- a/app/data/container-build/cerc-laconic-console-host/start-serving-app.sh +++ b/app/data/container-build/cerc-laconic-console-host/start-serving-app.sh @@ -2,3 +2,7 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi +# TODO: Don't hard wire this: +webapp_files_dir=/usr/local/share/.config/yarn/global/node_modules/@cerc-io/console-app/dist/production +/scripts/apply-webapp-config.sh /config/config.yml ${webapp_files_dir} +http-server -p 80 ${webapp_files_dir} From bddf72ee46f916d2d57e173369e844cca0dab53d Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sat, 1 Apr 2023 10:06:39 -0600 Subject: [PATCH 0349/1010] Temporary punch the port through to the host to make things work Former-commit-id: f6cb041634df98b29e793bbbb2938d7515bcfef3 --- app/data/compose/docker-compose-fixturenet-laconicd.yml | 2 +- app/data/container-build/cerc-laconic-console-host/config.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/data/compose/docker-compose-fixturenet-laconicd.yml b/app/data/compose/docker-compose-fixturenet-laconicd.yml index 9663e7f0..5d777b5d 100644 --- a/app/data/compose/docker-compose-fixturenet-laconicd.yml +++ b/app/data/compose/docker-compose-fixturenet-laconicd.yml @@ -13,7 +13,7 @@ services: - "6060" - "26657" - "26656" - - "9473" + - "9473:9473" - "8545" - "8546" - "9090" diff --git a/app/data/container-build/cerc-laconic-console-host/config.yml b/app/data/container-build/cerc-laconic-console-host/config.yml index dc385bf3..da57724a 100644 --- a/app/data/container-build/cerc-laconic-console-host/config.yml +++ b/app/data/container-build/cerc-laconic-console-host/config.yml @@ -2,5 +2,5 @@ services: wns: - server: 'http:/laconicd:9473/api' - webui: 'http://laconicd:9473/console' + server: 'http://localhost:9473/api' + webui: 'http://localhost:9473/console' From 009ce9591491c4f997ef7c0c4bf9d53233f102ec Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 2 Apr 2023 08:25:26 -0600 Subject: [PATCH 0350/1010] Add missing repo and container Former-commit-id: 045117c6fb769e381c46eaeccc703a5474151a2e --- app/data/stacks/erc20/stack.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/data/stacks/erc20/stack.yml b/app/data/stacks/erc20/stack.yml index 104d66c1..57baa9eb 100644 --- a/app/data/stacks/erc20/stack.yml +++ b/app/data/stacks/erc20/stack.yml @@ -5,7 +5,9 @@ repos: - cerc-io/ipld-eth-db - cerc-io/ipld-eth-server - cerc-io/watcher-ts + - dboreham/foundry containers: + - cerc/foundry - cerc/go-ethereum - cerc/go-ethereum-foundry - cerc/ipld-eth-db From 1881554ae0d33944e32507b4e32ff6f48c4a1bc9 Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Mon, 3 Apr 2023 12:33:47 +0530 Subject: [PATCH 0351/1010] Add Optimism Fixturenet stack (#266) * Initial version * Update readme * Build op-geth container * Add optimism go code containers * Add optimism contracts container * Update optimism contracts container build * Add fixturenet-optimism-contracts service to deploy L1 contracts * Add fixturenet-optimism op-node and op-geth * Avoid reading addresses from a file when sending balances * Fixes for running op-geth container * Fix image name and command in optimism-contracts service * Add a healthcheck to lighthouse bootnode to avoid failing eth txs * Avoid using hardhat ethers to send balances from an account * Update script to send balance to L1 bridge proxy contract * Implement op-node container * Wait for a finalized L1 block to exist * Fix for running op-batcher * Add a todo for restart support * Integrate optimism-contracts service and update instructions * Update clean-up to remove docker volumes * Update volume access permissions * Add a todo to replace foundry usage with web3 js * Add known issues * Fix README * Fix indentation * Update known issues --------- Co-authored-by: David Boreham Co-authored-by: David Boreham Co-authored-by: nabarun Former-commit-id: fc522140baf918dfed531e8379649887c47c8109 --- .../compose/docker-compose-fixturenet-eth.yml | 13 ++- .../docker-compose-fixturenet-optimism.yml | 97 +++++++++++++++++++ .../fixturenet-optimism/generate-l2-config.sh | 11 +++ .../optimism-contracts/rekey-json.ts | 28 ++++++ .../optimism-contracts/run.sh | 81 ++++++++++++++++ .../optimism-contracts/send-balance.ts | 22 +++++ .../optimism-contracts/update-config.js | 36 +++++++ .../fixturenet-optimism/run-op-batcher.sh | 21 ++++ .../config/fixturenet-optimism/run-op-geth.sh | 58 +++++++++++ .../config/fixturenet-optimism/run-op-node.sh | 20 ++++ .../cerc-optimism-contracts/Dockerfile | 23 +++++ .../cerc-optimism-contracts/build.sh | 7 ++ .../cerc-optimism-l2geth/build.sh | 3 + .../cerc-optimism-op-batcher/Dockerfile | 32 ++++++ .../cerc-optimism-op-batcher/build.sh | 5 + .../cerc-optimism-op-node/Dockerfile | 30 ++++++ .../cerc-optimism-op-node/build.sh | 5 + app/data/container-image-list.txt | 3 + app/data/pod-list.txt | 1 + app/data/repository-list.txt | 2 + app/data/stacks/fixturenet-eth/stack.yml | 3 +- app/data/stacks/fixturenet-optimism/README.md | 80 +++++++++++++++ app/data/stacks/fixturenet-optimism/stack.yml | 21 ++++ 23 files changed, 599 insertions(+), 3 deletions(-) create mode 100644 app/data/compose/docker-compose-fixturenet-optimism.yml create mode 100755 app/data/config/fixturenet-optimism/generate-l2-config.sh create mode 100644 app/data/config/fixturenet-optimism/optimism-contracts/rekey-json.ts create mode 100755 app/data/config/fixturenet-optimism/optimism-contracts/run.sh create mode 100644 app/data/config/fixturenet-optimism/optimism-contracts/send-balance.ts create mode 100644 app/data/config/fixturenet-optimism/optimism-contracts/update-config.js create mode 100755 app/data/config/fixturenet-optimism/run-op-batcher.sh create mode 100755 app/data/config/fixturenet-optimism/run-op-geth.sh create mode 100755 app/data/config/fixturenet-optimism/run-op-node.sh create mode 100644 app/data/container-build/cerc-optimism-contracts/Dockerfile create mode 100755 app/data/container-build/cerc-optimism-contracts/build.sh create mode 100755 app/data/container-build/cerc-optimism-l2geth/build.sh create mode 100644 app/data/container-build/cerc-optimism-op-batcher/Dockerfile create mode 100755 app/data/container-build/cerc-optimism-op-batcher/build.sh create mode 100644 app/data/container-build/cerc-optimism-op-node/Dockerfile create mode 100755 app/data/container-build/cerc-optimism-op-node/build.sh create mode 100644 app/data/stacks/fixturenet-optimism/README.md create mode 100644 app/data/stacks/fixturenet-optimism/stack.yml diff --git a/app/data/compose/docker-compose-fixturenet-eth.yml b/app/data/compose/docker-compose-fixturenet-eth.yml index 978b983f..c51550cc 100644 --- a/app/data/compose/docker-compose-fixturenet-eth.yml +++ b/app/data/compose/docker-compose-fixturenet-eth.yml @@ -24,6 +24,8 @@ services: env_file: - ../config/fixturenet-eth/fixturenet-eth.env image: cerc/fixturenet-eth-geth:local + volumes: + - fixturenet-geth-accounts:/opt/testnet/build/el healthcheck: test: ["CMD", "nc", "-v", "localhost", "8545"] interval: 30s @@ -56,6 +58,12 @@ services: environment: RUN_BOOTNODE: "true" image: cerc/fixturenet-eth-lighthouse:local + healthcheck: + test: ["CMD", "/scripts/status-internal.sh"] + interval: 10s + timeout: 100s + retries: 3 + start_period: 15s fixturenet-eth-lighthouse-1: hostname: fixturenet-eth-lighthouse-1 @@ -79,7 +87,7 @@ services: condition: service_healthy ports: - "8001" - + fixturenet-eth-lighthouse-2: hostname: fixturenet-eth-lighthouse-2 healthcheck: @@ -101,3 +109,6 @@ services: condition: service_started fixturenet-eth-geth-2: condition: service_healthy + +volumes: + fixturenet-geth-accounts: diff --git a/app/data/compose/docker-compose-fixturenet-optimism.yml b/app/data/compose/docker-compose-fixturenet-optimism.yml new file mode 100644 index 00000000..6e65c46f --- /dev/null +++ b/app/data/compose/docker-compose-fixturenet-optimism.yml @@ -0,0 +1,97 @@ +version: '3.7' + +services: + fixturenet-optimism-contracts: + hostname: fixturenet-optimism-contracts + image: cerc/optimism-contracts:local + depends_on: + fixturenet-eth-geth-1: + condition: service_healthy + fixturenet-eth-bootnode-lighthouse: + condition: service_healthy + environment: + CHAIN_ID: 1212 + L1_RPC: "http://fixturenet-eth-geth-1:8545" + command: "./run.sh" + volumes: + - ../config/fixturenet-optimism/optimism-contracts/rekey-json.ts:/app/packages/contracts-bedrock/tasks/rekey-json.ts + - ../config/fixturenet-optimism/optimism-contracts/send-balance.ts:/app/packages/contracts-bedrock/tasks/send-balance.ts + - ../config/fixturenet-optimism/optimism-contracts/update-config.js:/app/packages/contracts-bedrock/update-config.js + - ../config/fixturenet-optimism/optimism-contracts/run.sh:/app/packages/contracts-bedrock/run.sh + - fixturenet-geth-accounts:/geth-accounts:ro + - l2-accounts:/l2-accounts + - l1-deployment:/app/packages/contracts-bedrock + + op-node-l2-config-gen: + image: cerc/optimism-op-node:local + depends_on: + fixturenet-optimism-contracts: + condition: service_completed_successfully + environment: + L1_RPC: "http://fixturenet-eth-geth-1:8545" + volumes: + - ../config/fixturenet-optimism/generate-l2-config.sh:/app/generate-l2-config.sh + - l1-deployment:/contracts-bedrock:ro + - op_node_data:/app + command: ["sh", "/app/generate-l2-config.sh"] + + op-geth: + image: cerc/optimism-l2geth:local + depends_on: + op-node-l2-config-gen: + condition: service_started + volumes: + - ../config/fixturenet-optimism/run-op-geth.sh:/run-op-geth.sh + - op_node_data:/op-node:ro + - l2-accounts:/l2-accounts:ro + entrypoint: "sh" + command: "/run-op-geth.sh" + ports: + - "8545" + healthcheck: + test: ["CMD", "nc", "-vz", "localhost:8545"] + interval: 30s + timeout: 10s + retries: 10 + start_period: 10s + + op-node: + environment: + L1_RPC: "http://fixturenet-eth-geth-1:8545" + depends_on: + op-geth: + condition: service_healthy + image: cerc/optimism-op-node:local + volumes: + - ../config/fixturenet-optimism/run-op-node.sh:/app/run-op-node.sh + - op_node_data:/app:ro + - l2-accounts:/l2-accounts:ro + command: ["sh", "/app/run-op-node.sh"] + ports: + - "8547" + healthcheck: + test: ["CMD", "nc", "-vz", "localhost:8547"] + interval: 30s + timeout: 10s + retries: 10 + start_period: 10s + + op-batcher: + environment: + L1_RPC: "http://fixturenet-eth-geth-1:8545" + depends_on: + op-node: + condition: service_healthy + op-geth: + condition: service_healthy + image: cerc/optimism-op-batcher:local + volumes: + - ../config/fixturenet-optimism/run-op-batcher.sh:/run-op-batcher.sh + - l2-accounts:/l2-accounts:ro + entrypoint: "sh" + command: "/run-op-batcher.sh" + +volumes: + op_node_data: + l2-accounts: + l1-deployment: diff --git a/app/data/config/fixturenet-optimism/generate-l2-config.sh b/app/data/config/fixturenet-optimism/generate-l2-config.sh new file mode 100755 index 00000000..25ed2378 --- /dev/null +++ b/app/data/config/fixturenet-optimism/generate-l2-config.sh @@ -0,0 +1,11 @@ +#!/bin/sh +set -e + +op-node genesis l2 \ + --deploy-config /contracts-bedrock/deploy-config/getting-started.json \ + --deployment-dir /contracts-bedrock/deployments/getting-started/ \ + --outfile.l2 /app/genesis.json \ + --outfile.rollup /app/rollup.json \ + --l1-rpc $L1_RPC + +openssl rand -hex 32 > /app/jwt.txt diff --git a/app/data/config/fixturenet-optimism/optimism-contracts/rekey-json.ts b/app/data/config/fixturenet-optimism/optimism-contracts/rekey-json.ts new file mode 100644 index 00000000..78312499 --- /dev/null +++ b/app/data/config/fixturenet-optimism/optimism-contracts/rekey-json.ts @@ -0,0 +1,28 @@ +import fs from 'fs' + +import { task } from 'hardhat/config' +import { hdkey } from 'ethereumjs-wallet' +import * as bip39 from 'bip39' + +task('rekey-json', 'Generates a new set of keys for a test network') + .addParam('output', 'JSON file to output accounts to') + .setAction(async ({ output: outputFile }) => { + const mnemonic = bip39.generateMnemonic() + const pathPrefix = "m/44'/60'/0'/0" + const labels = ['Admin', 'Proposer', 'Batcher', 'Sequencer'] + const hdwallet = hdkey.fromMasterSeed(await bip39.mnemonicToSeed(mnemonic)) + + const output = {} + + for (let i = 0; i < labels.length; i++) { + const label = labels[i] + const wallet = hdwallet.derivePath(`${pathPrefix}/${i}`).getWallet() + const addr = '0x' + wallet.getAddress().toString('hex') + const pk = wallet.getPrivateKey().toString('hex') + + output[label] = { address: addr, privateKey: pk } + } + + fs.writeFileSync(outputFile, JSON.stringify(output, null, 2)) + console.log(`L2 account keys written to ${outputFile}`) + }) diff --git a/app/data/config/fixturenet-optimism/optimism-contracts/run.sh b/app/data/config/fixturenet-optimism/optimism-contracts/run.sh new file mode 100755 index 00000000..4a5f568b --- /dev/null +++ b/app/data/config/fixturenet-optimism/optimism-contracts/run.sh @@ -0,0 +1,81 @@ +#!/bin/bash +set -e + +# TODO Support restarts; fixturenet-eth-geth currently starts fresh on a restart +# Exit if a deployment already exists (on restarts) +# if [ -d "deployments/getting-started" ]; then +# echo "Deployment directory deployments/getting-started already exists, exiting" +# exit 0 +# fi + +# Append tasks/index.ts file +echo "import './rekey-json'" >> tasks/index.ts +echo "import './send-balance'" >> tasks/index.ts + +# Update the chainId in the hardhat config +sed -i "/getting-started/ {n; s/.*chainId.*/ chainId: $CHAIN_ID,/}" hardhat.config.ts + +# Generate the L2 account addresses +yarn hardhat rekey-json --output /l2-accounts/keys.json + +# Read JSON file into variable +KEYS_JSON=$(cat /l2-accounts/keys.json) + +# Parse JSON into variables +ADMIN_ADDRESS=$(echo "$KEYS_JSON" | jq -r '.Admin.address') +ADMIN_PRIV_KEY=$(echo "$KEYS_JSON" | jq -r '.Admin.privateKey') +PROPOSER_ADDRESS=$(echo "$KEYS_JSON" | jq -r '.Proposer.address') +BATCHER_ADDRESS=$(echo "$KEYS_JSON" | jq -r '.Batcher.address') +SEQUENCER_ADDRESS=$(echo "$KEYS_JSON" | jq -r '.Sequencer.address') + +# Read the private key of a L1 account +# TODO: Take from env if /geth-accounts volume doesn't exist to allow using separately running L1 +L1_ADDRESS=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 2) +L1_PRIV_KEY=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 3) + +# Send balances to the above L2 addresses +yarn hardhat send-balance --to "${ADMIN_ADDRESS}" --amount 2 --private-key "${L1_PRIV_KEY}" --network getting-started +yarn hardhat send-balance --to "${PROPOSER_ADDRESS}" --amount 5 --private-key "${L1_PRIV_KEY}" --network getting-started +yarn hardhat send-balance --to "${BATCHER_ADDRESS}" --amount 1000 --private-key "${L1_PRIV_KEY}" --network getting-started + +echo "Balances sent to L2 accounts" + +# Select a finalized L1 block as the starting point for roll ups +# TODO Use web3.js to get the latest finalized block +until CAST_OUTPUT=$(cast block finalized --rpc-url "$L1_RPC"); do + echo "Waiting for a finalized L1 block to exist, retrying after 10s" + sleep 10 +done + +L1_BLOCKHASH=$(echo "$CAST_OUTPUT" | awk '/hash/{print $2}') +L1_BLOCKTIMESTAMP=$(echo "$CAST_OUTPUT" | awk '/timestamp/{print $2}') + +# Update the deployment config +sed -i 's/"l2OutputOracleStartingTimestamp": TIMESTAMP/"l2OutputOracleStartingTimestamp": '"$L1_BLOCKTIMESTAMP"'/g' deploy-config/getting-started.json +jq --arg chainid "$CHAIN_ID" '.l1ChainID = ($chainid | tonumber)' deploy-config/getting-started.json > tmp.json && mv tmp.json deploy-config/getting-started.json + +node update-config.js deploy-config/getting-started.json "$ADMIN_ADDRESS" "$PROPOSER_ADDRESS" "$BATCHER_ADDRESS" "$SEQUENCER_ADDRESS" "$L1_BLOCKHASH" + +echo "Updated the deployment config" + +# Create a .env file +echo "L1_RPC=$L1_RPC" > .env +echo "PRIVATE_KEY_DEPLOYER=$ADMIN_PRIV_KEY" >> .env + +echo "Deploying the L1 smart contracts, this will take a while..." + +# Deploy the L1 smart contracts +yarn hardhat deploy --network getting-started + +echo "Deployed the L1 smart contracts" + +# Read Proxy contarct's JSON and get the address +PROXY_JSON=$(cat deployments/getting-started/Proxy__OVM_L1StandardBridge.json) +PROXY_ADDRESS=$(echo "$PROXY_JSON" | jq -r '.address') + +# Send balance to the above L2 address +yarn hardhat send-balance --to "${PROXY_ADDRESS}" --amount 1 --private-key "${L1_PRIV_KEY}" --network getting-started + +echo "Balance sent to Proxy L2 contract" +echo "Use account ${L1_ADDRESS} to deploy contracts to L2" +echo "Done" diff --git a/app/data/config/fixturenet-optimism/optimism-contracts/send-balance.ts b/app/data/config/fixturenet-optimism/optimism-contracts/send-balance.ts new file mode 100644 index 00000000..54615647 --- /dev/null +++ b/app/data/config/fixturenet-optimism/optimism-contracts/send-balance.ts @@ -0,0 +1,22 @@ +import { task } from 'hardhat/config' +import '@nomiclabs/hardhat-ethers' +import { ethers } from 'ethers' + +task('send-balance', 'Sends Ether to a specified Ethereum account') + .addParam('to', 'The Ethereum address to send Ether to') + .addParam('amount', 'The amount of Ether to send, in Ether') + .addParam('privateKey', 'The private key of the sender') + .setAction(async ({ to, amount, privateKey }, {}) => { + // Open the wallet using sender's private key + const provider = new ethers.providers.JsonRpcProvider(`${process.env.L1_RPC}`) + const wallet = new ethers.Wallet(privateKey, provider) + + // Send amount to the specified address + const tx = await wallet.sendTransaction({ + to, + value: ethers.utils.parseEther(amount), + }) + + console.log(`Balance sent to: ${to}, from: ${wallet.address}`) + console.log(`Transaction hash: ${tx.hash}`) + }) diff --git a/app/data/config/fixturenet-optimism/optimism-contracts/update-config.js b/app/data/config/fixturenet-optimism/optimism-contracts/update-config.js new file mode 100644 index 00000000..8a6c09d4 --- /dev/null +++ b/app/data/config/fixturenet-optimism/optimism-contracts/update-config.js @@ -0,0 +1,36 @@ +const fs = require('fs') + +// Get the command-line argument +const configFile = process.argv[2] +const adminAddress = process.argv[3] +const proposerAddress = process.argv[4] +const batcherAddress = process.argv[5] +const sequencerAddress = process.argv[6] +const blockHash = process.argv[7] + +// Read the JSON file +const configData = fs.readFileSync(configFile) +const configObj = JSON.parse(configData) + +// Update the finalSystemOwner property with the ADMIN_ADDRESS value +configObj.finalSystemOwner = + configObj.portalGuardian = + configObj.controller = + configObj.l2OutputOracleChallenger = + configObj.proxyAdminOwner = + configObj.baseFeeVaultRecipient = + configObj.l1FeeVaultRecipient = + configObj.sequencerFeeVaultRecipient = + configObj.governanceTokenOwner = + adminAddress + +configObj.l2OutputOracleProposer = proposerAddress + +configObj.batchSenderAddress = batcherAddress + +configObj.p2pSequencerAddress = sequencerAddress + +configObj.l1StartingBlockTag = blockHash + +// Write the updated JSON object back to the file +fs.writeFileSync(configFile, JSON.stringify(configObj, null, 2)) diff --git a/app/data/config/fixturenet-optimism/run-op-batcher.sh b/app/data/config/fixturenet-optimism/run-op-batcher.sh new file mode 100755 index 00000000..38ac3ab9 --- /dev/null +++ b/app/data/config/fixturenet-optimism/run-op-batcher.sh @@ -0,0 +1,21 @@ +#!/bin/sh +set -e + +# Get BACTHER_KEY from keys.json +BATCHER_KEY=$(jq -r '.Batcher.privateKey' /l2-accounts/keys.json | tr -d '"') + +op-batcher \ + --l2-eth-rpc=http://op-geth:8545 \ + --rollup-rpc=http://op-node:8547 \ + --poll-interval=1s \ + --sub-safety-margin=6 \ + --num-confirmations=1 \ + --safe-abort-nonce-too-low-count=3 \ + --resubmission-timeout=30s \ + --rpc.addr=0.0.0.0 \ + --rpc.port=8548 \ + --rpc.enable-admin \ + --max-channel-duration=1 \ + --target-l1-tx-size-bytes=2048 \ + --l1-eth-rpc=$L1_RPC \ + --private-key=$BATCHER_KEY diff --git a/app/data/config/fixturenet-optimism/run-op-geth.sh b/app/data/config/fixturenet-optimism/run-op-geth.sh new file mode 100755 index 00000000..1b4e2b0f --- /dev/null +++ b/app/data/config/fixturenet-optimism/run-op-geth.sh @@ -0,0 +1,58 @@ +#!/bin/sh +set -e + +mkdir datadir + +echo "pwd" > datadir/password + +# TODO: Add in container build or use other tool +echo "installing jq" +apk update && apk add jq + +# Get SEQUENCER KEY from keys.json +SEQUENCER_KEY=$(jq -r '.Sequencer.privateKey' /l2-accounts/keys.json | tr -d '"') +echo $SEQUENCER_KEY > datadir/block-signer-key + +geth account import --datadir=datadir --password=datadir/password datadir/block-signer-key + +while [ ! -f "/op-node/jwt.txt" ] +do + echo "Config files not created. Checking after 5 seconds." + sleep 5 +done + +echo "Config files created by op-node, proceeding with script..." + +cp /op-node/genesis.json ./ +geth init --datadir=datadir genesis.json + +SEQUENCER_ADDRESS=$(jq -r '.Sequencer.address' /l2-accounts/keys.json | tr -d '"') +echo "SEQUENCER_ADDRESS: ${SEQUENCER_ADDRESS}" +cp /op-node/jwt.txt ./ +geth \ + --datadir ./datadir \ + --http \ + --http.corsdomain="*" \ + --http.vhosts="*" \ + --http.addr=0.0.0.0 \ + --http.api=web3,debug,eth,txpool,net,engine \ + --ws \ + --ws.addr=0.0.0.0 \ + --ws.port=8546 \ + --ws.origins="*" \ + --ws.api=debug,eth,txpool,net,engine \ + --syncmode=full \ + --gcmode=full \ + --nodiscover \ + --maxpeers=0 \ + --networkid=42069 \ + --authrpc.vhosts="*" \ + --authrpc.addr=0.0.0.0 \ + --authrpc.port=8551 \ + --authrpc.jwtsecret=./jwt.txt \ + --rollup.disabletxpoolgossip=true \ + --password=./datadir/password \ + --allow-insecure-unlock \ + --mine \ + --miner.etherbase=$SEQUENCER_ADDRESS \ + --unlock=$SEQUENCER_ADDRESS diff --git a/app/data/config/fixturenet-optimism/run-op-node.sh b/app/data/config/fixturenet-optimism/run-op-node.sh new file mode 100755 index 00000000..e4aafae9 --- /dev/null +++ b/app/data/config/fixturenet-optimism/run-op-node.sh @@ -0,0 +1,20 @@ +#!/bin/sh +set -e + +# Get SEQUENCER KEY from keys.json +SEQUENCER_KEY=$(jq -r '.Sequencer.privateKey' /l2-accounts/keys.json | tr -d '"') + +op-node \ + --l2=http://op-geth:8551 \ + --l2.jwt-secret=/app/jwt.txt \ + --sequencer.enabled \ + --sequencer.l1-confs=3 \ + --verifier.l1-confs=3 \ + --rollup.config=/app/rollup.json \ + --rpc.addr=0.0.0.0 \ + --rpc.port=8547 \ + --p2p.disable \ + --rpc.enable-admin \ + --p2p.sequencer.key=$SEQUENCER_KEY \ + --l1=$L1_RPC \ + --l1.rpckind=any diff --git a/app/data/container-build/cerc-optimism-contracts/Dockerfile b/app/data/container-build/cerc-optimism-contracts/Dockerfile new file mode 100644 index 00000000..4f244bab --- /dev/null +++ b/app/data/container-build/cerc-optimism-contracts/Dockerfile @@ -0,0 +1,23 @@ +# TODO: Use a node alpine image +FROM cerc/foundry:local + +# Install node (local foundry is a debian based image) +RUN apt-get update \ + && apt-get install -y curl \ + && curl --silent --location https://deb.nodesource.com/setup_16.x | bash - \ + && apt-get update \ + && apt-get install -y nodejs git busybox jq \ + && node -v + +RUN corepack enable \ + && yarn --version + +WORKDIR /app + +# Copy optimism repo contents +COPY . . + +RUN echo "Building optimism" && \ + yarn && yarn build + +WORKDIR /app/packages/contracts-bedrock diff --git a/app/data/container-build/cerc-optimism-contracts/build.sh b/app/data/container-build/cerc-optimism-contracts/build.sh new file mode 100755 index 00000000..8b8e0eaa --- /dev/null +++ b/app/data/container-build/cerc-optimism-contracts/build.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# Build cerc/optimism-contracts + +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t cerc/optimism-contracts:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/optimism diff --git a/app/data/container-build/cerc-optimism-l2geth/build.sh b/app/data/container-build/cerc-optimism-l2geth/build.sh new file mode 100755 index 00000000..3ffada73 --- /dev/null +++ b/app/data/container-build/cerc-optimism-l2geth/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +# Build cerc/optimism-l2geth +docker build -t cerc/optimism-l2geth:local ${CERC_REPO_BASE_DIR}/op-geth diff --git a/app/data/container-build/cerc-optimism-op-batcher/Dockerfile b/app/data/container-build/cerc-optimism-op-batcher/Dockerfile new file mode 100644 index 00000000..542a075f --- /dev/null +++ b/app/data/container-build/cerc-optimism-op-batcher/Dockerfile @@ -0,0 +1,32 @@ +FROM golang:1.19.0-alpine3.15 as builder + +ARG VERSION=v0.0.0 + +RUN apk add --no-cache make gcc musl-dev linux-headers git jq bash + +# build op-batcher with the shared go.mod & go.sum files +COPY ./op-batcher /app/op-batcher +COPY ./op-bindings /app/op-bindings +COPY ./op-node /app/op-node +COPY ./op-service /app/op-service +COPY ./op-signer /app/op-signer +COPY ./go.mod /app/go.mod +COPY ./go.sum /app/go.sum + +COPY ./.git /app/.git + +WORKDIR /app/op-batcher + +RUN go mod download + +ARG TARGETOS TARGETARCH + +RUN make op-batcher VERSION="$VERSION" GOOS=$TARGETOS GOARCH=$TARGETARCH + +FROM alpine:3.15 + +RUN apk add --no-cache jq + +COPY --from=builder /app/op-batcher/bin/op-batcher /usr/local/bin + +ENTRYPOINT ["op-batcher"] diff --git a/app/data/container-build/cerc-optimism-op-batcher/build.sh b/app/data/container-build/cerc-optimism-op-batcher/build.sh new file mode 100755 index 00000000..5bc3a238 --- /dev/null +++ b/app/data/container-build/cerc-optimism-op-batcher/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +# Build cerc/optimism-op-batcher +# TODO: use upstream Dockerfile once its buildx-specific content has been removed +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +docker build -t cerc/optimism-op-batcher:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/optimism diff --git a/app/data/container-build/cerc-optimism-op-node/Dockerfile b/app/data/container-build/cerc-optimism-op-node/Dockerfile new file mode 100644 index 00000000..17d273b6 --- /dev/null +++ b/app/data/container-build/cerc-optimism-op-node/Dockerfile @@ -0,0 +1,30 @@ +FROM golang:1.19.0-alpine3.15 as builder + +ARG VERSION=v0.0.0 + +RUN apk add --no-cache make gcc musl-dev linux-headers git jq bash + +# build op-node with the shared go.mod & go.sum files +COPY ./op-node /app/op-node +COPY ./op-chain-ops /app/op-chain-ops +COPY ./op-service /app/op-service +COPY ./op-bindings /app/op-bindings +COPY ./go.mod /app/go.mod +COPY ./go.sum /app/go.sum +COPY ./.git /app/.git + +WORKDIR /app/op-node + +RUN go mod download + +ARG TARGETOS TARGETARCH + +RUN make op-node VERSION="$VERSION" GOOS=$TARGETOS GOARCH=$TARGETARCH + +FROM alpine:3.15 + +RUN apk add --no-cache openssl jq + +COPY --from=builder /app/op-node/bin/op-node /usr/local/bin + +CMD ["op-node"] diff --git a/app/data/container-build/cerc-optimism-op-node/build.sh b/app/data/container-build/cerc-optimism-op-node/build.sh new file mode 100755 index 00000000..0ec7e656 --- /dev/null +++ b/app/data/container-build/cerc-optimism-op-node/build.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +# Build cerc/optimism-op-node +# TODO: use upstream Dockerfile once its buildx-specific content has been removed +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +docker build -t cerc/optimism-op-node:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/optimism diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index c7b76e8d..150d81ae 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -31,3 +31,6 @@ cerc/tx-spammer cerc/builder-gerbil cerc/act-runner cerc/act-runner-task-executor +cerc/optimism-l2geth +cerc/optimism-op-batcher +cerc/optimism-op-node diff --git a/app/data/pod-list.txt b/app/data/pod-list.txt index abb4ab1f..79c4171a 100644 --- a/app/data/pod-list.txt +++ b/app/data/pod-list.txt @@ -22,3 +22,4 @@ keycloak tx-spammer kubo foundry +fixturenet-optimism diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index 5acc4523..3f8c84bf 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -26,3 +26,5 @@ lirewine/debug lirewine/crypto lirewine/sdk telackey/act_runner +ethereum-optimism/op-geth +ethereum-optimism/optimism diff --git a/app/data/stacks/fixturenet-eth/stack.yml b/app/data/stacks/fixturenet-eth/stack.yml index db3f4231..a44f086e 100644 --- a/app/data/stacks/fixturenet-eth/stack.yml +++ b/app/data/stacks/fixturenet-eth/stack.yml @@ -1,9 +1,8 @@ -version: "1.0" +version: "1.1" name: fixturenet-eth decription: "Ethereum Fixturenet" repos: - cerc-io/go-ethereum - - cerc-io/tx-spammer - dboreham/foundry containers: - cerc/go-ethereum diff --git a/app/data/stacks/fixturenet-optimism/README.md b/app/data/stacks/fixturenet-optimism/README.md new file mode 100644 index 00000000..5b9dd51b --- /dev/null +++ b/app/data/stacks/fixturenet-optimism/README.md @@ -0,0 +1,80 @@ +# fixturenet-optimism + +Instructions to setup and deploy an end-to-end L1+L2 stack with [fixturenet-eth](../fixturenet-eth/) (L1) and [Optimism](https://stack.optimism.io) (L2) + +## Setup + +Clone required repositories: + +```bash +laconic-so --stack fixturenet-optimism setup-repositories +``` + +Checkout to the required versions and branches in repos: + +```bash +# optimism +cd ~/cerc/optimism +git checkout @eth-optimism/sdk@0.0.0-20230329025055 +``` + +Build the container images: + +```bash +laconic-so --stack fixturenet-optimism build-containers +``` + +This should create the required docker images in the local image registry: +* `cerc/go-ethereum` +* `cerc/lighthouse` +* `cerc/fixturenet-eth-geth` +* `cerc/fixturenet-eth-lighthouse` +* `cerc/foundry` +* `cerc/optimism-contracts` +* `cerc/optimism-l2geth` +* `cerc/optimism-op-batcher` +* `cerc/optimism-op-node` + +## Deploy + +Deploy the stack: + +```bash +laconic-so --stack fixturenet-optimism deploy up +``` + +To list down the running containers: + +```bash +laconic-so --stack fixturenet-optimism deploy ps + +# With status +docker ps +``` + +## Clean up + +Stop all services running in the background: + +```bash +laconic-so --stack fixturenet-optimism deploy down +``` + +Remove volumes created by this stack: + +```bash +docker volume ls + +docker volume rm laconic-d527651bba3cb61886b36a7400bd2a38_fixturenet-geth-accounts +docker volume rm laconic-d527651bba3cb61886b36a7400bd2a38_l1-deployment +docker volume rm laconic-d527651bba3cb61886b36a7400bd2a38_l2-accounts +docker volume rm laconic-d527651bba3cb61886b36a7400bd2a38_op_node_data +``` + +## Known Issues + +* Currently not supported: + * Stopping and restarting the stack from where it left off; currently starts fresh on a restart + * Pointing Optimism (L2) to external L1 endpoint to allow running only L2 services +* Resource requirements (memory + time) for building `cerc/foundry` image are on the higher side + * `cerc/optimism-contracts` image is currently based on `cerc/foundry` (Optimism requires foundry installation) diff --git a/app/data/stacks/fixturenet-optimism/stack.yml b/app/data/stacks/fixturenet-optimism/stack.yml new file mode 100644 index 00000000..299b1367 --- /dev/null +++ b/app/data/stacks/fixturenet-optimism/stack.yml @@ -0,0 +1,21 @@ +version: "1.0" +name: fixturenet-optimism +decription: "Optimism Fixturenet" +repos: + - cerc-io/go-ethereum + - dboreham/foundry + - ethereum-optimism/optimism + - ethereum-optimism/op-geth +containers: + - cerc/go-ethereum + - cerc/lighthouse + - cerc/fixturenet-eth-geth + - cerc/fixturenet-eth-lighthouse + - cerc/foundry + - cerc/optimism-contracts + - cerc/optimism-l2geth + - cerc/optimism-op-batcher + - cerc/optimism-op-node +pods: + - fixturenet-eth + - fixturenet-optimism From f23c22d5b9cb170de93dea17d4a26931e311cd1a Mon Sep 17 00:00:00 2001 From: Nabarun Gogoi Date: Mon, 3 Apr 2023 18:13:29 +0530 Subject: [PATCH 0352/1010] Replace laconicd with optimism in mobymask-v2 stack (#272) * Remove laconicd to use optimism endpoint * Use fixturenet-optimism stack for mobymask-v2-watcher * Fix setting L1 account private key in mobymask-v2 stack Former-commit-id: b266ac78b4253ff655875922670797a6e56d578f --- .../compose/docker-compose-fixturenet-eth.yml | 4 +- .../docker-compose-fixturenet-optimism.yml | 22 ++++--- .../docker-compose-watcher-mobymask-v2.yml | 28 ++++++--- .../optimism-contracts/run.sh | 15 +++-- .../config/fixturenet-optimism/run-op-node.sh | 4 +- .../watcher-mobymask-v2/deploy-invite.sh | 11 ++++ .../watcher-mobymask-v2/secrets-template.json | 5 ++ .../config/watcher-mobymask-v2/secrets.json | 5 -- .../watcher-mobymask-v2/server-start.sh | 6 +- .../watcher-config-template.toml | 6 +- .../container-build/cerc-mobymask/Dockerfile | 2 +- app/data/stacks/mobymask-v2/README.md | 61 ++----------------- app/data/stacks/mobymask-v2/demo.md | 6 +- app/data/stacks/mobymask-v2/stack.yml | 18 +++++- 14 files changed, 92 insertions(+), 101 deletions(-) create mode 100644 app/data/config/watcher-mobymask-v2/deploy-invite.sh create mode 100644 app/data/config/watcher-mobymask-v2/secrets-template.json delete mode 100644 app/data/config/watcher-mobymask-v2/secrets.json diff --git a/app/data/compose/docker-compose-fixturenet-eth.yml b/app/data/compose/docker-compose-fixturenet-eth.yml index c51550cc..2eaad084 100644 --- a/app/data/compose/docker-compose-fixturenet-eth.yml +++ b/app/data/compose/docker-compose-fixturenet-eth.yml @@ -25,7 +25,7 @@ services: - ../config/fixturenet-eth/fixturenet-eth.env image: cerc/fixturenet-eth-geth:local volumes: - - fixturenet-geth-accounts:/opt/testnet/build/el + - fixturenet_geth_accounts:/opt/testnet/build/el healthcheck: test: ["CMD", "nc", "-v", "localhost", "8545"] interval: 30s @@ -111,4 +111,4 @@ services: condition: service_healthy volumes: - fixturenet-geth-accounts: + fixturenet_geth_accounts: diff --git a/app/data/compose/docker-compose-fixturenet-optimism.yml b/app/data/compose/docker-compose-fixturenet-optimism.yml index 6e65c46f..6dcde5c9 100644 --- a/app/data/compose/docker-compose-fixturenet-optimism.yml +++ b/app/data/compose/docker-compose-fixturenet-optimism.yml @@ -18,9 +18,9 @@ services: - ../config/fixturenet-optimism/optimism-contracts/send-balance.ts:/app/packages/contracts-bedrock/tasks/send-balance.ts - ../config/fixturenet-optimism/optimism-contracts/update-config.js:/app/packages/contracts-bedrock/update-config.js - ../config/fixturenet-optimism/optimism-contracts/run.sh:/app/packages/contracts-bedrock/run.sh - - fixturenet-geth-accounts:/geth-accounts:ro - - l2-accounts:/l2-accounts - - l1-deployment:/app/packages/contracts-bedrock + - fixturenet_geth_accounts:/geth-accounts:ro + - l2_accounts:/l2-accounts + - l1_deployment:/app/packages/contracts-bedrock op-node-l2-config-gen: image: cerc/optimism-op-node:local @@ -31,7 +31,7 @@ services: L1_RPC: "http://fixturenet-eth-geth-1:8545" volumes: - ../config/fixturenet-optimism/generate-l2-config.sh:/app/generate-l2-config.sh - - l1-deployment:/contracts-bedrock:ro + - l1_deployment:/contracts-bedrock:ro - op_node_data:/app command: ["sh", "/app/generate-l2-config.sh"] @@ -43,7 +43,7 @@ services: volumes: - ../config/fixturenet-optimism/run-op-geth.sh:/run-op-geth.sh - op_node_data:/op-node:ro - - l2-accounts:/l2-accounts:ro + - l2_accounts:/l2-accounts:ro entrypoint: "sh" command: "/run-op-geth.sh" ports: @@ -64,8 +64,8 @@ services: image: cerc/optimism-op-node:local volumes: - ../config/fixturenet-optimism/run-op-node.sh:/app/run-op-node.sh - - op_node_data:/app:ro - - l2-accounts:/l2-accounts:ro + - op_node_data:/op-node-data:ro + - l2_accounts:/l2-accounts:ro command: ["sh", "/app/run-op-node.sh"] ports: - "8547" @@ -80,6 +80,8 @@ services: environment: L1_RPC: "http://fixturenet-eth-geth-1:8545" depends_on: + fixturenet-eth-geth-1: + condition: service_healthy op-node: condition: service_healthy op-geth: @@ -87,11 +89,11 @@ services: image: cerc/optimism-op-batcher:local volumes: - ../config/fixturenet-optimism/run-op-batcher.sh:/run-op-batcher.sh - - l2-accounts:/l2-accounts:ro + - l2_accounts:/l2-accounts:ro entrypoint: "sh" command: "/run-op-batcher.sh" volumes: op_node_data: - l2-accounts: - l1-deployment: + l2_accounts: + l1_deployment: diff --git a/app/data/compose/docker-compose-watcher-mobymask-v2.yml b/app/data/compose/docker-compose-watcher-mobymask-v2.yml index dc4f6928..ed5c203a 100644 --- a/app/data/compose/docker-compose-watcher-mobymask-v2.yml +++ b/app/data/compose/docker-compose-watcher-mobymask-v2.yml @@ -25,12 +25,22 @@ services: restart: unless-stopped image: cerc/mobymask:local working_dir: /app/packages/server + depends_on: + op-node: + condition: service_healthy + op-geth: + condition: service_healthy + # TODO: Configure env file for ETH RPC URL & private key environment: - ENV=PROD - command: ["sh", "-c", "npm start"] + command: ["sh", "./deploy-invite.sh"] volumes: - - ../config/watcher-mobymask-v2/secrets.json:/app/packages/server/secrets.json + # TODO: add a script to set rpc endpoint from env + # add manually if running seperately + - ../config/watcher-mobymask-v2/secrets-template.json:/app/packages/server/secrets-template.json + - ../config/watcher-mobymask-v2/deploy-invite.sh:/app/packages/server/deploy-invite.sh - moby_data_server:/app/packages/server + - fixturenet_geth_accounts:/geth-accounts:ro healthcheck: test: ["CMD", "nc", "-v", "localhost", "3330"] interval: 20s @@ -39,6 +49,7 @@ services: start_period: 10s mobymask-watcher-server: + # TODO: pass optimism rpc endpoint restart: unless-stopped depends_on: mobymask-watcher-db: @@ -48,12 +59,15 @@ services: image: cerc/watcher-mobymask-v2:local command: ["sh", "server-start.sh"] volumes: + # TODO: add a script to set rpc endpoint from env + # add manually if running seperately - ../config/watcher-mobymask-v2/watcher-config-template.toml:/app/packages/mobymask-v2-watcher/environments/watcher-config-template.toml - ../config/watcher-mobymask-v2/peer.env:/app/packages/peer/.env - ../config/watcher-mobymask-v2/relay-id.json:/app/packages/mobymask-v2-watcher/relay-id.json - ../config/watcher-mobymask-v2/peer-id.json:/app/packages/mobymask-v2-watcher/peer-id.json - ../config/watcher-mobymask-v2/server-start.sh:/app/packages/mobymask-v2-watcher/server-start.sh - moby_data_server:/server + - fixturenet_geth_accounts:/geth-accounts:ro ports: - "0.0.0.0:3001:3001" - "0.0.0.0:9001:9001" @@ -65,6 +79,7 @@ services: retries: 15 start_period: 5s + # TODO: Move to a separate pod mobymask-app: depends_on: mobymask-watcher-server: @@ -109,11 +124,4 @@ services: volumes: mobymask_watcher_db_data: moby_data_server: - -networks: - # https://docs.docker.com/compose/networking/#configure-the-default-network - default: - # https://docs.docker.com/compose/networking/#use-a-pre-existing-network - name: mobymask-v2-network - external: true - + fixturenet_geth_accounts: diff --git a/app/data/config/fixturenet-optimism/optimism-contracts/run.sh b/app/data/config/fixturenet-optimism/optimism-contracts/run.sh index 4a5f568b..473b8743 100755 --- a/app/data/config/fixturenet-optimism/optimism-contracts/run.sh +++ b/app/data/config/fixturenet-optimism/optimism-contracts/run.sh @@ -28,10 +28,12 @@ PROPOSER_ADDRESS=$(echo "$KEYS_JSON" | jq -r '.Proposer.address') BATCHER_ADDRESS=$(echo "$KEYS_JSON" | jq -r '.Batcher.address') SEQUENCER_ADDRESS=$(echo "$KEYS_JSON" | jq -r '.Sequencer.address') -# Read the private key of a L1 account +# Read the private key of L1 accounts # TODO: Take from env if /geth-accounts volume doesn't exist to allow using separately running L1 L1_ADDRESS=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 2) L1_PRIV_KEY=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 3) +L1_ADDRESS_2=$(awk -F, 'NR==2{print $(NF-1)}' /geth-accounts/accounts.csv) +L1_PRIV_KEY_2=$(awk -F, 'NR==2{print $NF}' /geth-accounts/accounts.csv) # Send balances to the above L2 addresses yarn hardhat send-balance --to "${ADMIN_ADDRESS}" --amount 2 --private-key "${L1_PRIV_KEY}" --network getting-started @@ -69,13 +71,18 @@ yarn hardhat deploy --network getting-started echo "Deployed the L1 smart contracts" -# Read Proxy contarct's JSON and get the address +# Read Proxy contract's JSON and get the address PROXY_JSON=$(cat deployments/getting-started/Proxy__OVM_L1StandardBridge.json) PROXY_ADDRESS=$(echo "$PROXY_JSON" | jq -r '.address') -# Send balance to the above L2 address +# Send balance to the above Proxy contract in L1 for reflecting balance in L2 +# First account yarn hardhat send-balance --to "${PROXY_ADDRESS}" --amount 1 --private-key "${L1_PRIV_KEY}" --network getting-started +# Second account +yarn hardhat send-balance --to "${PROXY_ADDRESS}" --amount 1 --private-key "${L1_PRIV_KEY_2}" --network getting-started echo "Balance sent to Proxy L2 contract" -echo "Use account ${L1_ADDRESS} to deploy contracts to L2" +echo "Use following accounts for transactions in L2:" +echo "${L1_ADDRESS}" +echo "${L1_ADDRESS_2}" echo "Done" diff --git a/app/data/config/fixturenet-optimism/run-op-node.sh b/app/data/config/fixturenet-optimism/run-op-node.sh index e4aafae9..3be417d0 100755 --- a/app/data/config/fixturenet-optimism/run-op-node.sh +++ b/app/data/config/fixturenet-optimism/run-op-node.sh @@ -6,11 +6,11 @@ SEQUENCER_KEY=$(jq -r '.Sequencer.privateKey' /l2-accounts/keys.json | tr -d '"' op-node \ --l2=http://op-geth:8551 \ - --l2.jwt-secret=/app/jwt.txt \ + --l2.jwt-secret=/op-node-data/jwt.txt \ --sequencer.enabled \ --sequencer.l1-confs=3 \ --verifier.l1-confs=3 \ - --rollup.config=/app/rollup.json \ + --rollup.config=/op-node-data/rollup.json \ --rpc.addr=0.0.0.0 \ --rpc.port=8547 \ --p2p.disable \ diff --git a/app/data/config/watcher-mobymask-v2/deploy-invite.sh b/app/data/config/watcher-mobymask-v2/deploy-invite.sh new file mode 100644 index 00000000..2a8e0eb5 --- /dev/null +++ b/app/data/config/watcher-mobymask-v2/deploy-invite.sh @@ -0,0 +1,11 @@ +#!/bin/sh +set -e + +# Read the private key of L1 account to deploy contract +# TODO: Take from env if /geth-accounts volume doesn't exist to allow using separately running L1 +L1_PRIV_KEY=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 3) + +# Set the private key +jq --arg privateKey "$L1_PRIV_KEY" '.privateKey = ($privateKey)' secrets-template.json > secrets.json + +npm start diff --git a/app/data/config/watcher-mobymask-v2/secrets-template.json b/app/data/config/watcher-mobymask-v2/secrets-template.json new file mode 100644 index 00000000..220efc8e --- /dev/null +++ b/app/data/config/watcher-mobymask-v2/secrets-template.json @@ -0,0 +1,5 @@ +{ + "rpcUrl": "http://op-geth:8545", + "privateKey": "", + "baseURI": "http://127.0.0.1:3002/#" +} diff --git a/app/data/config/watcher-mobymask-v2/secrets.json b/app/data/config/watcher-mobymask-v2/secrets.json deleted file mode 100644 index 127735cd..00000000 --- a/app/data/config/watcher-mobymask-v2/secrets.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "rpcUrl": "http://laconicd:8545", - "privateKey": "GENESIS_ACCOUNT_PRIVATE_KEY", - "baseURI": "http://127.0.0.1:3002/#" -} diff --git a/app/data/config/watcher-mobymask-v2/server-start.sh b/app/data/config/watcher-mobymask-v2/server-start.sh index 80bf4d34..6b4cd345 100755 --- a/app/data/config/watcher-mobymask-v2/server-start.sh +++ b/app/data/config/watcher-mobymask-v2/server-start.sh @@ -1,9 +1,11 @@ #!/bin/sh # Assign deployed contract address from server config -CONTRACT_ADDRESS=`jq '.address' /server/config.json` +CONTRACT_ADDRESS=$(jq -r '.address' /server/config.json | tr -d '"') +L1_PRIV_KEY_2=$(awk -F, 'NR==2{print $NF}' /geth-accounts/accounts.csv) -sed "s/REPLACE_WITH_CONTRACT_ADDRESS/${CONTRACT_ADDRESS}/" environments/watcher-config-template.toml > environments/local.toml +sed "s/REPLACE_WITH_PRIVATE_KEY/${L1_PRIV_KEY_2}/" environments/watcher-config-template.toml > environments/local.toml +sed -i "s/REPLACE_WITH_CONTRACT_ADDRESS/${CONTRACT_ADDRESS}/" environments/local.toml echo 'yarn server' yarn server diff --git a/app/data/config/watcher-mobymask-v2/watcher-config-template.toml b/app/data/config/watcher-mobymask-v2/watcher-config-template.toml index 1a05e225..ff937678 100644 --- a/app/data/config/watcher-mobymask-v2/watcher-config-template.toml +++ b/app/data/config/watcher-mobymask-v2/watcher-config-template.toml @@ -37,8 +37,8 @@ enableDebugInfo = true [server.p2p.peer.l2TxConfig] - privateKey = '' - contractAddress = REPLACE_WITH_CONTRACT_ADDRESS + privateKey = 'REPLACE_WITH_PRIVATE_KEY' + contractAddress = 'REPLACE_WITH_CONTRACT_ADDRESS' [metrics] host = "0.0.0.0" @@ -59,7 +59,7 @@ [upstream] [upstream.ethServer] gqlApiEndpoint = "http://ipld-eth-server:8083/graphql" - rpcProviderEndpoint = "http://laconicd:8545" + rpcProviderEndpoint = "http://op-geth:8545" blockDelayInMilliSecs = 60000 [upstream.cache] diff --git a/app/data/container-build/cerc-mobymask/Dockerfile b/app/data/container-build/cerc-mobymask/Dockerfile index e7b09cf8..c94a1cea 100644 --- a/app/data/container-build/cerc-mobymask/Dockerfile +++ b/app/data/container-build/cerc-mobymask/Dockerfile @@ -1,6 +1,6 @@ FROM node:16.17.1-alpine3.16 -RUN apk --update --no-cache add python3 alpine-sdk +RUN apk --update --no-cache add python3 alpine-sdk jq WORKDIR /app diff --git a/app/data/stacks/mobymask-v2/README.md b/app/data/stacks/mobymask-v2/README.md index fc6f6b05..18af5b2b 100644 --- a/app/data/stacks/mobymask-v2/README.md +++ b/app/data/stacks/mobymask-v2/README.md @@ -28,10 +28,6 @@ git checkout v0.2.31 cd ~/cerc/mobymask-ui git checkout laconic -# laconicd -cd ~/cerc/laconicd -git checkout v0.8.0 - # MobyMask cd ~/cerc/MobyMask git checkout v0.1.1 @@ -47,55 +43,10 @@ This should create the required docker images in the local image registry. Deploy the stack: -* Deploy the laconic chain +* Deploy the containers ```bash - laconic-so --stack mobymask-v2 deploy-system --include mobymask-laconicd up - ``` - -* Check that laconic chain status is healthy - - ```bash - docker ps - ``` - -* Export the private key from laconicd - - ```bash - laconic-so --stack mobymask-v2 deploy-system --include mobymask-laconicd exec laconicd "echo y | laconicd keys export mykey --unarmored-hex --unsafe" - ``` - -* Set the private key in [secrets.json](../../config/watcher-mobymask-v2/secrets.json) file that will be used by mobymask container to deploy contract - -* Create a new account named `alice` - - ```bash - laconic-so --stack mobymask-v2 deploy-system --include mobymask-laconicd exec laconicd "laconicd keys add alice" - ``` - -* Transfer balance to new account - - ```bash - laconic-so --stack mobymask-v2 deploy-system --include mobymask-laconicd exec laconicd 'laconicd tx bank send $(laconicd keys show mykey -a) $(laconicd keys show alice -a) 1000000000000000000000000aphoton --fees 2000aphoton' - ``` - -* Export the private key of new account from laconicd - - ```bash - laconic-so --stack mobymask-v2 deploy-system --include mobymask-laconicd exec laconicd "echo y | laconicd keys export alice --unarmored-hex --unsafe" - ``` - -* Set the private key (`server.p2p.peer.l2TxConfig.privateKey`) in [watcher.toml](../../config/watcher-mobymask-v2/watcher.toml) file that will be used to start the peer that sends txs to L2 chain - - ```toml - [server.p2p.peer.l2TxConfig] - privateKey = 'ALICE_PRIVATE_KEY' - ``` - -* Deploy the other containers - - ```bash - laconic-so --stack mobymask-v2 deploy-system --include watcher-mobymask-v2 up + laconic-so --stack mobymask-v2 deploy-system up ``` * Check that all containers are healthy using `docker ps` @@ -103,7 +54,7 @@ Deploy the stack: NOTE: The `mobymask-ui` container might not start. If mobymask-app is not running at http://localhost:3002, run command again to start the container ```bash - laconic-so --stack mobymask-v2 deploy-system --include watcher-mobymask-v2 up + laconic-so --stack mobymask-v2 deploy-system up ``` ## Tests @@ -111,7 +62,7 @@ Deploy the stack: Find the watcher container's id: ```bash -laconic-so --stack mobymask-v2 deploy-system --include watcher-mobymask-v2 ps | grep "mobymask-watcher-server" +laconic-so --stack mobymask-v2 deploy-system ps | grep "mobymask-watcher-server" ``` Example output @@ -163,9 +114,7 @@ Follow the [demo](./demo.md) to try out the MobyMask app with L2 chain Stop all the services running in background run: ```bash -laconic-so --stack mobymask-v2 deploy-system --include watcher-mobymask-v2 down - -laconic-so --stack mobymask-v2 deploy-system --include mobymask-laconicd down +laconic-so --stack mobymask-v2 deploy-system down ``` Clear volumes: diff --git a/app/data/stacks/mobymask-v2/demo.md b/app/data/stacks/mobymask-v2/demo.md index 09085b89..35416780 100644 --- a/app/data/stacks/mobymask-v2/demo.md +++ b/app/data/stacks/mobymask-v2/demo.md @@ -3,7 +3,7 @@ * Get the root invite link URL for mobymask-app ``` - laconic-so --stack mobymask-v2 deploy-system --include watcher-mobymask-v2 logs mobymask + laconic-so --stack mobymask-v2 deploy-system logs mobymask ``` The invite link is seen at the end of the logs @@ -34,7 +34,7 @@ * Get the container id ```bash - laconic-so --stack mobymask-v2 deploy-system --include watcher-mobymask-v2 ps | grep mobymask-watcher-server + laconic-so --stack mobymask-v2 deploy-system ps | grep mobymask-watcher-server ``` * Check logs @@ -74,7 +74,7 @@ * Get the deployed contract address ```bash - laconic-so --stack mobymask-v2 deploy-system --include watcher-mobymask-v2 exec mobymask-app "cat src/config.json" + laconic-so --stack mobymask-v2 deploy-system exec mobymask-app "cat src/config.json" ``` The value of `address` field is the deployed contract address diff --git a/app/data/stacks/mobymask-v2/stack.yml b/app/data/stacks/mobymask-v2/stack.yml index e3b36bfe..cdcbd663 100644 --- a/app/data/stacks/mobymask-v2/stack.yml +++ b/app/data/stacks/mobymask-v2/stack.yml @@ -1,17 +1,29 @@ version: "1.0" name: mobymask-v2 repos: + - cerc-io/go-ethereum + - dboreham/foundry + - ethereum-optimism/optimism + - ethereum-optimism/op-geth - cerc-io/watcher-ts - cerc-io/react-peer - cerc-io/mobymask-ui - - cerc-io/laconicd - cerc-io/MobyMask containers: + - cerc/go-ethereum + - cerc/lighthouse + - cerc/fixturenet-eth-geth + - cerc/fixturenet-eth-lighthouse + - cerc/foundry + - cerc/optimism-contracts + - cerc/optimism-l2geth + - cerc/optimism-op-batcher + - cerc/optimism-op-node - cerc/watcher-mobymask-v2 - cerc/react-peer - cerc/mobymask-ui - - cerc/laconicd - cerc/mobymask pods: - - mobymask-laconicd + - fixturenet-eth + - fixturenet-optimism - watcher-mobymask-v2 From 287468b7c0e2f7014971cf643a7b431c559a893d Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Mon, 3 Apr 2023 14:59:31 -0500 Subject: [PATCH 0353/1010] Update run script to support COPY and WebSockets. (#275) Former-commit-id: 4da69ebf4c8c3b838e776d086b9d57444b4d6d48 --- .../container-build/cerc-fixturenet-eth-geth/run-el.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh b/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh index 3aa0eaf3..12e59462 100755 --- a/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh +++ b/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh @@ -68,6 +68,7 @@ else --statediff.db.port=$CERC_STATEDIFF_DB_PORT \ --statediff.db.user=$CERC_STATEDIFF_DB_USER \ --statediff.db.logstatements=${CERC_STATEDIFF_DB_LOG_STATEMENTS:-false} \ + --statediff.db.copyfrom=${CERC_STATEDIFF_DB_COPY_FROM:-true} \ --statediff.waitforsync=true \ --statediff.writing=true" fi @@ -78,11 +79,16 @@ else --http \ --http.addr="0.0.0.0" \ --http.vhosts="*" \ - --http.api="eth,web3,net,admin,personal,debug,statediff" \ + --http.api="${CERC_GETH_HTTP_APIS:-eth,web3,net,admin,personal,debug,statediff}" \ --http.corsdomain="*" \ --authrpc.addr="0.0.0.0" \ --authrpc.vhosts="*" \ --authrpc.jwtsecret="/opt/testnet/build/el/jwtsecret" \ + --ws \ + --ws.addr="0.0.0.0" \ + --ws.origins="*" \ + --ws.api="${CERC_GETH_WS_APIS:-eth,web3,net,admin,personal,debug,statediff}" \ + --http.corsdomain="*" \ --networkid="${NETWORK_ID}" \ --netrestrict="${NETRESTRICT}" \ --gcmode archive \ From 22bb1a0bfa248113cab9997ba99bb5131f95f349 Mon Sep 17 00:00:00 2001 From: zramsay Date: Mon, 3 Apr 2023 16:41:07 -0400 Subject: [PATCH 0354/1010] key missing line Former-commit-id: 358c7ea168038784d0b08618ace23240ce0d68df --- app/data/stacks/build-support/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/app/data/stacks/build-support/README.md b/app/data/stacks/build-support/README.md index 72001518..e3993402 100644 --- a/app/data/stacks/build-support/README.md +++ b/app/data/stacks/build-support/README.md @@ -23,6 +23,7 @@ $ laconic-so --stack build-support build-containers --exclude cerc/builder-gerbi ``` $ laconic-so --stack package-registry setup-repositories +$ laconic-so --stack package-registry build-containers $ laconic-so --stack package-registry deploy up [+] Running 3/3 ⠿ Network laconic-aecc4a21d3a502b14522db97d427e850_gitea Created 0.0s From be08ee81ea9b42e69186f58c0be6359de18ebfb0 Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Tue, 4 Apr 2023 14:53:28 +0530 Subject: [PATCH 0355/1010] Add ability to run Optimism fixturenet with external L1 endpoint (#273) * Remove unnecessary todos * Set option to log commands in shell scripts * Replace fixturenet-eth dependency with wait on endpoint * Skip lighthouse node dependency check * Update all services in the stack * Use debug flag to enable shell commands logging * Add bash in op-batcher container * Update mobymask-v2 instructions * Update fixturenet-optimism instructions * Add descriptions for services * Move ts files to container-build * Take L1 RPC endpoint from the env file * Add dev mode restriction for editing env file Former-commit-id: 2515878eeb3456147d4e50e1b39c98f618d1a3d3 --- .../compose/docker-compose-fixturenet-eth.yml | 6 - .../docker-compose-fixturenet-optimism.yml | 60 +++--- .../docker-compose-watcher-mobymask-v2.yml | 10 +- .../fixturenet-optimism/generate-l2-config.sh | 3 + .../config/fixturenet-optimism/l1-params.env | 9 + .../optimism-contracts/run.sh | 45 +++-- .../fixturenet-optimism/run-op-batcher.sh | 3 + .../config/fixturenet-optimism/run-op-geth.sh | 3 + .../config/fixturenet-optimism/run-op-node.sh | 3 + app/data/config/wait-for-it.sh | 182 ++++++++++++++++++ ...nvite.sh => deploy-and-generate-invite.sh} | 0 .../cerc-optimism-contracts/Dockerfile | 1 - .../hardhat-tasks}/rekey-json.ts | 0 .../hardhat-tasks}/send-balance.ts | 0 .../cerc-optimism-op-batcher/Dockerfile | 2 +- app/data/stacks/fixturenet-optimism/README.md | 42 +++- app/data/stacks/fixturenet-optimism/stack.yml | 2 +- app/data/stacks/mobymask-v2/README.md | 41 ++-- app/data/stacks/mobymask-v2/demo.md | 36 ++-- 19 files changed, 349 insertions(+), 99 deletions(-) create mode 100644 app/data/config/fixturenet-optimism/l1-params.env create mode 100755 app/data/config/wait-for-it.sh rename app/data/config/watcher-mobymask-v2/{deploy-invite.sh => deploy-and-generate-invite.sh} (100%) rename app/data/{config/fixturenet-optimism/optimism-contracts => container-build/cerc-optimism-contracts/hardhat-tasks}/rekey-json.ts (100%) rename app/data/{config/fixturenet-optimism/optimism-contracts => container-build/cerc-optimism-contracts/hardhat-tasks}/send-balance.ts (100%) diff --git a/app/data/compose/docker-compose-fixturenet-eth.yml b/app/data/compose/docker-compose-fixturenet-eth.yml index 2eaad084..508543e4 100644 --- a/app/data/compose/docker-compose-fixturenet-eth.yml +++ b/app/data/compose/docker-compose-fixturenet-eth.yml @@ -58,12 +58,6 @@ services: environment: RUN_BOOTNODE: "true" image: cerc/fixturenet-eth-lighthouse:local - healthcheck: - test: ["CMD", "/scripts/status-internal.sh"] - interval: 10s - timeout: 100s - retries: 3 - start_period: 15s fixturenet-eth-lighthouse-1: hostname: fixturenet-eth-lighthouse-1 diff --git a/app/data/compose/docker-compose-fixturenet-optimism.yml b/app/data/compose/docker-compose-fixturenet-optimism.yml index 6dcde5c9..ee7d3cde 100644 --- a/app/data/compose/docker-compose-fixturenet-optimism.yml +++ b/app/data/compose/docker-compose-fixturenet-optimism.yml @@ -1,40 +1,46 @@ version: '3.7' services: + # Generates and funds the accounts required when setting up the L2 chain (outputs to volume l2_accounts) + # Creates / updates the configuration for L1 contracts deployment + # Deploys the L1 smart contracts (outputs to volume l1_deployment) fixturenet-optimism-contracts: hostname: fixturenet-optimism-contracts image: cerc/optimism-contracts:local - depends_on: - fixturenet-eth-geth-1: - condition: service_healthy - fixturenet-eth-bootnode-lighthouse: - condition: service_healthy - environment: - CHAIN_ID: 1212 - L1_RPC: "http://fixturenet-eth-geth-1:8545" - command: "./run.sh" + env_file: + - ../config/fixturenet-optimism/l1-params.env + # Waits for L1 endpoint to be up before running the script + command: | + "./wait-for-it.sh -h $${L1_HOST} -p $${L1_PORT} -s -t 60 -- ./run.sh" volumes: - - ../config/fixturenet-optimism/optimism-contracts/rekey-json.ts:/app/packages/contracts-bedrock/tasks/rekey-json.ts - - ../config/fixturenet-optimism/optimism-contracts/send-balance.ts:/app/packages/contracts-bedrock/tasks/send-balance.ts + - ../config/wait-for-it.sh:/app/packages/contracts-bedrock/wait-for-it.sh + - ../container-build/cerc-optimism-contracts/hardhat-tasks/rekey-json.ts:/app/packages/contracts-bedrock/tasks/rekey-json.ts + - ../container-build/cerc-optimism-contracts/hardhat-tasks/send-balance.ts:/app/packages/contracts-bedrock/tasks/send-balance.ts - ../config/fixturenet-optimism/optimism-contracts/update-config.js:/app/packages/contracts-bedrock/update-config.js - ../config/fixturenet-optimism/optimism-contracts/run.sh:/app/packages/contracts-bedrock/run.sh - fixturenet_geth_accounts:/geth-accounts:ro - l2_accounts:/l2-accounts - l1_deployment:/app/packages/contracts-bedrock + extra_hosts: + - "host.docker.internal:host-gateway" + # Generates the config files required for L2 (outputs to volume op_node_data) op-node-l2-config-gen: image: cerc/optimism-op-node:local depends_on: fixturenet-optimism-contracts: condition: service_completed_successfully - environment: - L1_RPC: "http://fixturenet-eth-geth-1:8545" + env_file: + - ../config/fixturenet-optimism/l1-params.env volumes: - ../config/fixturenet-optimism/generate-l2-config.sh:/app/generate-l2-config.sh - l1_deployment:/contracts-bedrock:ro - op_node_data:/app command: ["sh", "/app/generate-l2-config.sh"] + extra_hosts: + - "host.docker.internal:host-gateway" + # Initializes and runs the L2 execution client op-geth: image: cerc/optimism-l2geth:local depends_on: @@ -55,9 +61,10 @@ services: retries: 10 start_period: 10s + # Runs the L2 consensus client (Sequencer node) op-node: - environment: - L1_RPC: "http://fixturenet-eth-geth-1:8545" + env_file: + - ../config/fixturenet-optimism/l1-params.env depends_on: op-geth: condition: service_healthy @@ -75,25 +82,32 @@ services: timeout: 10s retries: 10 start_period: 10s + extra_hosts: + - "host.docker.internal:host-gateway" + # Runs the batcher (takes transactions from the Sequencer and publishes them to L1) op-batcher: - environment: - L1_RPC: "http://fixturenet-eth-geth-1:8545" + env_file: + - ../config/fixturenet-optimism/l1-params.env depends_on: - fixturenet-eth-geth-1: - condition: service_healthy op-node: condition: service_healthy op-geth: condition: service_healthy image: cerc/optimism-op-batcher:local volumes: + - ../config/wait-for-it.sh:/wait-for-it.sh - ../config/fixturenet-optimism/run-op-batcher.sh:/run-op-batcher.sh - l2_accounts:/l2-accounts:ro - entrypoint: "sh" - command: "/run-op-batcher.sh" + entrypoint: ["sh", "-c"] + # Waits for L1 endpoint to be up before running the batcher + command: | + "/wait-for-it.sh -h $${L1_HOST} -p $${L1_PORT} -s -t 60 -- /run-op-batcher.sh" + extra_hosts: + - "host.docker.internal:host-gateway" volumes: - op_node_data: - l2_accounts: + fixturenet_geth_accounts: l1_deployment: + l2_accounts: + op_node_data: diff --git a/app/data/compose/docker-compose-watcher-mobymask-v2.yml b/app/data/compose/docker-compose-watcher-mobymask-v2.yml index ed5c203a..8478a4d9 100644 --- a/app/data/compose/docker-compose-watcher-mobymask-v2.yml +++ b/app/data/compose/docker-compose-watcher-mobymask-v2.yml @@ -33,12 +33,12 @@ services: # TODO: Configure env file for ETH RPC URL & private key environment: - ENV=PROD - command: ["sh", "./deploy-invite.sh"] + command: ["sh", "./deploy-and-generate-invite.sh"] volumes: - # TODO: add a script to set rpc endpoint from env + # TODO: add a script to set RPC endpoint from env # add manually if running seperately - ../config/watcher-mobymask-v2/secrets-template.json:/app/packages/server/secrets-template.json - - ../config/watcher-mobymask-v2/deploy-invite.sh:/app/packages/server/deploy-invite.sh + - ../config/watcher-mobymask-v2/deploy-and-generate-invite.sh:/app/packages/server/deploy-and-generate-invite.sh - moby_data_server:/app/packages/server - fixturenet_geth_accounts:/geth-accounts:ro healthcheck: @@ -49,7 +49,7 @@ services: start_period: 10s mobymask-watcher-server: - # TODO: pass optimism rpc endpoint + # TODO: pass optimism RPC endpoint restart: unless-stopped depends_on: mobymask-watcher-db: @@ -59,7 +59,7 @@ services: image: cerc/watcher-mobymask-v2:local command: ["sh", "server-start.sh"] volumes: - # TODO: add a script to set rpc endpoint from env + # TODO: add a script to set RPC endpoint from env # add manually if running seperately - ../config/watcher-mobymask-v2/watcher-config-template.toml:/app/packages/mobymask-v2-watcher/environments/watcher-config-template.toml - ../config/watcher-mobymask-v2/peer.env:/app/packages/peer/.env diff --git a/app/data/config/fixturenet-optimism/generate-l2-config.sh b/app/data/config/fixturenet-optimism/generate-l2-config.sh index 25ed2378..0ec60a08 100755 --- a/app/data/config/fixturenet-optimism/generate-l2-config.sh +++ b/app/data/config/fixturenet-optimism/generate-l2-config.sh @@ -1,5 +1,8 @@ #!/bin/sh set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi op-node genesis l2 \ --deploy-config /contracts-bedrock/deploy-config/getting-started.json \ diff --git a/app/data/config/fixturenet-optimism/l1-params.env b/app/data/config/fixturenet-optimism/l1-params.env new file mode 100644 index 00000000..31876523 --- /dev/null +++ b/app/data/config/fixturenet-optimism/l1-params.env @@ -0,0 +1,9 @@ +# Change if pointing to an external L1 endpoint +L1_RPC="http://fixturenet-eth-geth-1:8545" +L1_CHAIN_ID=1212 +L1_HOST="fixturenet-eth-geth-1" +L1_PORT=8545 +L1_ADDRESS= +L1_PRIV_KEY= +L1_ADDRESS_2= +L1_PRIV_KEY_2= diff --git a/app/data/config/fixturenet-optimism/optimism-contracts/run.sh b/app/data/config/fixturenet-optimism/optimism-contracts/run.sh index 473b8743..e10c45e1 100755 --- a/app/data/config/fixturenet-optimism/optimism-contracts/run.sh +++ b/app/data/config/fixturenet-optimism/optimism-contracts/run.sh @@ -1,5 +1,8 @@ #!/bin/bash set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi # TODO Support restarts; fixturenet-eth-geth currently starts fresh on a restart # Exit if a deployment already exists (on restarts) @@ -8,12 +11,14 @@ set -e # exit 0 # fi +echo "Using L1 RPC endpoint ${L1_RPC}" + # Append tasks/index.ts file echo "import './rekey-json'" >> tasks/index.ts echo "import './send-balance'" >> tasks/index.ts # Update the chainId in the hardhat config -sed -i "/getting-started/ {n; s/.*chainId.*/ chainId: $CHAIN_ID,/}" hardhat.config.ts +sed -i "/getting-started/ {n; s/.*chainId.*/ chainId: $L1_CHAIN_ID,/}" hardhat.config.ts # Generate the L2 account addresses yarn hardhat rekey-json --output /l2-accounts/keys.json @@ -29,11 +34,27 @@ BATCHER_ADDRESS=$(echo "$KEYS_JSON" | jq -r '.Batcher.address') SEQUENCER_ADDRESS=$(echo "$KEYS_JSON" | jq -r '.Sequencer.address') # Read the private key of L1 accounts -# TODO: Take from env if /geth-accounts volume doesn't exist to allow using separately running L1 -L1_ADDRESS=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 2) -L1_PRIV_KEY=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 3) -L1_ADDRESS_2=$(awk -F, 'NR==2{print $(NF-1)}' /geth-accounts/accounts.csv) -L1_PRIV_KEY_2=$(awk -F, 'NR==2{print $NF}' /geth-accounts/accounts.csv) +if [ -f /geth-accounts/accounts.csv ]; then + echo "Using L1 account credentials from the mounted volume" + L1_ADDRESS=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 2) + L1_PRIV_KEY=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 3) + L1_ADDRESS_2=$(awk -F, 'NR==2{print $(NF-1)}' /geth-accounts/accounts.csv) + L1_PRIV_KEY_2=$(awk -F, 'NR==2{print $NF}' /geth-accounts/accounts.csv) +else + echo "Using L1 account credentials from env" +fi + +# Select a finalized L1 block as the starting point for roll ups +until FINALIZED_BLOCK=$(cast block finalized --rpc-url "$L1_RPC"); do + echo "Waiting for a finalized L1 block to exist, retrying after 10s" + sleep 10 +done + +L1_BLOCKNUMBER=$(echo "$FINALIZED_BLOCK" | awk '/number/{print $2}') +L1_BLOCKHASH=$(echo "$FINALIZED_BLOCK" | awk '/hash/{print $2}') +L1_BLOCKTIMESTAMP=$(echo "$FINALIZED_BLOCK" | awk '/timestamp/{print $2}') + +echo "Selected L1 block ${L1_BLOCKNUMBER} as the starting block for roll ups" # Send balances to the above L2 addresses yarn hardhat send-balance --to "${ADMIN_ADDRESS}" --amount 2 --private-key "${L1_PRIV_KEY}" --network getting-started @@ -42,19 +63,9 @@ yarn hardhat send-balance --to "${BATCHER_ADDRESS}" --amount 1000 --private-key echo "Balances sent to L2 accounts" -# Select a finalized L1 block as the starting point for roll ups -# TODO Use web3.js to get the latest finalized block -until CAST_OUTPUT=$(cast block finalized --rpc-url "$L1_RPC"); do - echo "Waiting for a finalized L1 block to exist, retrying after 10s" - sleep 10 -done - -L1_BLOCKHASH=$(echo "$CAST_OUTPUT" | awk '/hash/{print $2}') -L1_BLOCKTIMESTAMP=$(echo "$CAST_OUTPUT" | awk '/timestamp/{print $2}') - # Update the deployment config sed -i 's/"l2OutputOracleStartingTimestamp": TIMESTAMP/"l2OutputOracleStartingTimestamp": '"$L1_BLOCKTIMESTAMP"'/g' deploy-config/getting-started.json -jq --arg chainid "$CHAIN_ID" '.l1ChainID = ($chainid | tonumber)' deploy-config/getting-started.json > tmp.json && mv tmp.json deploy-config/getting-started.json +jq --arg chainid "$L1_CHAIN_ID" '.l1ChainID = ($chainid | tonumber)' deploy-config/getting-started.json > tmp.json && mv tmp.json deploy-config/getting-started.json node update-config.js deploy-config/getting-started.json "$ADMIN_ADDRESS" "$PROPOSER_ADDRESS" "$BATCHER_ADDRESS" "$SEQUENCER_ADDRESS" "$L1_BLOCKHASH" diff --git a/app/data/config/fixturenet-optimism/run-op-batcher.sh b/app/data/config/fixturenet-optimism/run-op-batcher.sh index 38ac3ab9..3cab3e94 100755 --- a/app/data/config/fixturenet-optimism/run-op-batcher.sh +++ b/app/data/config/fixturenet-optimism/run-op-batcher.sh @@ -1,5 +1,8 @@ #!/bin/sh set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi # Get BACTHER_KEY from keys.json BATCHER_KEY=$(jq -r '.Batcher.privateKey' /l2-accounts/keys.json | tr -d '"') diff --git a/app/data/config/fixturenet-optimism/run-op-geth.sh b/app/data/config/fixturenet-optimism/run-op-geth.sh index 1b4e2b0f..cb180065 100755 --- a/app/data/config/fixturenet-optimism/run-op-geth.sh +++ b/app/data/config/fixturenet-optimism/run-op-geth.sh @@ -1,5 +1,8 @@ #!/bin/sh set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi mkdir datadir diff --git a/app/data/config/fixturenet-optimism/run-op-node.sh b/app/data/config/fixturenet-optimism/run-op-node.sh index 3be417d0..f495aeef 100755 --- a/app/data/config/fixturenet-optimism/run-op-node.sh +++ b/app/data/config/fixturenet-optimism/run-op-node.sh @@ -1,5 +1,8 @@ #!/bin/sh set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi # Get SEQUENCER KEY from keys.json SEQUENCER_KEY=$(jq -r '.Sequencer.privateKey' /l2-accounts/keys.json | tr -d '"') diff --git a/app/data/config/wait-for-it.sh b/app/data/config/wait-for-it.sh new file mode 100755 index 00000000..d990e0d3 --- /dev/null +++ b/app/data/config/wait-for-it.sh @@ -0,0 +1,182 @@ +#!/usr/bin/env bash +# Use this script to test if a given TCP host/port are available + +WAITFORIT_cmdname=${0##*/} + +echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi } + +usage() +{ + cat << USAGE >&2 +Usage: + $WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args] + -h HOST | --host=HOST Host or IP under test + -p PORT | --port=PORT TCP port under test + Alternatively, you specify the host and port as host:port + -s | --strict Only execute subcommand if the test succeeds + -q | --quiet Don't output any status messages + -t TIMEOUT | --timeout=TIMEOUT + Timeout in seconds, zero for no timeout + -- COMMAND ARGS Execute command with args after the test finishes +USAGE + exit 1 +} + +wait_for() +{ + if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then + echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" + else + echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout" + fi + WAITFORIT_start_ts=$(date +%s) + while : + do + if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then + nc -z $WAITFORIT_HOST $WAITFORIT_PORT + WAITFORIT_result=$? + else + (echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1 + WAITFORIT_result=$? + fi + if [[ $WAITFORIT_result -eq 0 ]]; then + WAITFORIT_end_ts=$(date +%s) + echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds" + break + fi + sleep 1 + done + return $WAITFORIT_result +} + +wait_for_wrapper() +{ + # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 + if [[ $WAITFORIT_QUIET -eq 1 ]]; then + timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & + else + timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & + fi + WAITFORIT_PID=$! + trap "kill -INT -$WAITFORIT_PID" INT + wait $WAITFORIT_PID + WAITFORIT_RESULT=$? + if [[ $WAITFORIT_RESULT -ne 0 ]]; then + echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" + fi + return $WAITFORIT_RESULT +} + +# process arguments +while [[ $# -gt 0 ]] +do + case "$1" in + *:* ) + WAITFORIT_hostport=(${1//:/ }) + WAITFORIT_HOST=${WAITFORIT_hostport[0]} + WAITFORIT_PORT=${WAITFORIT_hostport[1]} + shift 1 + ;; + --child) + WAITFORIT_CHILD=1 + shift 1 + ;; + -q | --quiet) + WAITFORIT_QUIET=1 + shift 1 + ;; + -s | --strict) + WAITFORIT_STRICT=1 + shift 1 + ;; + -h) + WAITFORIT_HOST="$2" + if [[ $WAITFORIT_HOST == "" ]]; then break; fi + shift 2 + ;; + --host=*) + WAITFORIT_HOST="${1#*=}" + shift 1 + ;; + -p) + WAITFORIT_PORT="$2" + if [[ $WAITFORIT_PORT == "" ]]; then break; fi + shift 2 + ;; + --port=*) + WAITFORIT_PORT="${1#*=}" + shift 1 + ;; + -t) + WAITFORIT_TIMEOUT="$2" + if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi + shift 2 + ;; + --timeout=*) + WAITFORIT_TIMEOUT="${1#*=}" + shift 1 + ;; + --) + shift + WAITFORIT_CLI=("$@") + break + ;; + --help) + usage + ;; + *) + echoerr "Unknown argument: $1" + usage + ;; + esac +done + +if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then + echoerr "Error: you need to provide a host and port to test." + usage +fi + +WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15} +WAITFORIT_STRICT=${WAITFORIT_STRICT:-0} +WAITFORIT_CHILD=${WAITFORIT_CHILD:-0} +WAITFORIT_QUIET=${WAITFORIT_QUIET:-0} + +# Check to see if timeout is from busybox? +WAITFORIT_TIMEOUT_PATH=$(type -p timeout) +WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH) + +WAITFORIT_BUSYTIMEFLAG="" +if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then + WAITFORIT_ISBUSY=1 + # Check if busybox timeout uses -t flag + # (recent Alpine versions don't support -t anymore) + if timeout &>/dev/stdout | grep -q -e '-t '; then + WAITFORIT_BUSYTIMEFLAG="-t" + fi +else + WAITFORIT_ISBUSY=0 +fi + +if [[ $WAITFORIT_CHILD -gt 0 ]]; then + wait_for + WAITFORIT_RESULT=$? + exit $WAITFORIT_RESULT +else + if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then + wait_for_wrapper + WAITFORIT_RESULT=$? + else + wait_for + WAITFORIT_RESULT=$? + fi +fi + +if [[ $WAITFORIT_CLI != "" ]]; then + if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then + echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess" + exit $WAITFORIT_RESULT + fi + exec "${WAITFORIT_CLI[@]}" +else + exit $WAITFORIT_RESULT +fi diff --git a/app/data/config/watcher-mobymask-v2/deploy-invite.sh b/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh similarity index 100% rename from app/data/config/watcher-mobymask-v2/deploy-invite.sh rename to app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh diff --git a/app/data/container-build/cerc-optimism-contracts/Dockerfile b/app/data/container-build/cerc-optimism-contracts/Dockerfile index 4f244bab..cdc98b08 100644 --- a/app/data/container-build/cerc-optimism-contracts/Dockerfile +++ b/app/data/container-build/cerc-optimism-contracts/Dockerfile @@ -1,4 +1,3 @@ -# TODO: Use a node alpine image FROM cerc/foundry:local # Install node (local foundry is a debian based image) diff --git a/app/data/config/fixturenet-optimism/optimism-contracts/rekey-json.ts b/app/data/container-build/cerc-optimism-contracts/hardhat-tasks/rekey-json.ts similarity index 100% rename from app/data/config/fixturenet-optimism/optimism-contracts/rekey-json.ts rename to app/data/container-build/cerc-optimism-contracts/hardhat-tasks/rekey-json.ts diff --git a/app/data/config/fixturenet-optimism/optimism-contracts/send-balance.ts b/app/data/container-build/cerc-optimism-contracts/hardhat-tasks/send-balance.ts similarity index 100% rename from app/data/config/fixturenet-optimism/optimism-contracts/send-balance.ts rename to app/data/container-build/cerc-optimism-contracts/hardhat-tasks/send-balance.ts diff --git a/app/data/container-build/cerc-optimism-op-batcher/Dockerfile b/app/data/container-build/cerc-optimism-op-batcher/Dockerfile index 542a075f..23d6b629 100644 --- a/app/data/container-build/cerc-optimism-op-batcher/Dockerfile +++ b/app/data/container-build/cerc-optimism-op-batcher/Dockerfile @@ -25,7 +25,7 @@ RUN make op-batcher VERSION="$VERSION" GOOS=$TARGETOS GOARCH=$TARGETARCH FROM alpine:3.15 -RUN apk add --no-cache jq +RUN apk add --no-cache jq bash COPY --from=builder /app/op-batcher/bin/op-batcher /usr/local/bin diff --git a/app/data/stacks/fixturenet-optimism/README.md b/app/data/stacks/fixturenet-optimism/README.md index 5b9dd51b..2f13ec88 100644 --- a/app/data/stacks/fixturenet-optimism/README.md +++ b/app/data/stacks/fixturenet-optimism/README.md @@ -8,12 +8,15 @@ Clone required repositories: ```bash laconic-so --stack fixturenet-optimism setup-repositories + +# Exclude cerc-io/go-ethereum repository if running L1 separately +laconic-so --stack fixturenet-optimism setup-repositories --exclude cerc-io/go-ethereum ``` Checkout to the required versions and branches in repos: ```bash -# optimism +# Optimism cd ~/cerc/optimism git checkout @eth-optimism/sdk@0.0.0-20230329025055 ``` @@ -22,6 +25,9 @@ Build the container images: ```bash laconic-so --stack fixturenet-optimism build-containers + +# Only build containers required for L2 if running L1 separately +laconic-so --stack fixturenet-optimism build-containers --include cerc/foundry,cerc/optimism-contracts,cerc/optimism-op-node,cerc/optimism-l2geth,cerc/optimism-op-batcher ``` This should create the required docker images in the local image registry: @@ -37,19 +43,36 @@ This should create the required docker images in the local image registry: ## Deploy +(Optional) Update the [l1-params.env](../../config/fixturenet-optimism/l1-params.env) file with L1 endpoint (`L1_RPC`, `L1_HOST` and `L1_PORT`) and other params if running L1 separately + +* NOTE: + * Stack Orchestrator needs to be run in [`dev`](/docs/CONTRIBUTING.md#install-developer-mode) mode to be able to edit the env file + * If L1 is running on the host machine, use `host.docker.internal` as the hostname to access the host port + Deploy the stack: ```bash laconic-so --stack fixturenet-optimism deploy up + +# Only start fixturenet-optimism pod (L2) if running L1 separately +laconic-so --stack fixturenet-optimism deploy up --include fixturenet-optimism ``` -To list down the running containers: +The `fixturenet-optimism-contracts` service may take a while (`~15 mins`) to complete running as it: +1. waits for the 'Merge' to happen on L1 +2. waits for a finalized block to exist on L1 (so that it can be taken as a starting block for roll ups) +3. deploys the L1 contracts + +To list down and monitor the running containers: ```bash laconic-so --stack fixturenet-optimism deploy ps # With status docker ps + +# Check logs for a container +docker logs -f ``` ## Clean up @@ -58,23 +81,24 @@ Stop all services running in the background: ```bash laconic-so --stack fixturenet-optimism deploy down + +# If only ran fixturenet-optimism pod (L2) +laconic-so --stack fixturenet-optimism deploy down --include fixturenet-optimism ``` -Remove volumes created by this stack: +Clear volumes created by this stack: ```bash -docker volume ls +# List all relevant volumes +docker volume ls -q --filter name=laconic* -docker volume rm laconic-d527651bba3cb61886b36a7400bd2a38_fixturenet-geth-accounts -docker volume rm laconic-d527651bba3cb61886b36a7400bd2a38_l1-deployment -docker volume rm laconic-d527651bba3cb61886b36a7400bd2a38_l2-accounts -docker volume rm laconic-d527651bba3cb61886b36a7400bd2a38_op_node_data +# Remove all the listed volumes +docker volume rm $(docker volume ls -q --filter name=laconic*) ``` ## Known Issues * Currently not supported: * Stopping and restarting the stack from where it left off; currently starts fresh on a restart - * Pointing Optimism (L2) to external L1 endpoint to allow running only L2 services * Resource requirements (memory + time) for building `cerc/foundry` image are on the higher side * `cerc/optimism-contracts` image is currently based on `cerc/foundry` (Optimism requires foundry installation) diff --git a/app/data/stacks/fixturenet-optimism/stack.yml b/app/data/stacks/fixturenet-optimism/stack.yml index 299b1367..e53623ca 100644 --- a/app/data/stacks/fixturenet-optimism/stack.yml +++ b/app/data/stacks/fixturenet-optimism/stack.yml @@ -13,9 +13,9 @@ containers: - cerc/fixturenet-eth-lighthouse - cerc/foundry - cerc/optimism-contracts + - cerc/optimism-op-node - cerc/optimism-l2geth - cerc/optimism-op-batcher - - cerc/optimism-op-node pods: - fixturenet-eth - fixturenet-optimism diff --git a/app/data/stacks/mobymask-v2/README.md b/app/data/stacks/mobymask-v2/README.md index 18af5b2b..68b9b61c 100644 --- a/app/data/stacks/mobymask-v2/README.md +++ b/app/data/stacks/mobymask-v2/README.md @@ -31,6 +31,10 @@ git checkout laconic # MobyMask cd ~/cerc/MobyMask git checkout v0.1.1 + +# Optimism +cd ~/cerc/optimism +git checkout @eth-optimism/sdk@0.0.0-20230329025055 ``` Build the container images: @@ -43,29 +47,33 @@ This should create the required docker images in the local image registry. Deploy the stack: -* Deploy the containers +* Deploy the containers: ```bash laconic-so --stack mobymask-v2 deploy-system up ``` -* Check that all containers are healthy using `docker ps` +* List and check the health status of all the containers using `docker ps` and wait for them to be `healthy` - NOTE: The `mobymask-ui` container might not start. If mobymask-app is not running at http://localhost:3002, run command again to start the container + NOTE: The `mobymask-app` container might not start; if the app is not running at http://localhost:3002, restart the container using it's id: ```bash - laconic-so --stack mobymask-v2 deploy-system up + docker ps -a | grep "mobymask-app" + + docker restart ``` ## Tests -Find the watcher container's id: +Find the watcher container's id and export it for later use: ```bash laconic-so --stack mobymask-v2 deploy-system ps | grep "mobymask-watcher-server" + +export CONTAINER_ID= ``` -Example output +Example output: ``` id: 5d3aae4b22039fcd1c9b18feeb91318ede1100581e75bb5ac54f9e436066b02c, name: laconic-bfb01caf98b1b8f7c8db4d33f11b905a-mobymask-watcher-server-1, ports: 0.0.0.0:3001->3001/tcp, 0.0.0.0:9001->9001/tcp, 0.0.0.0:9090->9090/tcp @@ -73,12 +81,6 @@ id: 5d3aae4b22039fcd1c9b18feeb91318ede1100581e75bb5ac54f9e436066b02c, name: laco In above output the container ID is `5d3aae4b22039fcd1c9b18feeb91318ede1100581e75bb5ac54f9e436066b02c` -Export it for later use: - -```bash -export CONTAINER_ID= -``` - Run the peer tests: ```bash @@ -87,7 +89,11 @@ docker exec -w /app/packages/peer $CONTAINER_ID yarn test ## Web Apps -Check that the status for web-app containers are healthy by using `docker ps` +Check that the web-app containers are healthy: + +```bash +docker ps | grep -E 'mobymask-app|peer-test-app' +``` ### mobymask-app @@ -119,15 +125,14 @@ laconic-so --stack mobymask-v2 deploy-system down Clear volumes: -* List all volumes +* List all relevant volumes: ```bash - docker volume ls + docker volume ls -q --filter name=laconic* ``` -* Remove volumes created by this stack +* Remove all the listed volumes: - Example: ```bash - docker volume rm laconic-bfb01caf98b1b8f7c8db4d33f11b905a_moby_data_server + docker volume rm $(docker volume ls -q --filter name=laconic*) ``` diff --git a/app/data/stacks/mobymask-v2/demo.md b/app/data/stacks/mobymask-v2/demo.md index 35416780..8a5049c4 100644 --- a/app/data/stacks/mobymask-v2/demo.md +++ b/app/data/stacks/mobymask-v2/demo.md @@ -1,22 +1,22 @@ # Demo -* Get the root invite link URL for mobymask-app +* Get the root invite link URL for mobymask-app: - ``` + ```bash laconic-so --stack mobymask-v2 deploy-system logs mobymask ``` - The invite link is seen at the end of the logs - Example: - ``` + The invite link is seen at the end of the logs. Example log: + + ```bash laconic-bfb01caf98b1b8f7c8db4d33f11b905a-mobymask-1 | http://127.0.0.1:3002/#/members?invitation=%7B%22v%22%3A1%2C%22signedDelegations%22%3A%5B%7B%22signature%22%3A%220x7559bd412f02677d60820e38243acf61547f79339395a34f7d4e1630e645aeb30535fc219f79b6fbd3af0ce3bd05132ad46d2b274a9fbc4c36bc71edd09850891b%22%2C%22delegation%22%3A%7B%22delegate%22%3A%220xc0838c92B2b71756E0eAD5B3C1e1F186baeEAAac%22%2C%22authority%22%3A%220x0000000000000000000000000000000000000000000000000000000000000000%22%2C%22caveats%22%3A%5B%7B%22enforcer%22%3A%220x558024C7d593B840E1BfD83E9B287a5CDad4db15%22%2C%22terms%22%3A%220x0000000000000000000000000000000000000000000000000000000000000000%22%7D%5D%7D%7D%5D%2C%22key%22%3A%220x98da9805821f1802196443e578fd32af567bababa0a249c07c82df01ecaa7d8d%22%7D ``` -* Open the invite link in browser to use the mobymask-app. +* Open the invite link in a browser to use the mobymask-app. NOTE: Before opening the invite link, clear the browser cache (local storage) for http://127.0.0.1:3002 to remove old invitations -* In the debug panel, check if it is connected to the p2p network (It should be connected to atleast one other peer for pubsub to work). +* In the debug panel, check if it is connected to the p2p network (it should be connected to at least one other peer for pubsub to work). * Create an invite link in the app by clicking on `Create new invite link` button. @@ -31,24 +31,24 @@ * In a terminal check logs from the watcher peer container. - * Get the container id + * Get the container id: ```bash laconic-so --stack mobymask-v2 deploy-system ps | grep mobymask-watcher-server ``` - * Check logs + * Check logs: ```bash - docker logs -f CONTAINER_ID + docker logs -f ``` -* It should have received the message, sent transaction to L2 chain and received a transaction receipt with block details. +* It should have received the message, sent transaction to L2 chain and received a transaction receipt for an `invoke` message with block details. Example log: - ``` - 2023-03-23T10:25:19.771Z vulcanize:peer-listener [10:25:19] Received a message on mobymask P2P network from peer: PeerId(12D3KooWAVNswtcrX12iDYukEoxdQwD34kJyRWcQTfZ4unGg2xjd) + ```bash + 2023-03-23T10:25:19.771Z vulcanize:peer-listener [10:25:19] Received a message on mobymask P2P network from peer: 12D3KooWAVNswtcrX12iDYukEoxdQwD34kJyRWcQTfZ4unGg2xjd 2023-03-23T10:25:24.143Z laconic:libp2p-utils Transaction receipt for invoke message { to: '0x558024C7d593B840E1BfD83E9B287a5CDad4db15', blockNumber: 1996, @@ -60,7 +60,7 @@ ``` * Check the phisher in watcher GQL: http://localhost:3001/graphql - * Use the blockHash from transaction receipt details or query for latest block + * Use the blockHash from transaction receipt details or query for latest block: ```gql query { @@ -71,7 +71,7 @@ } ``` - * Get the deployed contract address + * Get the deployed contract address: ```bash laconic-so --stack mobymask-v2 deploy-system exec mobymask-app "cat src/config.json" @@ -94,7 +94,7 @@ } ``` - It should return true for reported phisher names. + It should return `true` for reported phisher names. * Watcher internally is using L2 chain `eth_getStorageAt` method. @@ -107,7 +107,7 @@ * Revocation messages can be seen in the debug panel `MESSAGES` tab of other browsers. -* Check the watcher peer logs. It should receive a message and log the transaction receipt for revoke message. +* Check the watcher peer logs. It should receive a message and log the transaction receipt for a `revoke` message. * Try reporting a phisher from the revoked invitee's browser. @@ -129,4 +129,4 @@ } ``` - It should return false as the invitation/delegation used for reporting phishers has been revoked. + It should return `false` as the invitation/delegation used for reporting phishers has been revoked. From 4da19b652ef62a0280ebd0d6e5588d0ebd8547e5 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 4 Apr 2023 11:29:16 -0600 Subject: [PATCH 0356/1010] Update version Former-commit-id: 9e4240df0763dc963ae85196c62e0362bcedb897 --- app/data/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/version.txt b/app/data/version.txt index 7a0035e1..0c1b3362 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ # This file should be re-generated running: scripts/update-version-file.sh script -v1.0.35-df23476 +v1.0.36-2515878 From b4d9a3a831cf513f387db588fc3c402eba600a70 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 4 Apr 2023 20:26:19 -0600 Subject: [PATCH 0357/1010] Fail on error installing package Former-commit-id: 11375fed0c9309f98693320db98c2dad3157fbd6 --- .../container-build/cerc-builder-gerbil/install-dependencies.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/container-build/cerc-builder-gerbil/install-dependencies.sh b/app/data/container-build/cerc-builder-gerbil/install-dependencies.sh index dbbbfe84..36855a9b 100755 --- a/app/data/container-build/cerc-builder-gerbil/install-dependencies.sh +++ b/app/data/container-build/cerc-builder-gerbil/install-dependencies.sh @@ -11,6 +11,6 @@ DEPS=(github.com/fare/gerbil-utils ) ; for i in ${DEPS[@]} ; do echo "Installing gerbil package: $i" - gxpkg install $i && + gxpkg install $i gxpkg build $i done From 464ef89a012494659871903f122629a2b2724f67 Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Wed, 5 Apr 2023 10:25:50 +0530 Subject: [PATCH 0358/1010] Handle restarts for services in `fixturenet-optimism` stack (#282) * Check existing L1 contracts deployment * Rename volume used for generated L2 config * Check for existing L2 geth data directory * Cross check existing L2 config against L1 deployment config * Verify sequencer key in existing L2 geth data directory * Add instructions to troubleshoot corrupt L2 geth dir * Separate out instructions to run L2 with external L1 * Update docs Former-commit-id: 9ffa9bb5a97b454da76c8cdeb1722109ce430b53 --- .../docker-compose-fixturenet-optimism.yml | 15 ++-- .../fixturenet-optimism/generate-l2-config.sh | 21 +++++ .../optimism-contracts/run.sh | 41 ++++++--- .../config/fixturenet-optimism/run-op-geth.sh | 52 +++++++---- .../verify-contract-deployment.ts | 30 +++++++ .../stacks/fixturenet-optimism/L2-ONLY.md | 87 +++++++++++++++++++ app/data/stacks/fixturenet-optimism/README.md | 56 +++++++----- 7 files changed, 247 insertions(+), 55 deletions(-) create mode 100644 app/data/container-build/cerc-optimism-contracts/hardhat-tasks/verify-contract-deployment.ts create mode 100644 app/data/stacks/fixturenet-optimism/L2-ONLY.md diff --git a/app/data/compose/docker-compose-fixturenet-optimism.yml b/app/data/compose/docker-compose-fixturenet-optimism.yml index ee7d3cde..d2e96d3f 100644 --- a/app/data/compose/docker-compose-fixturenet-optimism.yml +++ b/app/data/compose/docker-compose-fixturenet-optimism.yml @@ -14,6 +14,7 @@ services: "./wait-for-it.sh -h $${L1_HOST} -p $${L1_PORT} -s -t 60 -- ./run.sh" volumes: - ../config/wait-for-it.sh:/app/packages/contracts-bedrock/wait-for-it.sh + - ../container-build/cerc-optimism-contracts/hardhat-tasks/verify-contract-deployment.ts:/app/packages/contracts-bedrock/tasks/verify-contract-deployment.ts - ../container-build/cerc-optimism-contracts/hardhat-tasks/rekey-json.ts:/app/packages/contracts-bedrock/tasks/rekey-json.ts - ../container-build/cerc-optimism-contracts/hardhat-tasks/send-balance.ts:/app/packages/contracts-bedrock/tasks/send-balance.ts - ../config/fixturenet-optimism/optimism-contracts/update-config.js:/app/packages/contracts-bedrock/update-config.js @@ -24,7 +25,7 @@ services: extra_hosts: - "host.docker.internal:host-gateway" - # Generates the config files required for L2 (outputs to volume op_node_data) + # Generates the config files required for L2 (outputs to volume l2_config) op-node-l2-config-gen: image: cerc/optimism-op-node:local depends_on: @@ -35,12 +36,12 @@ services: volumes: - ../config/fixturenet-optimism/generate-l2-config.sh:/app/generate-l2-config.sh - l1_deployment:/contracts-bedrock:ro - - op_node_data:/app + - l2_config:/app command: ["sh", "/app/generate-l2-config.sh"] extra_hosts: - "host.docker.internal:host-gateway" - # Initializes and runs the L2 execution client + # Initializes and runs the L2 execution client (outputs to volume l2_geth_data) op-geth: image: cerc/optimism-l2geth:local depends_on: @@ -48,8 +49,9 @@ services: condition: service_started volumes: - ../config/fixturenet-optimism/run-op-geth.sh:/run-op-geth.sh - - op_node_data:/op-node:ro + - l2_config:/op-node:ro - l2_accounts:/l2-accounts:ro + - l2_geth_data:/datadir entrypoint: "sh" command: "/run-op-geth.sh" ports: @@ -71,7 +73,7 @@ services: image: cerc/optimism-op-node:local volumes: - ../config/fixturenet-optimism/run-op-node.sh:/app/run-op-node.sh - - op_node_data:/op-node-data:ro + - l2_config:/op-node-data:ro - l2_accounts:/l2-accounts:ro command: ["sh", "/app/run-op-node.sh"] ports: @@ -110,4 +112,5 @@ volumes: fixturenet_geth_accounts: l1_deployment: l2_accounts: - op_node_data: + l2_config: + l2_geth_data: diff --git a/app/data/config/fixturenet-optimism/generate-l2-config.sh b/app/data/config/fixturenet-optimism/generate-l2-config.sh index 0ec60a08..9c439f32 100755 --- a/app/data/config/fixturenet-optimism/generate-l2-config.sh +++ b/app/data/config/fixturenet-optimism/generate-l2-config.sh @@ -4,6 +4,27 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi +# Check existing config if it exists +if [ -f /app/jwt.txt ] && [ -f /app/rollup.json ]; then + echo "Found existing L2 config, cross-checking with L1 deployment config" + + SOURCE_L1_CONF=$(cat /contracts-bedrock/deploy-config/getting-started.json) + EXP_L1_BLOCKHASH=$(echo "$SOURCE_L1_CONF" | jq -r '.l1StartingBlockTag') + EXP_BATCHER=$(echo "$SOURCE_L1_CONF" | jq -r '.batchSenderAddress') + + GEN_L2_CONF=$(cat /app/rollup.json) + GEN_L1_BLOCKHASH=$(echo "$GEN_L2_CONF" | jq -r '.genesis.l1.hash') + GEN_BATCHER=$(echo "$GEN_L2_CONF" | jq -r '.genesis.system_config.batcherAddr') + + if [ "$EXP_L1_BLOCKHASH" = "$GEN_L1_BLOCKHASH" ] && [ "$EXP_BATCHER" = "$GEN_BATCHER" ]; then + echo "Config cross-checked, exiting" + exit 0 + fi + + echo "Existing L2 config doesn't match the L1 deployment config, please clear L2 config volume before starting" + exit 1 +fi + op-node genesis l2 \ --deploy-config /contracts-bedrock/deploy-config/getting-started.json \ --deployment-dir /contracts-bedrock/deployments/getting-started/ \ diff --git a/app/data/config/fixturenet-optimism/optimism-contracts/run.sh b/app/data/config/fixturenet-optimism/optimism-contracts/run.sh index e10c45e1..d4585d4a 100755 --- a/app/data/config/fixturenet-optimism/optimism-contracts/run.sh +++ b/app/data/config/fixturenet-optimism/optimism-contracts/run.sh @@ -4,22 +4,43 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi -# TODO Support restarts; fixturenet-eth-geth currently starts fresh on a restart -# Exit if a deployment already exists (on restarts) -# if [ -d "deployments/getting-started" ]; then -# echo "Deployment directory deployments/getting-started already exists, exiting" -# exit 0 -# fi - echo "Using L1 RPC endpoint ${L1_RPC}" -# Append tasks/index.ts file -echo "import './rekey-json'" >> tasks/index.ts -echo "import './send-balance'" >> tasks/index.ts +IMPORT_1="import './verify-contract-deployment'" +IMPORT_2="import './rekey-json'" +IMPORT_3="import './send-balance'" + +# Append mounted tasks to tasks/index.ts file if not present +if ! grep -Fxq "$IMPORT_1" tasks/index.ts; then + echo "$IMPORT_1" >> tasks/index.ts + echo "$IMPORT_2" >> tasks/index.ts + echo "$IMPORT_3" >> tasks/index.ts +fi # Update the chainId in the hardhat config sed -i "/getting-started/ {n; s/.*chainId.*/ chainId: $L1_CHAIN_ID,/}" hardhat.config.ts +# Exit if a deployment already exists (on restarts) +# Note: fixturenet-eth-geth currently starts fresh on a restart +if [ -d "deployments/getting-started" ]; then + echo "Deployment directory deployments/getting-started found, checking SystemDictator deployment" + + # Read JSON file into variable + SYSTEM_DICTATOR_DETAILS=$(cat deployments/getting-started/SystemDictator.json) + + # Parse JSON into variables + SYSTEM_DICTATOR_ADDRESS=$(echo "$SYSTEM_DICTATOR_DETAILS" | jq -r '.address') + SYSTEM_DICTATOR_TXHASH=$(echo "$SYSTEM_DICTATOR_DETAILS" | jq -r '.transactionHash') + + if yarn hardhat verify-contract-deployment --contract "${SYSTEM_DICTATOR_ADDRESS}" --transaction-hash "${SYSTEM_DICTATOR_TXHASH}"; then + echo "Deployment verfication successful, exiting" + exit 0 + else + echo "Deployment verfication failed, please clear L1 deployment volume before starting" + exit 1 + fi +fi + # Generate the L2 account addresses yarn hardhat rekey-json --output /l2-accounts/keys.json diff --git a/app/data/config/fixturenet-optimism/run-op-geth.sh b/app/data/config/fixturenet-optimism/run-op-geth.sh index cb180065..68f6c5c5 100755 --- a/app/data/config/fixturenet-optimism/run-op-geth.sh +++ b/app/data/config/fixturenet-optimism/run-op-geth.sh @@ -4,34 +4,50 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi -mkdir datadir - -echo "pwd" > datadir/password - # TODO: Add in container build or use other tool -echo "installing jq" +echo "Installing jq" apk update && apk add jq -# Get SEQUENCER KEY from keys.json +# Get SEQUENCER key from keys.json SEQUENCER_KEY=$(jq -r '.Sequencer.privateKey' /l2-accounts/keys.json | tr -d '"') -echo $SEQUENCER_KEY > datadir/block-signer-key -geth account import --datadir=datadir --password=datadir/password datadir/block-signer-key +# Initialize op-geth if datadir/geth not found +if [ -f /op-node/jwt.txt ] && [ -d datadir/geth ]; then + echo "Found existing datadir, checking block signer key" -while [ ! -f "/op-node/jwt.txt" ] -do - echo "Config files not created. Checking after 5 seconds." - sleep 5 -done + BLOCK_SIGNER_KEY=$(cat datadir/block-signer-key) -echo "Config files created by op-node, proceeding with script..." + if [ "$SEQUENCER_KEY" = "$BLOCK_SIGNER_KEY" ]; then + echo "Sequencer and block signer keys match, skipping initialization" + else + echo "Sequencer and block signer keys don't match, please clear L2 geth data volume before starting" + exit 1 + fi +else + echo "Initializing op-geth" -cp /op-node/genesis.json ./ -geth init --datadir=datadir genesis.json + mkdir -p datadir + echo "pwd" > datadir/password + echo $SEQUENCER_KEY > datadir/block-signer-key + + geth account import --datadir=datadir --password=datadir/password datadir/block-signer-key + + while [ ! -f "/op-node/jwt.txt" ] + do + echo "Config files not created. Checking after 5 seconds." + sleep 5 + done + + echo "Config files created by op-node, proceeding with the initialization..." + + geth init --datadir=datadir /op-node/genesis.json + echo "Node Initialized" +fi SEQUENCER_ADDRESS=$(jq -r '.Sequencer.address' /l2-accounts/keys.json | tr -d '"') echo "SEQUENCER_ADDRESS: ${SEQUENCER_ADDRESS}" -cp /op-node/jwt.txt ./ + +# Run op-geth geth \ --datadir ./datadir \ --http \ @@ -52,7 +68,7 @@ geth \ --authrpc.vhosts="*" \ --authrpc.addr=0.0.0.0 \ --authrpc.port=8551 \ - --authrpc.jwtsecret=./jwt.txt \ + --authrpc.jwtsecret=/op-node/jwt.txt \ --rollup.disabletxpoolgossip=true \ --password=./datadir/password \ --allow-insecure-unlock \ diff --git a/app/data/container-build/cerc-optimism-contracts/hardhat-tasks/verify-contract-deployment.ts b/app/data/container-build/cerc-optimism-contracts/hardhat-tasks/verify-contract-deployment.ts new file mode 100644 index 00000000..5b673ca1 --- /dev/null +++ b/app/data/container-build/cerc-optimism-contracts/hardhat-tasks/verify-contract-deployment.ts @@ -0,0 +1,30 @@ +import { task } from 'hardhat/config' +import '@nomiclabs/hardhat-ethers' + +task( + 'verify-contract-deployment', + 'Verifies the given contract deployment transaction' +) + .addParam('contract', 'Address of the contract deployed') + .addParam('transactionHash', 'Hash of the deployment transaction') + .setAction(async ({ contract, transactionHash }, { ethers }) => { + const provider = new ethers.providers.JsonRpcProvider( + `${process.env.L1_RPC}` + ) + + // Get the deployment tx receipt + const receipt = await provider.getTransactionReceipt(transactionHash) + if ( + receipt && + receipt.contractAddress && + receipt.contractAddress === contract + ) { + console.log( + `Deployment for contract ${contract} in transaction ${transactionHash} verified` + ) + process.exit(0) + } else { + console.log(`Contract ${contract} deployment verification failed`) + process.exit(1) + } + }) diff --git a/app/data/stacks/fixturenet-optimism/L2-ONLY.md b/app/data/stacks/fixturenet-optimism/L2-ONLY.md new file mode 100644 index 00000000..55eab385 --- /dev/null +++ b/app/data/stacks/fixturenet-optimism/L2-ONLY.md @@ -0,0 +1,87 @@ +# fixturenet-optimism + +Instructions to setup and deploy L2 fixturenet using [Optimism](https://stack.optimism.io) + +## Setup + +Prerequisite: An L1 Ethereum RPC endpoint + +Clone required repositories: + +```bash +laconic-so --stack fixturenet-optimism setup-repositories --exclude cerc-io/go-ethereum +``` + +Checkout to the required versions and branches in repos: + +```bash +# Optimism +cd ~/cerc/optimism +git checkout @eth-optimism/sdk@0.0.0-20230329025055 +``` + +Build the container images: + +```bash +laconic-so --stack fixturenet-optimism build-containers --include cerc/foundry,cerc/optimism-contracts,cerc/optimism-op-node,cerc/optimism-l2geth,cerc/optimism-op-batcher +``` + +This should create the required docker images in the local image registry: +* `cerc/foundry` +* `cerc/optimism-contracts` +* `cerc/optimism-l2geth` +* `cerc/optimism-op-batcher` +* `cerc/optimism-op-node` + +## Deploy + +Update the [l1-params.env](../../config/fixturenet-optimism/l1-params.env) file with L1 endpoint (`L1_RPC`, `L1_HOST` and `L1_PORT`) and other params + +* NOTE: + * Stack Orchestrator needs to be run in [`dev`](/docs/CONTRIBUTING.md#install-developer-mode) mode to be able to edit the env file + * If L1 is running on the host machine, use `host.docker.internal` as the hostname to access the host port + +Deploy the stack: + +```bash +laconic-so --stack fixturenet-optimism deploy up --include fixturenet-optimism +``` + +The `fixturenet-optimism-contracts` service may take a while (`~15 mins`) to complete running as it: +1. waits for the 'Merge' to happen on L1 +2. waits for a finalized block to exist on L1 (so that it can be taken as a starting block for roll ups) +3. deploys the L1 contracts + +To list down and monitor the running containers: + +```bash +laconic-so --stack fixturenet-optimism deploy ps + +# With status +docker ps + +# Check logs for a container +docker logs -f +``` + +## Clean up + +Stop all services running in the background: + +```bash +laconic-so --stack fixturenet-optimism deploy down --include fixturenet-optimism +``` + +Clear volumes created by this stack: + +```bash +# List all relevant volumes +docker volume ls -q --filter name=laconic* + +# Remove all the listed volumes +docker volume rm $(docker volume ls -q --filter name=laconic*) +``` + +## Troubleshooting + +See [Troubleshooting](./README.md#troubleshooting) \ No newline at end of file diff --git a/app/data/stacks/fixturenet-optimism/README.md b/app/data/stacks/fixturenet-optimism/README.md index 2f13ec88..65839e70 100644 --- a/app/data/stacks/fixturenet-optimism/README.md +++ b/app/data/stacks/fixturenet-optimism/README.md @@ -2,15 +2,14 @@ Instructions to setup and deploy an end-to-end L1+L2 stack with [fixturenet-eth](../fixturenet-eth/) (L1) and [Optimism](https://stack.optimism.io) (L2) +We support running just the L2 part of stack, given an external L1 endpoint. Follow [L2-ONLY](./L2-ONLY.md) for the same. + ## Setup Clone required repositories: ```bash laconic-so --stack fixturenet-optimism setup-repositories - -# Exclude cerc-io/go-ethereum repository if running L1 separately -laconic-so --stack fixturenet-optimism setup-repositories --exclude cerc-io/go-ethereum ``` Checkout to the required versions and branches in repos: @@ -25,9 +24,6 @@ Build the container images: ```bash laconic-so --stack fixturenet-optimism build-containers - -# Only build containers required for L2 if running L1 separately -laconic-so --stack fixturenet-optimism build-containers --include cerc/foundry,cerc/optimism-contracts,cerc/optimism-op-node,cerc/optimism-l2geth,cerc/optimism-op-batcher ``` This should create the required docker images in the local image registry: @@ -43,19 +39,10 @@ This should create the required docker images in the local image registry: ## Deploy -(Optional) Update the [l1-params.env](../../config/fixturenet-optimism/l1-params.env) file with L1 endpoint (`L1_RPC`, `L1_HOST` and `L1_PORT`) and other params if running L1 separately - -* NOTE: - * Stack Orchestrator needs to be run in [`dev`](/docs/CONTRIBUTING.md#install-developer-mode) mode to be able to edit the env file - * If L1 is running on the host machine, use `host.docker.internal` as the hostname to access the host port - Deploy the stack: ```bash laconic-so --stack fixturenet-optimism deploy up - -# Only start fixturenet-optimism pod (L2) if running L1 separately -laconic-so --stack fixturenet-optimism deploy up --include fixturenet-optimism ``` The `fixturenet-optimism-contracts` service may take a while (`~15 mins`) to complete running as it: @@ -81,9 +68,6 @@ Stop all services running in the background: ```bash laconic-so --stack fixturenet-optimism deploy down - -# If only ran fixturenet-optimism pod (L2) -laconic-so --stack fixturenet-optimism deploy down --include fixturenet-optimism ``` Clear volumes created by this stack: @@ -96,9 +80,39 @@ docker volume ls -q --filter name=laconic* docker volume rm $(docker volume ls -q --filter name=laconic*) ``` +## Troubleshooting + +* If `op-geth` service aborts or is restarted, the following error might occur in the `op-node` service: + + ```bash + WARN [02-16|21:22:02.868] Derivation process temporary error attempts=14 err="stage 0 failed resetting: temp: failed to find the L2 Heads to start from: failed to fetch L2 block by hash 0x0000000000000000000000000000000000000000000000000000000000000000: failed to determine block-hash of hash 0x0000000000000000000000000000000000000000000000000000000000000000, could not get payload: not found" + ``` + +* This means that the data directory that `op-geth` is using is corrupted and needs to be reinitialized; the containers `op-geth`, `op-node` and `op-batcher` need to be started afresh: + * Stop and remove the concerned containers: + + ```bash + # List the containers + docker ps -f "name=op-geth|op-node|op-batcher" + + # Force stop and remove the listed containers + docker rm -f $(docker ps -qf "name=op-geth|op-node|op-batcher") + ``` + + * Remove the concerned volume: + + ```bash + # List the volume + docker volume ls -q --filter name=l2_geth_data + + # Remove the listed volume + docker volume rm $(docker volume ls -q --filter name=l2_geth_data) + ``` + + * Reuse the deployment command used in [Deploy](#deploy) to restart the stopped containers + ## Known Issues -* Currently not supported: - * Stopping and restarting the stack from where it left off; currently starts fresh on a restart -* Resource requirements (memory + time) for building `cerc/foundry` image are on the higher side +* `fixturenet-eth` currently starts fresh on a restart +* Resource requirements (memory + time) for building the `cerc/foundry` image are on the higher side * `cerc/optimism-contracts` image is currently based on `cerc/foundry` (Optimism requires foundry installation) From 63fbaa7ae3dcc246be7b78361c28740f6f0d421d Mon Sep 17 00:00:00 2001 From: Nabarun Gogoi Date: Wed, 5 Apr 2023 17:26:38 +0530 Subject: [PATCH 0359/1010] Add ability to run mobymask-v2 stack with external optimism endpoint (#279) * Set optimism geth endpoint from env file * Set L1 account private keys from env * Only deploy contract and generate invite in mobymask container * Add readme for running mobymask v2 stack independently * Modify mobymask container to stop running server and update readmes * Check deployer account balance before deploying contract * Fix for checking account balance before deploying * Update readme description * Update MobyMask repo tag in readme Former-commit-id: 94e38ceabaa89a3ec54e25f4a03cf253d5fae5f9 --- .../docker-compose-fixturenet-optimism.yml | 4 +- .../docker-compose-mobymask-laconicd.yml | 25 ------ .../docker-compose-watcher-mobymask-v2.yml | 39 ++++----- .../config/fixturenet-optimism/l1-params.env | 7 +- .../deploy-and-generate-invite.sh | 38 +++++++-- .../watcher-mobymask-v2/mobymask-app-start.sh | 3 + .../watcher-mobymask-v2/optimism-params.env | 12 +++ .../watcher-mobymask-v2/secrets-template.json | 2 +- .../watcher-mobymask-v2/server-start.sh | 18 +++- .../watcher-config-template.toml | 2 +- .../container-build/cerc-mobymask/Dockerfile | 2 +- app/data/pod-list.txt | 3 +- app/data/stacks/fixturenet-optimism/README.md | 6 +- .../{L2-ONLY.md => l2-only.md} | 6 +- app/data/stacks/mobymask-v2/README.md | 23 ++--- app/data/stacks/mobymask-v2/mobymask-only.md | 85 +++++++++++++++++++ 16 files changed, 194 insertions(+), 81 deletions(-) delete mode 100644 app/data/compose/docker-compose-mobymask-laconicd.yml mode change 100644 => 100755 app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh create mode 100644 app/data/config/watcher-mobymask-v2/optimism-params.env rename app/data/stacks/fixturenet-optimism/{L2-ONLY.md => l2-only.md} (84%) create mode 100644 app/data/stacks/mobymask-v2/mobymask-only.md diff --git a/app/data/compose/docker-compose-fixturenet-optimism.yml b/app/data/compose/docker-compose-fixturenet-optimism.yml index d2e96d3f..142a2251 100644 --- a/app/data/compose/docker-compose-fixturenet-optimism.yml +++ b/app/data/compose/docker-compose-fixturenet-optimism.yml @@ -55,7 +55,7 @@ services: entrypoint: "sh" command: "/run-op-geth.sh" ports: - - "8545" + - "0.0.0.0:8545:8545" healthcheck: test: ["CMD", "nc", "-vz", "localhost:8545"] interval: 30s @@ -77,7 +77,7 @@ services: - l2_accounts:/l2-accounts:ro command: ["sh", "/app/run-op-node.sh"] ports: - - "8547" + - "0.0.0.0:8547:8547" healthcheck: test: ["CMD", "nc", "-vz", "localhost:8547"] interval: 30s diff --git a/app/data/compose/docker-compose-mobymask-laconicd.yml b/app/data/compose/docker-compose-mobymask-laconicd.yml deleted file mode 100644 index 4847aeb3..00000000 --- a/app/data/compose/docker-compose-mobymask-laconicd.yml +++ /dev/null @@ -1,25 +0,0 @@ -version: "3.2" - -services: - laconicd: - restart: unless-stopped - image: cerc/laconicd:local - command: ["sh", "/docker-entrypoint-scripts.d/create-fixturenet.sh"] - volumes: - - ../config/fixturenet-laconicd/create-fixturenet.sh:/docker-entrypoint-scripts.d/create-fixturenet.sh - ports: - - "9473" - - "8545" - - "8546" - - "1317" - healthcheck: - test: ["CMD", "nc", "-v", "localhost", "8545"] - interval: 20s - timeout: 5s - retries: 15 - start_period: 10s - -networks: - # https://docs.docker.com/compose/networking/#configure-the-default-network - default: - name: mobymask-v2-network diff --git a/app/data/compose/docker-compose-watcher-mobymask-v2.yml b/app/data/compose/docker-compose-watcher-mobymask-v2.yml index 8478a4d9..667191a1 100644 --- a/app/data/compose/docker-compose-watcher-mobymask-v2.yml +++ b/app/data/compose/docker-compose-watcher-mobymask-v2.yml @@ -22,45 +22,40 @@ services: start_period: 10s mobymask: - restart: unless-stopped image: cerc/mobymask:local working_dir: /app/packages/server - depends_on: - op-node: - condition: service_healthy - op-geth: - condition: service_healthy - # TODO: Configure env file for ETH RPC URL & private key + env_file: + - ../config/watcher-mobymask-v2/optimism-params.env environment: - ENV=PROD - command: ["sh", "./deploy-and-generate-invite.sh"] + command: + - sh + - -c + - | + ./wait-for-it.sh -h $${L2_GETH_HOST} -p $${L2_GETH_PORT} -s -t 0 && \ + ./wait-for-it.sh -h $${L2_NODE_HOST} -p $${L2_NODE_PORT} -s -t 0 && \ + ./deploy-and-generate-invite.sh volumes: - # TODO: add a script to set RPC endpoint from env - # add manually if running seperately + - ../config/wait-for-it.sh:/app/packages/server/wait-for-it.sh - ../config/watcher-mobymask-v2/secrets-template.json:/app/packages/server/secrets-template.json - ../config/watcher-mobymask-v2/deploy-and-generate-invite.sh:/app/packages/server/deploy-and-generate-invite.sh - moby_data_server:/app/packages/server - fixturenet_geth_accounts:/geth-accounts:ro - healthcheck: - test: ["CMD", "nc", "-v", "localhost", "3330"] - interval: 20s - timeout: 5s - retries: 15 - start_period: 10s + extra_hosts: + - "host.docker.internal:host-gateway" mobymask-watcher-server: - # TODO: pass optimism RPC endpoint restart: unless-stopped depends_on: mobymask-watcher-db: condition: service_healthy mobymask: - condition: service_healthy + condition: service_completed_successfully image: cerc/watcher-mobymask-v2:local + env_file: + - ../config/watcher-mobymask-v2/optimism-params.env command: ["sh", "server-start.sh"] volumes: - # TODO: add a script to set RPC endpoint from env - # add manually if running seperately - ../config/watcher-mobymask-v2/watcher-config-template.toml:/app/packages/mobymask-v2-watcher/environments/watcher-config-template.toml - ../config/watcher-mobymask-v2/peer.env:/app/packages/peer/.env - ../config/watcher-mobymask-v2/relay-id.json:/app/packages/mobymask-v2-watcher/relay-id.json @@ -78,6 +73,8 @@ services: timeout: 5s retries: 15 start_period: 5s + extra_hosts: + - "host.docker.internal:host-gateway" # TODO: Move to a separate pod mobymask-app: @@ -85,7 +82,7 @@ services: mobymask-watcher-server: condition: service_healthy mobymask: - condition: service_healthy + condition: service_completed_successfully image: cerc/mobymask-ui:local command: ["sh", "mobymask-app-start.sh"] volumes: diff --git a/app/data/config/fixturenet-optimism/l1-params.env b/app/data/config/fixturenet-optimism/l1-params.env index 31876523..93c58805 100644 --- a/app/data/config/fixturenet-optimism/l1-params.env +++ b/app/data/config/fixturenet-optimism/l1-params.env @@ -1,8 +1,13 @@ # Change if pointing to an external L1 endpoint -L1_RPC="http://fixturenet-eth-geth-1:8545" + +# L1 endpoint L1_CHAIN_ID=1212 +L1_RPC="http://fixturenet-eth-geth-1:8545" L1_HOST="fixturenet-eth-geth-1" L1_PORT=8545 + +# Credentials for accounts on L1 to send balance to Optimism Proxy contract from +# (enables them to do transactions on L2) L1_ADDRESS= L1_PRIV_KEY= L1_ADDRESS_2= diff --git a/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh b/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh old mode 100644 new mode 100755 index 2a8e0eb5..b53b6b56 --- a/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh +++ b/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh @@ -1,11 +1,39 @@ #!/bin/sh set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi -# Read the private key of L1 account to deploy contract -# TODO: Take from env if /geth-accounts volume doesn't exist to allow using separately running L1 -L1_PRIV_KEY=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 3) + +if [ -f /geth-accounts/accounts.csv ]; then + echo "Using L1 private key from the mounted volume" + # Read the private key of L1 account to deploy contract + PRIVATE_KEY_DEPLOYER=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 3) +else + echo "Using PRIVATE_KEY_DEPLOYER from env" +fi # Set the private key -jq --arg privateKey "$L1_PRIV_KEY" '.privateKey = ($privateKey)' secrets-template.json > secrets.json +jq --arg privateKey "$PRIVATE_KEY_DEPLOYER" '.privateKey = $privateKey' secrets-template.json > secrets.json -npm start +export L2_GETH_URL="http://${L2_GETH_HOST}:${L2_GETH_PORT}" +jq --arg rpcUrl "$L2_GETH_URL" '.rpcUrl = $rpcUrl' secrets.json > secrets_updated.json && mv secrets_updated.json secrets.json + +cd ../hardhat +export RPC_URL="${L2_GETH_URL}" + +while true; do + ACCOUNT_BALANCE=$(yarn hardhat --network optimism balance $PRIVATE_KEY_DEPLOYER | grep ETH) + + if [ "$ACCOUNT_BALANCE" != "0.0 ETH" ]; then + echo "Account balance updated: $ACCOUNT_BALANCE" + break # exit the loop + fi + + echo "Account balance not updated: $ACCOUNT_BALANCE" + echo "Checking after 2 seconds" + sleep 2 +done + +cd ../server +npm run deployAndGenerateInvite diff --git a/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh b/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh index fa3870cf..efc4ed96 100755 --- a/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh +++ b/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh @@ -1,5 +1,8 @@ #!/bin/sh set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi # Merging config files to get deployed contract address jq -s '.[0] * .[1]' /app/src/mobymask-app-config.json /server/config.json > /app/src/config.json diff --git a/app/data/config/watcher-mobymask-v2/optimism-params.env b/app/data/config/watcher-mobymask-v2/optimism-params.env new file mode 100644 index 00000000..bafb37a8 --- /dev/null +++ b/app/data/config/watcher-mobymask-v2/optimism-params.env @@ -0,0 +1,12 @@ +# Change if pointing to an external optimism geth endpoint + +# L2 endpoints +# TODO: Add another env for complete URL to handle https +L2_GETH_HOST="op-geth" +L2_GETH_PORT=8545 +L2_NODE_HOST="op-node" +L2_NODE_PORT=8547 + +# Credentials for accounts to perform txs on L2 +PRIVATE_KEY_DEPLOYER= +PRIVATE_KEY_PEER= diff --git a/app/data/config/watcher-mobymask-v2/secrets-template.json b/app/data/config/watcher-mobymask-v2/secrets-template.json index 220efc8e..1397bbf1 100644 --- a/app/data/config/watcher-mobymask-v2/secrets-template.json +++ b/app/data/config/watcher-mobymask-v2/secrets-template.json @@ -1,5 +1,5 @@ { - "rpcUrl": "http://op-geth:8545", + "rpcUrl": "", "privateKey": "", "baseURI": "http://127.0.0.1:3002/#" } diff --git a/app/data/config/watcher-mobymask-v2/server-start.sh b/app/data/config/watcher-mobymask-v2/server-start.sh index 6b4cd345..5fe9ab84 100755 --- a/app/data/config/watcher-mobymask-v2/server-start.sh +++ b/app/data/config/watcher-mobymask-v2/server-start.sh @@ -1,11 +1,25 @@ #!/bin/sh +set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi # Assign deployed contract address from server config CONTRACT_ADDRESS=$(jq -r '.address' /server/config.json | tr -d '"') -L1_PRIV_KEY_2=$(awk -F, 'NR==2{print $NF}' /geth-accounts/accounts.csv) -sed "s/REPLACE_WITH_PRIVATE_KEY/${L1_PRIV_KEY_2}/" environments/watcher-config-template.toml > environments/local.toml +if [ -f /geth-accounts/accounts.csv ]; then + echo "Using L1 private key from the mounted volume" + # Read the private key of L1 account for sending txs from peer + PRIVATE_KEY_PEER=$(awk -F, 'NR==2{print $NF}' /geth-accounts/accounts.csv) +else + echo "Using PRIVATE_KEY_PEER from env" +fi + +sed "s/REPLACE_WITH_PRIVATE_KEY/${PRIVATE_KEY_PEER}/" environments/watcher-config-template.toml > environments/local.toml sed -i "s/REPLACE_WITH_CONTRACT_ADDRESS/${CONTRACT_ADDRESS}/" environments/local.toml +export L2_GETH_URL="http://${L2_GETH_HOST}:${L2_GETH_PORT}" +sed -i 's|REPLACE_WITH_L2_GETH_URL|'"${L2_GETH_URL}"'|' environments/local.toml + echo 'yarn server' yarn server diff --git a/app/data/config/watcher-mobymask-v2/watcher-config-template.toml b/app/data/config/watcher-mobymask-v2/watcher-config-template.toml index ff937678..05554e3a 100644 --- a/app/data/config/watcher-mobymask-v2/watcher-config-template.toml +++ b/app/data/config/watcher-mobymask-v2/watcher-config-template.toml @@ -59,7 +59,7 @@ [upstream] [upstream.ethServer] gqlApiEndpoint = "http://ipld-eth-server:8083/graphql" - rpcProviderEndpoint = "http://op-geth:8545" + rpcProviderEndpoint = "REPLACE_WITH_L2_GETH_URL" blockDelayInMilliSecs = 60000 [upstream.cache] diff --git a/app/data/container-build/cerc-mobymask/Dockerfile b/app/data/container-build/cerc-mobymask/Dockerfile index c94a1cea..caa3e6b5 100644 --- a/app/data/container-build/cerc-mobymask/Dockerfile +++ b/app/data/container-build/cerc-mobymask/Dockerfile @@ -1,6 +1,6 @@ FROM node:16.17.1-alpine3.16 -RUN apk --update --no-cache add python3 alpine-sdk jq +RUN apk --update --no-cache add python3 alpine-sdk jq bash WORKDIR /app diff --git a/app/data/pod-list.txt b/app/data/pod-list.txt index 79c4171a..f24c9ed0 100644 --- a/app/data/pod-list.txt +++ b/app/data/pod-list.txt @@ -15,7 +15,8 @@ watcher-erc20 watcher-erc721 watcher-uniswap-v3 watcher-mobymask-v2 -mobymask-laconicd +mobymask-app +peer-test-app test eth-probe keycloak diff --git a/app/data/stacks/fixturenet-optimism/README.md b/app/data/stacks/fixturenet-optimism/README.md index 65839e70..61ca97b3 100644 --- a/app/data/stacks/fixturenet-optimism/README.md +++ b/app/data/stacks/fixturenet-optimism/README.md @@ -2,7 +2,7 @@ Instructions to setup and deploy an end-to-end L1+L2 stack with [fixturenet-eth](../fixturenet-eth/) (L1) and [Optimism](https://stack.optimism.io) (L2) -We support running just the L2 part of stack, given an external L1 endpoint. Follow [L2-ONLY](./L2-ONLY.md) for the same. +We support running just the L2 part of stack, given an external L1 endpoint. Follow [l2-only](./l2-only.md) for the same. ## Setup @@ -74,10 +74,10 @@ Clear volumes created by this stack: ```bash # List all relevant volumes -docker volume ls -q --filter name=laconic* +docker volume ls -q --filter "name=.*fixturenet_geth_accounts|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data" # Remove all the listed volumes -docker volume rm $(docker volume ls -q --filter name=laconic*) +docker volume rm $(docker volume ls -q --filter "name=.*fixturenet_geth_accounts|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data") ``` ## Troubleshooting diff --git a/app/data/stacks/fixturenet-optimism/L2-ONLY.md b/app/data/stacks/fixturenet-optimism/l2-only.md similarity index 84% rename from app/data/stacks/fixturenet-optimism/L2-ONLY.md rename to app/data/stacks/fixturenet-optimism/l2-only.md index 55eab385..a1c33717 100644 --- a/app/data/stacks/fixturenet-optimism/L2-ONLY.md +++ b/app/data/stacks/fixturenet-optimism/l2-only.md @@ -55,7 +55,7 @@ The `fixturenet-optimism-contracts` service may take a while (`~15 mins`) to com To list down and monitor the running containers: ```bash -laconic-so --stack fixturenet-optimism deploy ps +laconic-so --stack fixturenet-optimism deploy --include fixturenet-optimism ps # With status docker ps @@ -76,10 +76,10 @@ Clear volumes created by this stack: ```bash # List all relevant volumes -docker volume ls -q --filter name=laconic* +docker volume ls -q --filter "name=.*fixturenet_geth_accounts|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data" # Remove all the listed volumes -docker volume rm $(docker volume ls -q --filter name=laconic*) +docker volume rm $(docker volume ls -q --filter "name=.*fixturenet_geth_accounts|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data") ``` ## Troubleshooting diff --git a/app/data/stacks/mobymask-v2/README.md b/app/data/stacks/mobymask-v2/README.md index 68b9b61c..513bd431 100644 --- a/app/data/stacks/mobymask-v2/README.md +++ b/app/data/stacks/mobymask-v2/README.md @@ -1,6 +1,9 @@ # MobyMask v2 watcher -Instructions to deploy MobyMask v2 watcher stack using [laconic-stack-orchestrator](/README.md#install) +Instructions to setup and deploy an end-to-end MobyMask v2 stack ([L1](../fixturenet-eth/) + [L2](../fixturenet-optimism/) chains + watcher) using [laconic-stack-orchestrator](/README.md#install) + +We support running just the watcher part of stack, given an external L2 Optimism endpoint. +Follow [mobymask-only](./mobymask-only.md) for the same. ## Setup @@ -30,7 +33,7 @@ git checkout laconic # MobyMask cd ~/cerc/MobyMask -git checkout v0.1.1 +git checkout v0.1.2 # Optimism cd ~/cerc/optimism @@ -68,19 +71,9 @@ Deploy the stack: Find the watcher container's id and export it for later use: ```bash -laconic-so --stack mobymask-v2 deploy-system ps | grep "mobymask-watcher-server" - -export CONTAINER_ID= +export CONTAINER_ID=$(docker ps -q --filter "name=mobymask-watcher-server") ``` -Example output: - -``` -id: 5d3aae4b22039fcd1c9b18feeb91318ede1100581e75bb5ac54f9e436066b02c, name: laconic-bfb01caf98b1b8f7c8db4d33f11b905a-mobymask-watcher-server-1, ports: 0.0.0.0:3001->3001/tcp, 0.0.0.0:9001->9001/tcp, 0.0.0.0:9090->9090/tcp -``` - -In above output the container ID is `5d3aae4b22039fcd1c9b18feeb91318ede1100581e75bb5ac54f9e436066b02c` - Run the peer tests: ```bash @@ -128,11 +121,11 @@ Clear volumes: * List all relevant volumes: ```bash - docker volume ls -q --filter name=laconic* + docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*moby_data_server|.*fixturenet_geth_accounts|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data" ``` * Remove all the listed volumes: ```bash - docker volume rm $(docker volume ls -q --filter name=laconic*) + docker volume rm $(docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*moby_data_server|.*fixturenet_geth_accounts|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data") ``` diff --git a/app/data/stacks/mobymask-v2/mobymask-only.md b/app/data/stacks/mobymask-v2/mobymask-only.md new file mode 100644 index 00000000..843e7533 --- /dev/null +++ b/app/data/stacks/mobymask-v2/mobymask-only.md @@ -0,0 +1,85 @@ +# MobyMask v2 watcher + +Instructions to setup and deploy MobyMask v2 watcher independently + +## Setup + +Prerequisite: An L2 Optimism RPC endpoint + +Clone required repositories: + +```bash +laconic-so --stack mobymask-v2 setup-repositories --include cerc-io/MobyMask,cerc-io/watcher-ts,cerc-io/react-peer,cerc-io/mobymask-ui +``` + +Checkout to the required versions and branches in repos: + +```bash +```bash +# watcher-ts +cd ~/cerc/watcher-ts +git checkout v0.2.34 + +# react-peer +cd ~/cerc/react-peer +git checkout v0.2.31 + +# mobymask-ui +cd ~/cerc/mobymask-ui +git checkout laconic + +# MobyMask +cd ~/cerc/MobyMask +git checkout v0.1.2 +``` + +Build the container images: + +```bash +laconic-so --stack mobymask-v2 build-containers --include cerc/watcher-mobymask-v2,cerc/react-peer,cerc/mobymask-ui,cerc/mobymask +``` + +This should create the required docker images in the local image registry + +## Deploy + +Update the [optimism-params.env](../../config/watcher-mobymask-v2/optimism-params.env) file with Optimism endpoints and other params if running Optimism separately + +* NOTE: + * Stack Orchestrator needs to be run in [`dev`](/docs/CONTRIBUTING.md#install-developer-mode) mode to be able to edit the env file + * If Optimism is running on the host machine, use `host.docker.internal` as the hostname to access the host port + +Deploy the stack: + +```bash +laconic-so --stack mobymask-v2 deploy --include watcher-mobymask-v2 up +``` + +To list down and monitor the running containers: + +```bash +laconic-so --stack mobymask-v2 deploy --include watcher-mobymask-v2 ps +# With status +docker ps +# Check logs for a container +docker logs -f +``` + +See [Tests](./README.md#tests) and [Demo](./README.md#demo) to interact with stack + +## Clean up + +Stop all services running in the background: + +```bash +laconic-so --stack mobymask-v2 deploy down --include watcher-mobymask-v2 +``` + +Clear volumes created by this stack: + +```bash +# List all relevant volumes +docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*moby_data_server|.*fixturenet_geth_accounts" +# Remove all the listed volumes +docker volume rm $(docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*moby_data_server|.*fixturenet_geth_accounts") +``` From 72737bfa29c1659e5653cdb89e8932017d016d7f Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Wed, 5 Apr 2023 17:52:12 +0530 Subject: [PATCH 0360/1010] Handle restarts in mobymask-v2 stack (#286) * Verify existing contract deployment * Update mobymask-v2 demo instructions Former-commit-id: 59fe9aae59e2622761fe28beba9e5cc9e6d2614f --- .../docker-compose-watcher-mobymask-v2.yml | 12 ++++----- .../deploy-and-generate-invite.sh | 25 ++++++++++++++++--- .../{server-start.sh => start-server.sh} | 0 app/data/stacks/mobymask-v2/README.md | 18 ++++++------- app/data/stacks/mobymask-v2/demo.md | 20 +++++---------- app/data/stacks/mobymask-v2/mobymask-only.md | 9 ++++--- 6 files changed, 47 insertions(+), 37 deletions(-) rename app/data/config/watcher-mobymask-v2/{server-start.sh => start-server.sh} (100%) diff --git a/app/data/compose/docker-compose-watcher-mobymask-v2.yml b/app/data/compose/docker-compose-watcher-mobymask-v2.yml index 667191a1..fd68212a 100644 --- a/app/data/compose/docker-compose-watcher-mobymask-v2.yml +++ b/app/data/compose/docker-compose-watcher-mobymask-v2.yml @@ -39,7 +39,7 @@ services: - ../config/wait-for-it.sh:/app/packages/server/wait-for-it.sh - ../config/watcher-mobymask-v2/secrets-template.json:/app/packages/server/secrets-template.json - ../config/watcher-mobymask-v2/deploy-and-generate-invite.sh:/app/packages/server/deploy-and-generate-invite.sh - - moby_data_server:/app/packages/server + - mobymask_deployment:/app/packages/server - fixturenet_geth_accounts:/geth-accounts:ro extra_hosts: - "host.docker.internal:host-gateway" @@ -54,14 +54,14 @@ services: image: cerc/watcher-mobymask-v2:local env_file: - ../config/watcher-mobymask-v2/optimism-params.env - command: ["sh", "server-start.sh"] + command: ["sh", "start-server.sh"] volumes: - ../config/watcher-mobymask-v2/watcher-config-template.toml:/app/packages/mobymask-v2-watcher/environments/watcher-config-template.toml - ../config/watcher-mobymask-v2/peer.env:/app/packages/peer/.env - ../config/watcher-mobymask-v2/relay-id.json:/app/packages/mobymask-v2-watcher/relay-id.json - ../config/watcher-mobymask-v2/peer-id.json:/app/packages/mobymask-v2-watcher/peer-id.json - - ../config/watcher-mobymask-v2/server-start.sh:/app/packages/mobymask-v2-watcher/server-start.sh - - moby_data_server:/server + - ../config/watcher-mobymask-v2/start-server.sh:/app/packages/mobymask-v2-watcher/start-server.sh + - mobymask_deployment:/server - fixturenet_geth_accounts:/geth-accounts:ro ports: - "0.0.0.0:3001:3001" @@ -89,7 +89,7 @@ services: - ../config/watcher-mobymask-v2/mobymask-app.env:/app/.env - ../config/watcher-mobymask-v2/mobymask-app-config.json:/app/src/mobymask-app-config.json - ../config/watcher-mobymask-v2/mobymask-app-start.sh:/app/mobymask-app-start.sh - - moby_data_server:/server + - mobymask_deployment:/server ports: - "0.0.0.0:3002:3000" healthcheck: @@ -120,5 +120,5 @@ services: volumes: mobymask_watcher_db_data: - moby_data_server: + mobymask_deployment: fixturenet_geth_accounts: diff --git a/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh b/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh index b53b6b56..2a3000ee 100755 --- a/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh +++ b/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh @@ -4,7 +4,6 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi - if [ -f /geth-accounts/accounts.csv ]; then echo "Using L1 private key from the mounted volume" # Read the private key of L1 account to deploy contract @@ -16,14 +15,34 @@ fi # Set the private key jq --arg privateKey "$PRIVATE_KEY_DEPLOYER" '.privateKey = $privateKey' secrets-template.json > secrets.json +# Set the RPC URL export L2_GETH_URL="http://${L2_GETH_HOST}:${L2_GETH_PORT}" jq --arg rpcUrl "$L2_GETH_URL" '.rpcUrl = $rpcUrl' secrets.json > secrets_updated.json && mv secrets_updated.json secrets.json -cd ../hardhat export RPC_URL="${L2_GETH_URL}" +# Check and exit if a deployment already exists (on restarts) +if [ -f ./config.json ]; then + echo "config.json already exists, checking the contract deployment" + + # Read JSON file + DEPLOYMENT_DETAILS=$(cat config.json) + CONTRACT_ADDRESS=$(echo "$DEPLOYMENT_DETAILS" | jq -r '.address') + + cd ../hardhat + if yarn verifyDeployment --network optimism --contract "${CONTRACT_ADDRESS}"; then + echo "Deployment verfication successful" + cd ../server + else + echo "Deployment verfication failed, please clear MobyMask deployment volume before starting" + exit 1 + fi +fi + +# Wait until balance for deployer account is reflected +cd ../hardhat while true; do - ACCOUNT_BALANCE=$(yarn hardhat --network optimism balance $PRIVATE_KEY_DEPLOYER | grep ETH) + ACCOUNT_BALANCE=$(yarn balance --network optimism $PRIVATE_KEY_DEPLOYER | grep ETH) if [ "$ACCOUNT_BALANCE" != "0.0 ETH" ]; then echo "Account balance updated: $ACCOUNT_BALANCE" diff --git a/app/data/config/watcher-mobymask-v2/server-start.sh b/app/data/config/watcher-mobymask-v2/start-server.sh similarity index 100% rename from app/data/config/watcher-mobymask-v2/server-start.sh rename to app/data/config/watcher-mobymask-v2/start-server.sh diff --git a/app/data/stacks/mobymask-v2/README.md b/app/data/stacks/mobymask-v2/README.md index 513bd431..15652efe 100644 --- a/app/data/stacks/mobymask-v2/README.md +++ b/app/data/stacks/mobymask-v2/README.md @@ -116,16 +116,12 @@ Stop all the services running in background run: laconic-so --stack mobymask-v2 deploy-system down ``` -Clear volumes: +Clear volumes created by this stack: -* List all relevant volumes: +```bash +# List all relevant volumes +docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*mobymask_deployment|.*fixturenet_geth_accounts|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data" - ```bash - docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*moby_data_server|.*fixturenet_geth_accounts|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data" - ``` - -* Remove all the listed volumes: - - ```bash - docker volume rm $(docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*moby_data_server|.*fixturenet_geth_accounts|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data") - ``` +# Remove all the listed volumes +docker volume rm $(docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*mobymask_deployment|.*fixturenet_geth_accounts|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data") +``` diff --git a/app/data/stacks/mobymask-v2/demo.md b/app/data/stacks/mobymask-v2/demo.md index 8a5049c4..329b554d 100644 --- a/app/data/stacks/mobymask-v2/demo.md +++ b/app/data/stacks/mobymask-v2/demo.md @@ -3,7 +3,7 @@ * Get the root invite link URL for mobymask-app: ```bash - laconic-so --stack mobymask-v2 deploy-system logs mobymask + docker logs -f $(docker ps -aq --filter name="mobymask-1") ``` The invite link is seen at the end of the logs. Example log: @@ -29,19 +29,11 @@ * In the `MESSAGES` tab of other browsers, a message can be seen with the signed invocations. -* In a terminal check logs from the watcher peer container. +* In a terminal, check logs from the watcher peer container: - * Get the container id: - - ```bash - laconic-so --stack mobymask-v2 deploy-system ps | grep mobymask-watcher-server - ``` - - * Check logs: - - ```bash - docker logs -f - ``` + ```bash + docker logs -f $(docker ps -aq --filter name="mobymask-watcher-server") + ``` * It should have received the message, sent transaction to L2 chain and received a transaction receipt for an `invoke` message with block details. @@ -74,7 +66,7 @@ * Get the deployed contract address: ```bash - laconic-so --stack mobymask-v2 deploy-system exec mobymask-app "cat src/config.json" + docker exec -it $(docker ps -aq --filter name="mobymask-app") cat src/config.json ``` The value of `address` field is the deployed contract address diff --git a/app/data/stacks/mobymask-v2/mobymask-only.md b/app/data/stacks/mobymask-v2/mobymask-only.md index 843e7533..69c2007b 100644 --- a/app/data/stacks/mobymask-v2/mobymask-only.md +++ b/app/data/stacks/mobymask-v2/mobymask-only.md @@ -59,8 +59,10 @@ To list down and monitor the running containers: ```bash laconic-so --stack mobymask-v2 deploy --include watcher-mobymask-v2 ps + # With status docker ps + # Check logs for a container docker logs -f ``` @@ -72,14 +74,15 @@ See [Tests](./README.md#tests) and [Demo](./README.md#demo) to interact with sta Stop all services running in the background: ```bash -laconic-so --stack mobymask-v2 deploy down --include watcher-mobymask-v2 +laconic-so --stack mobymask-v2 deploy --include watcher-mobymask-v2 down ``` Clear volumes created by this stack: ```bash # List all relevant volumes -docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*moby_data_server|.*fixturenet_geth_accounts" +docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*mobymask_deployment|.*fixturenet_geth_accounts" + # Remove all the listed volumes -docker volume rm $(docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*moby_data_server|.*fixturenet_geth_accounts") +docker volume rm $(docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*mobymask_deployment|.*fixturenet_geth_accounts") ``` From 86f13e9c6bcf8d7f22366b765bae774c809fa537 Mon Sep 17 00:00:00 2001 From: Nabarun Gogoi Date: Thu, 6 Apr 2023 15:17:00 +0530 Subject: [PATCH 0361/1010] Separate out watcher and web-apps in mobymask-v2 stack (#287) * Separate out watcher and web-apps in mobymask stack * Take L2 RPC endpoint from the env file * Changes to run watcher and mobymask web-app separately * Support running watcher without contract deployment and L2 txs * Remove duplicate mobymask params env * Add code comments * Add instructions for running web-apps separately * Self review fixes * Fix timeout for mobymask-app on watcher server --------- Co-authored-by: prathamesh0 Former-commit-id: 6f781ae303915d7612fbc670b4f5f9b521b48121 --- .../compose/docker-compose-mobymask-app.yml | 31 +++++++ .../compose/docker-compose-peer-test-app.yml | 21 +++++ .../docker-compose-watcher-mobymask-v2.yml | 50 ++-------- .../deploy-and-generate-invite.sh | 18 +++- .../mobymask-app-config.json | 1 + .../watcher-mobymask-v2/mobymask-app-start.sh | 19 +++- .../watcher-mobymask-v2/mobymask-app.env | 1 - .../watcher-mobymask-v2/mobymask-params.env | 14 +++ .../watcher-mobymask-v2/optimism-params.env | 3 +- .../watcher-mobymask-v2/start-server.sh | 28 ++++-- .../watcher-mobymask-v2/test-app-start.sh | 14 +++ .../watcher-config-template.toml | 6 +- .../cerc-mobymask-ui/Dockerfile | 2 +- .../cerc-react-peer/Dockerfile | 2 +- app/data/stacks/mobymask-v2/mobymask-only.md | 27 +++--- app/data/stacks/mobymask-v2/stack.yml | 2 + app/data/stacks/mobymask-v2/web-apps.md | 91 +++++++++++++++++++ 17 files changed, 250 insertions(+), 80 deletions(-) create mode 100644 app/data/compose/docker-compose-mobymask-app.yml create mode 100644 app/data/compose/docker-compose-peer-test-app.yml delete mode 100644 app/data/config/watcher-mobymask-v2/mobymask-app.env create mode 100644 app/data/config/watcher-mobymask-v2/mobymask-params.env create mode 100755 app/data/config/watcher-mobymask-v2/test-app-start.sh create mode 100644 app/data/stacks/mobymask-v2/web-apps.md diff --git a/app/data/compose/docker-compose-mobymask-app.yml b/app/data/compose/docker-compose-mobymask-app.yml new file mode 100644 index 00000000..db95eeac --- /dev/null +++ b/app/data/compose/docker-compose-mobymask-app.yml @@ -0,0 +1,31 @@ +version: '3.2' + +services: + # Builds and serves the MobyMask react-app + mobymask-app: + image: cerc/mobymask-ui:local + env_file: + - ../config/watcher-mobymask-v2/mobymask-params.env + # Waits for watcher server to be up before app build + # Required when running with watcher stack to get deployed contract address + command: + - sh + - -c + - ./wait-for-it.sh -h $${WATCHER_HOST} -p $${WATCHER_PORT} -s -t 0 -- ./mobymask-app-start.sh + volumes: + - ../config/wait-for-it.sh:/app/wait-for-it.sh + - ../config/watcher-mobymask-v2/mobymask-app-config.json:/app/src/mobymask-app-config.json + - ../config/watcher-mobymask-v2/mobymask-app-start.sh:/app/mobymask-app-start.sh + - mobymask_deployment:/server + ports: + - "0.0.0.0:3002:3000" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "3000"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 10s + shm_size: '1GB' + +volumes: + mobymask_deployment: diff --git a/app/data/compose/docker-compose-peer-test-app.yml b/app/data/compose/docker-compose-peer-test-app.yml new file mode 100644 index 00000000..3ddbd308 --- /dev/null +++ b/app/data/compose/docker-compose-peer-test-app.yml @@ -0,0 +1,21 @@ +version: '3.2' + +services: + peer-test-app: + # Builds and serves the peer-test react-app + image: cerc/react-peer:local + working_dir: /app/packages/test-app + env_file: + - ../config/watcher-mobymask-v2/mobymask-params.env + command: ["sh", "./test-app-start.sh"] + volumes: + - ../config/watcher-mobymask-v2/test-app-config.json:/app/packages/test-app/src/test-app-config.json + - ../config/watcher-mobymask-v2/test-app-start.sh:/app/packages/test-app/test-app-start.sh + ports: + - "0.0.0.0:3003:3000" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "3000"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 10s diff --git a/app/data/compose/docker-compose-watcher-mobymask-v2.yml b/app/data/compose/docker-compose-watcher-mobymask-v2.yml index fd68212a..2e014471 100644 --- a/app/data/compose/docker-compose-watcher-mobymask-v2.yml +++ b/app/data/compose/docker-compose-watcher-mobymask-v2.yml @@ -1,6 +1,7 @@ version: '3.2' services: + # Starts the PostgreSQL database for watcher mobymask-watcher-db: restart: unless-stopped image: postgres:14-alpine @@ -21,13 +22,17 @@ services: retries: 15 start_period: 10s + # Deploys MobyMask contract and generates an invite link + # Deployment is skipped if DEPLOYED_CONTRACT env is already set mobymask: image: cerc/mobymask:local working_dir: /app/packages/server env_file: - ../config/watcher-mobymask-v2/optimism-params.env + - ../config/watcher-mobymask-v2/mobymask-params.env environment: - ENV=PROD + # Waits for L2 Optimism Geth and Node servers to be up before deploying contract command: - sh - -c @@ -44,6 +49,7 @@ services: extra_hosts: - "host.docker.internal:host-gateway" + # Starts the mobymask-v2-watcher server mobymask-watcher-server: restart: unless-stopped depends_on: @@ -54,6 +60,7 @@ services: image: cerc/watcher-mobymask-v2:local env_file: - ../config/watcher-mobymask-v2/optimism-params.env + - ../config/watcher-mobymask-v2/mobymask-params.env command: ["sh", "start-server.sh"] volumes: - ../config/watcher-mobymask-v2/watcher-config-template.toml:/app/packages/mobymask-v2-watcher/environments/watcher-config-template.toml @@ -63,6 +70,7 @@ services: - ../config/watcher-mobymask-v2/start-server.sh:/app/packages/mobymask-v2-watcher/start-server.sh - mobymask_deployment:/server - fixturenet_geth_accounts:/geth-accounts:ro + # Expose GQL, metrics and relay node ports ports: - "0.0.0.0:3001:3001" - "0.0.0.0:9001:9001" @@ -76,48 +84,6 @@ services: extra_hosts: - "host.docker.internal:host-gateway" - # TODO: Move to a separate pod - mobymask-app: - depends_on: - mobymask-watcher-server: - condition: service_healthy - mobymask: - condition: service_completed_successfully - image: cerc/mobymask-ui:local - command: ["sh", "mobymask-app-start.sh"] - volumes: - - ../config/watcher-mobymask-v2/mobymask-app.env:/app/.env - - ../config/watcher-mobymask-v2/mobymask-app-config.json:/app/src/mobymask-app-config.json - - ../config/watcher-mobymask-v2/mobymask-app-start.sh:/app/mobymask-app-start.sh - - mobymask_deployment:/server - ports: - - "0.0.0.0:3002:3000" - healthcheck: - test: ["CMD", "nc", "-v", "localhost", "3000"] - interval: 20s - timeout: 5s - retries: 15 - start_period: 10s - shm_size: '1GB' - - peer-test-app: - depends_on: - mobymask-watcher-server: - condition: service_healthy - image: cerc/react-peer:local - working_dir: /app/packages/test-app - command: ["sh", "-c", "yarn build && serve -s build"] - volumes: - - ../config/watcher-mobymask-v2/test-app-config.json:/app/packages/test-app/src/config.json - ports: - - "0.0.0.0:3003:3000" - healthcheck: - test: ["CMD", "nc", "-v", "localhost", "3000"] - interval: 20s - timeout: 5s - retries: 15 - start_period: 10s - volumes: mobymask_watcher_db_data: mobymask_deployment: diff --git a/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh b/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh index 2a3000ee..743b1525 100755 --- a/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh +++ b/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh @@ -4,6 +4,8 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi +echo "Using L2 RPC endpoint ${L2_GETH_RPC}" + if [ -f /geth-accounts/accounts.csv ]; then echo "Using L1 private key from the mounted volume" # Read the private key of L1 account to deploy contract @@ -16,10 +18,16 @@ fi jq --arg privateKey "$PRIVATE_KEY_DEPLOYER" '.privateKey = $privateKey' secrets-template.json > secrets.json # Set the RPC URL -export L2_GETH_URL="http://${L2_GETH_HOST}:${L2_GETH_PORT}" -jq --arg rpcUrl "$L2_GETH_URL" '.rpcUrl = $rpcUrl' secrets.json > secrets_updated.json && mv secrets_updated.json secrets.json +jq --arg rpcUrl "$L2_GETH_RPC" '.rpcUrl = $rpcUrl' secrets.json > secrets_updated.json && mv secrets_updated.json secrets.json -export RPC_URL="${L2_GETH_URL}" +export RPC_URL="${L2_GETH_RPC}" + +# Check if DEPLOYED_CONTRACT environment variable set to skip contract deployment +if [[ -n "$DEPLOYED_CONTRACT" ]]; then + echo "DEPLOYED_CONTRACT is set to '$DEPLOYED_CONTRACT'" + echo "Exiting without deploying contract" + exit 0 +fi # Check and exit if a deployment already exists (on restarts) if [ -f ./config.json ]; then @@ -39,10 +47,10 @@ if [ -f ./config.json ]; then fi fi -# Wait until balance for deployer account is reflected +# Wait until balance for deployer account is updated cd ../hardhat while true; do - ACCOUNT_BALANCE=$(yarn balance --network optimism $PRIVATE_KEY_DEPLOYER | grep ETH) + ACCOUNT_BALANCE=$(yarn balance --network optimism "$PRIVATE_KEY_DEPLOYER" | grep ETH) if [ "$ACCOUNT_BALANCE" != "0.0 ETH" ]; then echo "Account balance updated: $ACCOUNT_BALANCE" diff --git a/app/data/config/watcher-mobymask-v2/mobymask-app-config.json b/app/data/config/watcher-mobymask-v2/mobymask-app-config.json index 3b00674f..2ccb816d 100644 --- a/app/data/config/watcher-mobymask-v2/mobymask-app-config.json +++ b/app/data/config/watcher-mobymask-v2/mobymask-app-config.json @@ -1,4 +1,5 @@ { + "name": "MobyMask", "relayNodes": [ "/ip4/127.0.0.1/tcp/9090/ws/p2p/12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t" ], diff --git a/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh b/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh index efc4ed96..680e2e8a 100755 --- a/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh +++ b/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh @@ -4,9 +4,22 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi -# Merging config files to get deployed contract address -jq -s '.[0] * .[1]' /app/src/mobymask-app-config.json /server/config.json > /app/src/config.json +# Use config from mounted volume if available (when running web-app along with watcher stack) +if [ -f /server/config.json ]; then + echo "Merging config for deployed contract from mounted volume" + # Merging config files to get deployed contract address + jq -s '.[0] * .[1]' /app/src/mobymask-app-config.json /server/config.json > /app/src/config.json +else + echo "Setting deployed contract details from env" -npm run build + # Set config values from environment variables + jq --arg address "$DEPLOYED_CONTRACT" \ + --argjson chainId $CHAIN_ID \ + --argjson relayNodes "$RELAY_NODES" \ + '.address = $address | .chainId = $chainId | .relayNodes = $relayNodes' \ + /app/src/mobymask-app-config.json > /app/src/config.json +fi + +REACT_APP_WATCHER_URI="$APP_WATCHER_URL/graphql" npm run build serve -s build diff --git a/app/data/config/watcher-mobymask-v2/mobymask-app.env b/app/data/config/watcher-mobymask-v2/mobymask-app.env deleted file mode 100644 index 698d3502..00000000 --- a/app/data/config/watcher-mobymask-v2/mobymask-app.env +++ /dev/null @@ -1 +0,0 @@ -REACT_APP_WATCHER_URI=http://localhost:3001/graphql diff --git a/app/data/config/watcher-mobymask-v2/mobymask-params.env b/app/data/config/watcher-mobymask-v2/mobymask-params.env new file mode 100644 index 00000000..890c183b --- /dev/null +++ b/app/data/config/watcher-mobymask-v2/mobymask-params.env @@ -0,0 +1,14 @@ +# Change if pointing web app to external watcher endpoint +WATCHER_HOST="mobymask-watcher-server" +WATCHER_PORT=3001 +APP_WATCHER_URL="http://localhost:3001" + +# Set deployed MobyMask contract address to avoid deploying contract in stack +# mobymask-app will use this contract address in config if run separately +DEPLOYED_CONTRACT= + +# Chain ID is used by mobymask web-app for txs +CHAIN_ID=42069 + +# Set relay nodes to be used by web-apps +RELAY_NODES=["/ip4/127.0.0.1/tcp/9090/ws/p2p/12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t"] diff --git a/app/data/config/watcher-mobymask-v2/optimism-params.env b/app/data/config/watcher-mobymask-v2/optimism-params.env index bafb37a8..489dd879 100644 --- a/app/data/config/watcher-mobymask-v2/optimism-params.env +++ b/app/data/config/watcher-mobymask-v2/optimism-params.env @@ -1,9 +1,10 @@ # Change if pointing to an external optimism geth endpoint # L2 endpoints -# TODO: Add another env for complete URL to handle https +L2_GETH_RPC="http://op-geth:8545" L2_GETH_HOST="op-geth" L2_GETH_PORT=8545 + L2_NODE_HOST="op-node" L2_NODE_PORT=8547 diff --git a/app/data/config/watcher-mobymask-v2/start-server.sh b/app/data/config/watcher-mobymask-v2/start-server.sh index 5fe9ab84..4030e522 100755 --- a/app/data/config/watcher-mobymask-v2/start-server.sh +++ b/app/data/config/watcher-mobymask-v2/start-server.sh @@ -4,8 +4,15 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi -# Assign deployed contract address from server config -CONTRACT_ADDRESS=$(jq -r '.address' /server/config.json | tr -d '"') +echo "Using L2 RPC endpoint ${L2_GETH_RPC}" + +# Use contract address from environment variable or set from config.json in mounted volume +if [ -n "$DEPLOYED_CONTRACT" ]; then + CONTRACT_ADDRESS="${DEPLOYED_CONTRACT}" +else + # Assign deployed contract address from server config (created by mobymask container after deploying contract) + CONTRACT_ADDRESS=$(jq -r '.address' /server/config.json | tr -d '"') +fi if [ -f /geth-accounts/accounts.csv ]; then echo "Using L1 private key from the mounted volume" @@ -15,11 +22,20 @@ else echo "Using PRIVATE_KEY_PEER from env" fi -sed "s/REPLACE_WITH_PRIVATE_KEY/${PRIVATE_KEY_PEER}/" environments/watcher-config-template.toml > environments/local.toml -sed -i "s/REPLACE_WITH_CONTRACT_ADDRESS/${CONTRACT_ADDRESS}/" environments/local.toml +# Set private key and contract address for watcher peer txs to L2 only if PRIVATE_KEY_PEER variable is set +if [ -n "$PRIVATE_KEY_PEER" ]; then + # Read in config template TOML file and modify it + CONTENT=$(cat environments/watcher-config-template.toml) + NEW_CONTENT=$(echo "$CONTENT" | sed -E "/\[metrics\]/i \\\n\n [server.p2p.peer.l2TxConfig]\n privateKey = \"${PRIVATE_KEY_PEER}\"\n contractAddress = \"${CONTRACT_ADDRESS}\"\n") -export L2_GETH_URL="http://${L2_GETH_HOST}:${L2_GETH_PORT}" -sed -i 's|REPLACE_WITH_L2_GETH_URL|'"${L2_GETH_URL}"'|' environments/local.toml + # Write the modified content to a watcher config file + echo "$NEW_CONTENT" > environments/local.toml + + sed -i 's|REPLACE_WITH_L2_GETH_RPC_ENDPOINT|'"${L2_GETH_RPC}"'|' environments/local.toml +else + # Copy template config to watcher config without setting params for peer L2 txs + cp environments/watcher-config-template.toml environments/local.toml +fi echo 'yarn server' yarn server diff --git a/app/data/config/watcher-mobymask-v2/test-app-start.sh b/app/data/config/watcher-mobymask-v2/test-app-start.sh new file mode 100755 index 00000000..de6ccc7c --- /dev/null +++ b/app/data/config/watcher-mobymask-v2/test-app-start.sh @@ -0,0 +1,14 @@ +#!/bin/sh +set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi + +# Set relay nodes in config from RELAY_NODES environment variable +jq --argjson relayNodes "$RELAY_NODES" \ + '.relayNodes = $relayNodes' \ + ./src/test-app-config.json > ./src/config.json + +yarn build + +serve -s build diff --git a/app/data/config/watcher-mobymask-v2/watcher-config-template.toml b/app/data/config/watcher-mobymask-v2/watcher-config-template.toml index 05554e3a..6b0223c7 100644 --- a/app/data/config/watcher-mobymask-v2/watcher-config-template.toml +++ b/app/data/config/watcher-mobymask-v2/watcher-config-template.toml @@ -36,10 +36,6 @@ peerIdFile = './peer-id.json' enableDebugInfo = true - [server.p2p.peer.l2TxConfig] - privateKey = 'REPLACE_WITH_PRIVATE_KEY' - contractAddress = 'REPLACE_WITH_CONTRACT_ADDRESS' - [metrics] host = "0.0.0.0" port = 9000 @@ -59,7 +55,7 @@ [upstream] [upstream.ethServer] gqlApiEndpoint = "http://ipld-eth-server:8083/graphql" - rpcProviderEndpoint = "REPLACE_WITH_L2_GETH_URL" + rpcProviderEndpoint = "REPLACE_WITH_L2_GETH_RPC_ENDPOINT" blockDelayInMilliSecs = 60000 [upstream.cache] diff --git a/app/data/container-build/cerc-mobymask-ui/Dockerfile b/app/data/container-build/cerc-mobymask-ui/Dockerfile index 68e3c77c..c04b001d 100644 --- a/app/data/container-build/cerc-mobymask-ui/Dockerfile +++ b/app/data/container-build/cerc-mobymask-ui/Dockerfile @@ -1,6 +1,6 @@ FROM node:18.15.0-alpine3.16 -RUN apk --update --no-cache add make git jq +RUN apk --update --no-cache add make git jq bash WORKDIR /app diff --git a/app/data/container-build/cerc-react-peer/Dockerfile b/app/data/container-build/cerc-react-peer/Dockerfile index cc852441..fcc198f3 100644 --- a/app/data/container-build/cerc-react-peer/Dockerfile +++ b/app/data/container-build/cerc-react-peer/Dockerfile @@ -1,6 +1,6 @@ FROM node:18.15.0-alpine3.16 -RUN apk --update --no-cache add make git python3 +RUN apk --update --no-cache add make git python3 jq WORKDIR /app diff --git a/app/data/stacks/mobymask-v2/mobymask-only.md b/app/data/stacks/mobymask-v2/mobymask-only.md index 69c2007b..246d9000 100644 --- a/app/data/stacks/mobymask-v2/mobymask-only.md +++ b/app/data/stacks/mobymask-v2/mobymask-only.md @@ -4,30 +4,21 @@ Instructions to setup and deploy MobyMask v2 watcher independently ## Setup -Prerequisite: An L2 Optimism RPC endpoint +Prerequisite: L2 Optimism Geth and Node RPC endpoints Clone required repositories: ```bash -laconic-so --stack mobymask-v2 setup-repositories --include cerc-io/MobyMask,cerc-io/watcher-ts,cerc-io/react-peer,cerc-io/mobymask-ui +laconic-so --stack mobymask-v2 setup-repositories --include cerc-io/MobyMask,cerc-io/watcher-ts ``` Checkout to the required versions and branches in repos: -```bash ```bash # watcher-ts cd ~/cerc/watcher-ts git checkout v0.2.34 -# react-peer -cd ~/cerc/react-peer -git checkout v0.2.31 - -# mobymask-ui -cd ~/cerc/mobymask-ui -git checkout laconic - # MobyMask cd ~/cerc/MobyMask git checkout v0.1.2 @@ -36,20 +27,24 @@ git checkout v0.1.2 Build the container images: ```bash -laconic-so --stack mobymask-v2 build-containers --include cerc/watcher-mobymask-v2,cerc/react-peer,cerc/mobymask-ui,cerc/mobymask +laconic-so --stack mobymask-v2 build-containers --include cerc/watcher-mobymask-v2,cerc/mobymask ``` This should create the required docker images in the local image registry ## Deploy -Update the [optimism-params.env](../../config/watcher-mobymask-v2/optimism-params.env) file with Optimism endpoints and other params if running Optimism separately +### Configuration +* In [mobymask-params.env](../../config/watcher-mobymask-v2/mobymask-params.env) file set `DEPLOYED_CONTRACT` to existing deployed mobymask contract address + * Setting `DEPLOYED_CONTRACT` will skip contract deployment when running stack +* Update the [optimism-params.env](../../config/watcher-mobymask-v2/optimism-params.env) file with Optimism endpoints and other params for the Optimism running separately + * If `PRIVATE_KEY_PEER` is not set the inline watcher peer will not send txs to L2 on receiving P2P network messages * NOTE: * Stack Orchestrator needs to be run in [`dev`](/docs/CONTRIBUTING.md#install-developer-mode) mode to be able to edit the env file * If Optimism is running on the host machine, use `host.docker.internal` as the hostname to access the host port -Deploy the stack: +### Deploy the stack ```bash laconic-so --stack mobymask-v2 deploy --include watcher-mobymask-v2 up @@ -67,7 +62,9 @@ docker ps docker logs -f ``` -See [Tests](./README.md#tests) and [Demo](./README.md#demo) to interact with stack +## Tests + +See [Tests](./README.md#tests) ## Clean up diff --git a/app/data/stacks/mobymask-v2/stack.yml b/app/data/stacks/mobymask-v2/stack.yml index cdcbd663..248351b1 100644 --- a/app/data/stacks/mobymask-v2/stack.yml +++ b/app/data/stacks/mobymask-v2/stack.yml @@ -27,3 +27,5 @@ pods: - fixturenet-eth - fixturenet-optimism - watcher-mobymask-v2 + - mobymask-app + - peer-test-app diff --git a/app/data/stacks/mobymask-v2/web-apps.md b/app/data/stacks/mobymask-v2/web-apps.md new file mode 100644 index 00000000..052a7cb7 --- /dev/null +++ b/app/data/stacks/mobymask-v2/web-apps.md @@ -0,0 +1,91 @@ +# Web Apps + +Instructions to setup and deploy MobyMask and Peer Test web apps + +## Setup + +Prerequisite: Watcher with GQL and relay node endpoints + +Clone required repositories: + +```bash +laconic-so --stack mobymask-v2 setup-repositories --include cerc-io/react-peer,cerc-io/mobymask-ui +``` + +Checkout to the required versions and branches in repos: + +```bash +# react-peer +cd ~/cerc/react-peer +git checkout v0.2.31 + +# mobymask-ui +cd ~/cerc/mobymask-ui +git checkout laconic +``` + +Build the container images: + +```bash +laconic-so --stack mobymask-v2 build-containers --include cerc/react-peer-v2,cerc/mobymask-ui +``` + +This should create the required docker images in the local image registry + +## Deploy + +### Configuration + +* Update the [mobymask-params.env](../../config/watcher-mobymask-v2/mobymask-params.env) file with watcher endpoints and other params required by the web-apps + * `WATCHER_HOST` and `WATCHER_PORT` is used to check if watcher is up before building and deploying mobymask-app + * `APP_WATCHER_URL` is used by mobymask-app to make GQL queries + * `DEPLOYED_CONTRACT` and `CHAIN_ID` is used by mobymask-app in app config when creating messgaes for L2 txs + * `RELAY_NODES` is used by the web-apps to connect to the relay nodes (run in watcher) +* NOTE: + * Stack Orchestrator needs to be run in [`dev`](/docs/CONTRIBUTING.md#install-developer-mode) mode to be able to edit the env file + * If watcher is running on the host machine, use `host.docker.internal` as the hostname to access the host port + +### Deploy the stack + +For running mobymask-app +```bash +laconic-so --stack mobymask-v2 deploy --include mobymask-app up +``` + +For running peer-test-app +```bash +laconic-so --stack mobymask-v2 deploy --include peer-test-app up +``` + +To list down and monitor the running containers: + +```bash +docker ps + +# Check logs for a container +docker logs -f +``` + +## Clean up + +Stop all services running in the background: + +For mobymask-app +```bash +laconic-so --stack mobymask-v2 deploy --include mobymask-app down +``` + +For peer-test-app +```bash +laconic-so --stack mobymask-v2 deploy --include peer-test-app down +``` + +Clear volumes created by this stack: + +```bash +# List all relevant volumes +docker volume ls -q --filter "name=.*mobymask_deployment" + +# Remove all the listed volumes +docker volume rm $(docker volume ls -q --filter "name=.*mobymask_deployment") +``` From 44421049ae3ac96ff4e7fa377426d29e0c1ab5be Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 6 Apr 2023 07:19:08 -0600 Subject: [PATCH 0362/1010] Try to enable CI Former-commit-id: 0432a4bf29f7055b229d25352713699fe10972e4 --- .gitea/workflows/test.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .gitea/workflows/test.yml diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml new file mode 100644 index 00000000..77dd4c86 --- /dev/null +++ b/.gitea/workflows/test.yml @@ -0,0 +1,14 @@ +name: Tests + +on: + pull_request: + branches: '*' + push: + branches: '*' + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Clone project repository + uses: actions/checkout@v3 From 792887a12166120cc8eaab4d29ccf3c1461c0ae4 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 6 Apr 2023 07:28:13 -0600 Subject: [PATCH 0363/1010] Try adding job name Former-commit-id: 7dd07beec60966e8a583cd277c82521816b9e874 --- .gitea/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml index 77dd4c86..47443031 100644 --- a/.gitea/workflows/test.yml +++ b/.gitea/workflows/test.yml @@ -8,6 +8,7 @@ on: jobs: test: + name: "Run basic test suite" runs-on: ubuntu-latest steps: - name: Clone project repository From 484d80be5f2644c2a2f9362b5702ab2a6acbd109 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 6 Apr 2023 13:20:22 -0600 Subject: [PATCH 0364/1010] Add build Former-commit-id: 90210e439fa76bc0d0cfc39201c9169fd4f311b2 --- .gitea/workflows/test.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml index 47443031..e1a7c924 100644 --- a/.gitea/workflows/test.yml +++ b/.gitea/workflows/test.yml @@ -11,5 +11,15 @@ jobs: name: "Run basic test suite" runs-on: ubuntu-latest steps: - - name: Clone project repository + - name: "Clone project repository" uses: actions/checkout@v3 + - name: "Install Python" + uses: cerc-io/setup-python@v4 + with: + python-version: '3.8' + - name: "Check Python version" + run: python3 --version + - name: "Install shiv" + run: pip install shiv + - name: "Build local shiv bundle" + run: ./scripts/build_shiv_package.sh From 060ac520e4487665cda7d95fd77c3ed20be5d504 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 6 Apr 2023 13:24:17 -0600 Subject: [PATCH 0365/1010] Bump CI Former-commit-id: e7a4de594056e85542bc69d4451498d7266e9511 --- .gitea/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml index e1a7c924..e7e0e6dd 100644 --- a/.gitea/workflows/test.yml +++ b/.gitea/workflows/test.yml @@ -21,5 +21,5 @@ jobs: run: python3 --version - name: "Install shiv" run: pip install shiv - - name: "Build local shiv bundle" + - name: "Build local shiv package" run: ./scripts/build_shiv_package.sh From b915db426d6c35d18622084bc104f2882fdac503 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 6 Apr 2023 13:32:56 -0600 Subject: [PATCH 0366/1010] Add the smoke test Former-commit-id: b850322f57aaa1b789656d3ab1f8286b0893f581 --- .gitea/workflows/test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml index e7e0e6dd..3615aee6 100644 --- a/.gitea/workflows/test.yml +++ b/.gitea/workflows/test.yml @@ -23,3 +23,5 @@ jobs: run: pip install shiv - name: "Build local shiv package" run: ./scripts/build_shiv_package.sh + - name: "Run smoke tests" + run: ./tests/run-smoke-test.sh From e8139bd372cec33b4985cea1351bdfb3a398b6fa Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 6 Apr 2023 13:35:16 -0600 Subject: [PATCH 0367/1010] Use correct path Former-commit-id: 2e2927f7885f86690dd8017fdcd6e9c182dc9e3c --- .gitea/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml index 3615aee6..97c4ecc3 100644 --- a/.gitea/workflows/test.yml +++ b/.gitea/workflows/test.yml @@ -24,4 +24,4 @@ jobs: - name: "Build local shiv package" run: ./scripts/build_shiv_package.sh - name: "Run smoke tests" - run: ./tests/run-smoke-test.sh + run: ./tests/smoke-test/run-smoke-test.sh From dcc0f9114008623e4ba70358ef62f50389a8a953 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 6 Apr 2023 13:36:58 -0600 Subject: [PATCH 0368/1010] Change step name Former-commit-id: 4f137915bb200a0cf8cacae2d8a6b0d09cf01276 --- .gitea/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml index 97c4ecc3..e551240d 100644 --- a/.gitea/workflows/test.yml +++ b/.gitea/workflows/test.yml @@ -17,7 +17,7 @@ jobs: uses: cerc-io/setup-python@v4 with: python-version: '3.8' - - name: "Check Python version" + - name: "Print Python version" run: python3 --version - name: "Install shiv" run: pip install shiv From 4fa9d675baba6878c95dcee6b6a2f5a80adb2ce6 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 6 Apr 2023 13:50:50 -0600 Subject: [PATCH 0369/1010] Ubuntu install script (#289) * Copy of Zach's install script * Few small fixes after testing on DO droplet * Update scripts * Rename script * Add sudo notice * Fix typo * Fix another typo * Update docker instructions Former-commit-id: 9e2b140e101b8545d248af62eb22e61f2e1235b9 --- scripts/developer-mode-setup.sh | 11 +++ scripts/first_time_setup.sh | 8 --- scripts/quick-install-ubuntu.sh | 118 ++++++++++++++++++++++++++++++++ 3 files changed, 129 insertions(+), 8 deletions(-) create mode 100755 scripts/developer-mode-setup.sh delete mode 100755 scripts/first_time_setup.sh create mode 100755 scripts/quick-install-ubuntu.sh diff --git a/scripts/developer-mode-setup.sh b/scripts/developer-mode-setup.sh new file mode 100755 index 00000000..997c6173 --- /dev/null +++ b/scripts/developer-mode-setup.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# Script to automate the steps needed to make a cloned project repo runnable on the path +# (beware of PATH having some other file with the same name ahead of ours) +if [[ -n "$CERC_SCRIPT_DEBUG" ]]; then + set -x + echo PATH is $PATH +fi +python3 -m venv venv +source ./venv/bin/activate +pip install --editable . +pip install shiv diff --git a/scripts/first_time_setup.sh b/scripts/first_time_setup.sh deleted file mode 100755 index e8900ce7..00000000 --- a/scripts/first_time_setup.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -python3 -m venv venv -source ./venv/bin/activate -pip install --editable . -pip install shiv -shiv -c laconic-so -o laconic-so . -./laconic-so --verbose --local-stack setup-repositories diff --git a/scripts/quick-install-ubuntu.sh b/scripts/quick-install-ubuntu.sh new file mode 100755 index 00000000..3611abdf --- /dev/null +++ b/scripts/quick-install-ubuntu.sh @@ -0,0 +1,118 @@ +#!/usr/bin/env bash +if [[ -n "$CERC_SCRIPT_DEBUG" ]]; then + set -x +fi + +install_dir=~/bin + +# First display a reasonable warning to the user unless run with -y +if ! [[ $# -eq 1 && $1 == "-y" ]]; then + echo "**************************************************************************************" + echo "This script requires sudo privilege. It installs Laconic Stack Orchestrator" + echo "into: ${install_dir}. It also *removes* any existing docker installed on" + echo "this machine and then installs the latest docker release as well as other" + echo "required packages." + echo "Only proceed if you are sure you want to make those changes to this machine." + echo "**************************************************************************************" + read -p "Are you sure you want to proceed? " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + exit 1 + fi +fi + +# This script assumes root permissions on a fresh Ubuntu Digital Ocean droplet +# with these recommended specs: 16 GB Memory / 8 Intel vCPUs / 320 GB Disk + +# TODO: +# Check python3 is available +# Check machine resources are sufficient + +# dismiss the popups +export DEBIAN_FRONTEND=noninteractive + +## https://docs.docker.com/engine/install/ubuntu/ +## https://superuser.com/questions/518859/ignore-packages-that-are-not-currently-installed-when-using-apt-get-remove1 +packages_to_remove="docker docker-engine docker.io containerd runc" +installed_packages_to_remove="" +for package_to_remove in $(echo $packages_to_remove); do + $(dpkg --info $package_to_remove &> /dev/null) + if [[ $? -eq 0 ]]; then + installed_packages_to_remove="$installed_packages_to_remove $package_to_remove" + fi +done + +# Enable stop on error now, since we needed it off for the code above +set -euo pipefail ## https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/ + +if [[ -n "${installed_packages_to_remove}" ]]; then + echo "**************************************************************************************" + echo "Removing existing docker packages" + sudo apt -y remove $installed_packages_to_remove +fi + +echo "**************************************************************************************" +echo "Installing dependencies" +sudo apt -y update + +# laconic-so depends on jq +sudo apt -y install jq +# laconic-so depends on git +sudo apt -y install git +# curl used below +sudo apt -y install jq +# docker repo add depends on gnupg and updated ca-certificates +sudo apt -y install ca-certificates gnupg + +# Add dockerco package repository +sudo mkdir -m 0755 -p /etc/apt/keyrings +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg +echo \ + "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ + "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ + sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + +# Penny in the update jar +sudo apt -y update + +echo "**************************************************************************************" +echo "Installing docker" +sudo apt -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin + +# Allow the current user to use Docker +sudo usermod -aG docker $USER + +echo "**************************************************************************************" +echo "Installing laconic-so" +# install latest `laconic-so` +install_filename=${install_dir}/laconic-so +mkdir -p ${install_dir} +curl -L -o ${install_filename} https://github.com/cerc-io/stack-orchestrator/releases/latest/download/laconic-so +chmod +x ${install_filename} + +echo "**************************************************************************************" +# Check if our PATH line is already there +path_add_command="export PATH=\$PATH:${install_dir}" +if ! grep -q "${path_add_command}" ~/.profile +then + echo "Adding this line to the end of ~/.profile:" + echo ${path_add_command} + echo ${path_add_command} >> ~/.profile +fi + +echo "**************************************************************************************" +# PATH set here for commands run in this script +export PATH=$PATH:${install_dir} +echo Installed laconic-so version: $(laconic-so version) + +echo "**************************************************************************************" +echo "The Laconic Stack Orchestrator program laconic-so has been installed at ${install_filename}" +echo "The directory ${install_dir} has been added to PATH in *new* shells via ~/.profile" +echo "**************************************************************************************" +# Message the user to check docker is working for them +echo "Please log in again (docker will not work in this current shell) then:" +echo "test that docker is correctly installed and working for your user by running the" +echo "command below (it should print a message beginning \"Hello from Docker!\"):" +echo +echo "docker run hello-world" +echo From 5a27a94a7df4411c07bd2eddfdce5b0d79d8434a Mon Sep 17 00:00:00 2001 From: zramsay Date: Thu, 6 Apr 2023 19:28:27 -0400 Subject: [PATCH 0370/1010] more little updates Former-commit-id: 579fa6ff6632c6b73831e479e5642ddaa4610637 --- app/data/stacks/build-support/README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/app/data/stacks/build-support/README.md b/app/data/stacks/build-support/README.md index e3993402..b4090d76 100644 --- a/app/data/stacks/build-support/README.md +++ b/app/data/stacks/build-support/README.md @@ -12,10 +12,9 @@ To use a user-supplied registry set these environment variables: Leave `CERC_NPM_REGISTRY_URL` un-set to use the local gitea registry. ### 1. Build support containers -``` -$ laconic-so --stack build-support build-containers -``` -Note that the scheme/gerbil builder container can take a while to build so if you aren't going to build scheme projects it can be skipped with: + +Note: the scheme/gerbil container is excluded as it isn't currently required for the package registry. + ``` $ laconic-so --stack build-support build-containers --exclude cerc/builder-gerbil ``` @@ -37,6 +36,9 @@ Gitea was configured to use host name: gitea.local, ensure that this resolves to Success, gitea is properly initialized $ ``` + +Note: the above commands can take several minutes depending on the specs of your machine. + ### 3. Configure the hostname gitea.local How to do this is OS-dependent but usually involves editing a `hosts` file. For example on Linux add this line to the file `/etc/hosts` (needs sudo): ``` @@ -56,5 +58,5 @@ Now npm packages can be built: Ensure that `CERC_NPM_AUTH_TOKEN` is set with the token printed above when the package-registry stack was deployed (the actual token value will be different than shown in this example): ``` $ export CERC_NPM_AUTH_TOKEN=84fe66a73698bf11edbdccd0a338236b7d1d5c45 -$ laconic-so build-npms --include laconic-sdk +$ laconic-so build-npms --include laconic-sdk,laconic-registry-cli ``` From d2c85e6f1ddc3ff45fc175149a73640a1693fdcb Mon Sep 17 00:00:00 2001 From: Zach Date: Thu, 6 Apr 2023 19:39:12 -0400 Subject: [PATCH 0371/1010] Update README.md Former-commit-id: 1e130b2a292de8a43e153e5b851124a9a6aef863 --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 607a41bb..b6551a89 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,11 @@ Stack Orchestrator allows building and deployment of a Laconic Stack on a single ## Install +**To get started quickly** on a fresh Ubuntu instance (e.g, Digital Ocean); [try this script](./scripts/quick-install-ubuntu.sh). **WARNING:** always review scripts prior to running them so that you know what is happening on your machine. + +For any other installation, follow along below and **adapt these instructions based on the specifics of your system.** + + Ensure that the following are already installed: - [Python3](https://wiki.python.org/moin/BeginnersGuide/Download): `python3 --version` >= `3.8.10` (the Python3 shipped in Ubuntu 20+ is good to go) From 4ae959eb4f4db3147fab049c529e49eb949059ec Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 6 Apr 2023 19:04:00 -0600 Subject: [PATCH 0372/1010] Add prototype publish workflow Former-commit-id: 681112cf07d2214c5d327dde1e8cb385da213a3a --- .gitea/workflows/publish.yml | 37 ++++++++++++++++++++++++++++++++++++ .gitea/workflows/test.yml | 2 +- 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 .gitea/workflows/publish.yml diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml new file mode 100644 index 00000000..835c2882 --- /dev/null +++ b/.gitea/workflows/publish.yml @@ -0,0 +1,37 @@ +name: Publish + +on: + pull_request: + branches: '*' + push: + branches: '*' + +jobs: + test: + name: "Build" + runs-on: ubuntu-latest + steps: + - name: "Clone project repository" + uses: actions/checkout@v3 + - name: "Install Python" + uses: cerc-io/setup-python@v4 + with: + python-version: '3.8' + - name: "Print Python version" + run: python3 --version + - name: "Install shiv" + run: pip install shiv + - name: "Create release" + uses: cerc-io/action-gh-release@v1 + # We haven't decided how to trigger this release job. + # It might be done on creation of a git tag + # Or it might be done on merge to a release branch + # Somehow by this point however we need to know the release version + run: echo "Create the release here" + - name: "Build local shiv package" + # Build has to be done after deciding on the version because + # we bundle the version into the build + run: ./scripts/build_shiv_package.sh + - name: "Upload release artifact" + uses: cerc-io/action-gh-release@v1 + run: echo "Upload artifact here" diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml index e551240d..e3ab4f5a 100644 --- a/.gitea/workflows/test.yml +++ b/.gitea/workflows/test.yml @@ -1,4 +1,4 @@ -name: Tests +name: Test on: pull_request: From b36f9bc974378df4556b3dfc83e5b4e3c149b18d Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 6 Apr 2023 19:07:47 -0600 Subject: [PATCH 0373/1010] Fix errors Former-commit-id: 8fe0b2dc295fc3336911540e1af7da5b0c69f846 --- .gitea/workflows/publish.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index 835c2882..7c609965 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -27,11 +27,9 @@ jobs: # It might be done on creation of a git tag # Or it might be done on merge to a release branch # Somehow by this point however we need to know the release version - run: echo "Create the release here" - name: "Build local shiv package" # Build has to be done after deciding on the version because # we bundle the version into the build run: ./scripts/build_shiv_package.sh - name: "Upload release artifact" uses: cerc-io/action-gh-release@v1 - run: echo "Upload artifact here" From 124a838ab512d1c703319fc1e8aff90d785dcf42 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 6 Apr 2023 19:33:27 -0600 Subject: [PATCH 0374/1010] Try forcing a tag Former-commit-id: a559c2e90f6fc524ceed2443e223bf4e3aaa5ec5 --- .gitea/workflows/publish.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index 7c609965..b0ed9ab5 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -27,9 +27,13 @@ jobs: # It might be done on creation of a git tag # Or it might be done on merge to a release branch # Somehow by this point however we need to know the release version + with: + input_tag_name: "v1.2.3" - name: "Build local shiv package" # Build has to be done after deciding on the version because # we bundle the version into the build run: ./scripts/build_shiv_package.sh - name: "Upload release artifact" uses: cerc-io/action-gh-release@v1 + with: + files: requirements.txt From 6dad03c03161bb2c3a00e594bc75861a59c53b6c Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 6 Apr 2023 19:35:17 -0600 Subject: [PATCH 0375/1010] Get the tag right Former-commit-id: eb16a97def8cd6454428cc1259b0c266a96fe3bc --- .gitea/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index b0ed9ab5..669c83e5 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -28,7 +28,7 @@ jobs: # Or it might be done on merge to a release branch # Somehow by this point however we need to know the release version with: - input_tag_name: "v1.2.3" + tag_name: "v1.2.3" - name: "Build local shiv package" # Build has to be done after deciding on the version because # we bundle the version into the build From 504ed542c36583f1053140170c1b0b5f6ff686b7 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 6 Apr 2023 19:47:15 -0600 Subject: [PATCH 0376/1010] Try to upload Former-commit-id: 749b302f5f4788ec675f14a969470f9982a7609c --- .gitea/workflows/publish.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index 669c83e5..926f7c2f 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -28,7 +28,7 @@ jobs: # Or it might be done on merge to a release branch # Somehow by this point however we need to know the release version with: - tag_name: "v1.2.3" + tag_name: "v1.2.4" - name: "Build local shiv package" # Build has to be done after deciding on the version because # we bundle the version into the build @@ -36,4 +36,5 @@ jobs: - name: "Upload release artifact" uses: cerc-io/action-gh-release@v1 with: + tag_name: "v1.2.4" files: requirements.txt From 35d76496896199a9074bbb49d8bfe80d4a4eb699 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 7 Apr 2023 07:19:12 -0600 Subject: [PATCH 0377/1010] Try to enable request logging Former-commit-id: c90790d0d7f44220fd99229d9712c3df89d20eb3 --- .gitea/workflows/publish.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index 926f7c2f..a4bb223a 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -6,6 +6,10 @@ on: push: branches: '*' +# Enable debug logging +env: + ACTIONS_STEP_DEBUG: true + jobs: test: name: "Build" From 0d6bc81233b30f7ffbfa7e4b6da056a968e0670f Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 7 Apr 2023 07:27:39 -0600 Subject: [PATCH 0378/1010] Try to enable request logging Former-commit-id: 628954f060c6ca6b25549ae8364fea4324f78cf5 --- .gitea/workflows/publish.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index a4bb223a..84fb25f1 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -9,6 +9,7 @@ on: # Enable debug logging env: ACTIONS_STEP_DEBUG: true + RUNNER_DEBUG: true jobs: test: From 8fb9e6d39b93284fba4a8ba376ed986727870a45 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 7 Apr 2023 07:36:53 -0600 Subject: [PATCH 0379/1010] Try to enable request logging Former-commit-id: a930ad0d1c9555bdd7efd93bcfd979ce8b798b31 --- .gitea/workflows/publish.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index 84fb25f1..9acf3969 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -10,6 +10,7 @@ on: env: ACTIONS_STEP_DEBUG: true RUNNER_DEBUG: true + ACTIONS_RUNNER_DEBUG: true jobs: test: From fe7795584549a5e929225917e3e0edc198967d37 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 9 Apr 2023 22:41:01 -0600 Subject: [PATCH 0380/1010] Enable publishing with fixed version Former-commit-id: 751ed2e1570ed8da1031c9675469251d68e13a88 --- .gitea/workflows/publish.yml | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index 9acf3969..e074d2b9 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -6,15 +6,9 @@ on: push: branches: '*' -# Enable debug logging -env: - ACTIONS_STEP_DEBUG: true - RUNNER_DEBUG: true - ACTIONS_RUNNER_DEBUG: true - jobs: - test: - name: "Build" + publish: + name: "Build and publish" runs-on: ubuntu-latest steps: - name: "Clone project repository" @@ -28,19 +22,27 @@ jobs: - name: "Install shiv" run: pip install shiv - name: "Create release" - uses: cerc-io/action-gh-release@v1 + uses: cerc-io/action-gh-release@gitea-v1 # We haven't decided how to trigger this release job. # It might be done on creation of a git tag # Or it might be done on merge to a release branch # Somehow by this point however we need to know the release version with: - tag_name: "v1.2.4" + tag_name: "v1.2.5" - name: "Build local shiv package" + id: build # Build has to be done after deciding on the version because # we bundle the version into the build - run: ./scripts/build_shiv_package.sh + run: | + ./scripts/build_shiv_package.sh + result_code=$? + echo "::set-output name=package-file::$(ls ./package/*)" + exit $result_code + - name "Stage artifact file" + run: | + cp ${{ steps.build.outputs.package-file }} ./laconic-so - name: "Upload release artifact" - uses: cerc-io/action-gh-release@v1 + uses: cerc-io/action-gh-release@gitea-v1 with: - tag_name: "v1.2.4" - files: requirements.txt + tag_name: "v1.2.5" + files: ./laconic-so From a8815924c658b9d21b8e2939ac0d1cf4b6e4ec13 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 9 Apr 2023 22:44:15 -0600 Subject: [PATCH 0381/1010] Fix typo Former-commit-id: 93a2e1c8645ceba000344ddc1311cd5515a90d90 --- .gitea/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index e074d2b9..c2d0ca7a 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -38,7 +38,7 @@ jobs: result_code=$? echo "::set-output name=package-file::$(ls ./package/*)" exit $result_code - - name "Stage artifact file" + - name: "Stage artifact file" run: | cp ${{ steps.build.outputs.package-file }} ./laconic-so - name: "Upload release artifact" From 18279fcef32fcf072dc37786e69318c3df7ffc18 Mon Sep 17 00:00:00 2001 From: Nabarun Gogoi Date: Mon, 10 Apr 2023 10:42:56 +0530 Subject: [PATCH 0382/1010] Add env variable to enable/disable sending txs to L2 from watcher peer (#293) * Add flag to enable/disable watcher peer L2 txs * Update watcher-ts version in readme Former-commit-id: d3715d19520be01a3a5e98ce6ce9874f72cc568a --- .../deploy-and-generate-invite.sh | 3 +++ .../watcher-mobymask-v2/mobymask-params.env | 6 ++++++ .../watcher-mobymask-v2/secrets-template.json | 2 +- .../watcher-mobymask-v2/start-server.sh | 21 ++++++++----------- .../watcher-config-template.toml | 5 +++++ app/data/stacks/mobymask-v2/README.md | 2 +- app/data/stacks/mobymask-v2/mobymask-only.md | 5 +++-- 7 files changed, 28 insertions(+), 16 deletions(-) diff --git a/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh b/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh index 743b1525..f0513910 100755 --- a/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh +++ b/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh @@ -20,6 +20,9 @@ jq --arg privateKey "$PRIVATE_KEY_DEPLOYER" '.privateKey = $privateKey' secrets- # Set the RPC URL jq --arg rpcUrl "$L2_GETH_RPC" '.rpcUrl = $rpcUrl' secrets.json > secrets_updated.json && mv secrets_updated.json secrets.json +# Set the MobyMask app base URI +jq --arg baseURI "$MOBYMASK_APP_BASE_URI" '.baseURI = $baseURI' secrets.json > secrets_updated.json && mv secrets_updated.json secrets.json + export RPC_URL="${L2_GETH_RPC}" # Check if DEPLOYED_CONTRACT environment variable set to skip contract deployment diff --git a/app/data/config/watcher-mobymask-v2/mobymask-params.env b/app/data/config/watcher-mobymask-v2/mobymask-params.env index 890c183b..a8db6b4a 100644 --- a/app/data/config/watcher-mobymask-v2/mobymask-params.env +++ b/app/data/config/watcher-mobymask-v2/mobymask-params.env @@ -3,6 +3,12 @@ WATCHER_HOST="mobymask-watcher-server" WATCHER_PORT=3001 APP_WATCHER_URL="http://localhost:3001" +# Base URI for mobymask-app (used for generating invite) +MOBYMASK_APP_BASE_URI="http://127.0.0.1:3002/#" + +# Set to false for disabling watcher peer to send txs to L2 +ENABLE_PEER_L2_TXS=true + # Set deployed MobyMask contract address to avoid deploying contract in stack # mobymask-app will use this contract address in config if run separately DEPLOYED_CONTRACT= diff --git a/app/data/config/watcher-mobymask-v2/secrets-template.json b/app/data/config/watcher-mobymask-v2/secrets-template.json index 1397bbf1..da4939ac 100644 --- a/app/data/config/watcher-mobymask-v2/secrets-template.json +++ b/app/data/config/watcher-mobymask-v2/secrets-template.json @@ -1,5 +1,5 @@ { "rpcUrl": "", "privateKey": "", - "baseURI": "http://127.0.0.1:3002/#" + "baseURI": "" } diff --git a/app/data/config/watcher-mobymask-v2/start-server.sh b/app/data/config/watcher-mobymask-v2/start-server.sh index 4030e522..5597850b 100755 --- a/app/data/config/watcher-mobymask-v2/start-server.sh +++ b/app/data/config/watcher-mobymask-v2/start-server.sh @@ -22,20 +22,17 @@ else echo "Using PRIVATE_KEY_PEER from env" fi -# Set private key and contract address for watcher peer txs to L2 only if PRIVATE_KEY_PEER variable is set -if [ -n "$PRIVATE_KEY_PEER" ]; then - # Read in config template TOML file and modify it - CONTENT=$(cat environments/watcher-config-template.toml) - NEW_CONTENT=$(echo "$CONTENT" | sed -E "/\[metrics\]/i \\\n\n [server.p2p.peer.l2TxConfig]\n privateKey = \"${PRIVATE_KEY_PEER}\"\n contractAddress = \"${CONTRACT_ADDRESS}\"\n") - # Write the modified content to a watcher config file - echo "$NEW_CONTENT" > environments/local.toml +# Read in the config template TOML file and modify it +WATCHER_CONFIG_TEMPLATE=$(cat environments/watcher-config-template.toml) +WATCHER_CONFIG=$(echo "$WATCHER_CONFIG_TEMPLATE" | \ + sed -E "s/REPLACE_WITH_ENABLE_PEER_L2_TXS/${ENABLE_PEER_L2_TXS}/g; \ + s/REPLACE_WITH_PRIVATE_KEY_PEER/${PRIVATE_KEY_PEER}/g; \ + s/REPLACE_WITH_CONTRACT_ADDRESS/${CONTRACT_ADDRESS}/g; \ + s|REPLACE_WITH_L2_GETH_RPC_ENDPOINT|${L2_GETH_RPC}| ") - sed -i 's|REPLACE_WITH_L2_GETH_RPC_ENDPOINT|'"${L2_GETH_RPC}"'|' environments/local.toml -else - # Copy template config to watcher config without setting params for peer L2 txs - cp environments/watcher-config-template.toml environments/local.toml -fi +# Write the modified content to a new file +echo "$WATCHER_CONFIG" > environments/local.toml echo 'yarn server' yarn server diff --git a/app/data/config/watcher-mobymask-v2/watcher-config-template.toml b/app/data/config/watcher-mobymask-v2/watcher-config-template.toml index 6b0223c7..c360ffed 100644 --- a/app/data/config/watcher-mobymask-v2/watcher-config-template.toml +++ b/app/data/config/watcher-mobymask-v2/watcher-config-template.toml @@ -35,6 +35,11 @@ pubSubTopic = 'mobymask' peerIdFile = './peer-id.json' enableDebugInfo = true + enableL2Txs = REPLACE_WITH_ENABLE_PEER_L2_TXS + + [server.p2p.peer.l2TxsConfig] + privateKey = 'REPLACE_WITH_PRIVATE_KEY_PEER' + contractAddress = 'REPLACE_WITH_CONTRACT_ADDRESS' [metrics] host = "0.0.0.0" diff --git a/app/data/stacks/mobymask-v2/README.md b/app/data/stacks/mobymask-v2/README.md index 15652efe..54f66239 100644 --- a/app/data/stacks/mobymask-v2/README.md +++ b/app/data/stacks/mobymask-v2/README.md @@ -21,7 +21,7 @@ Checkout to the required versions and branches in repos ```bash # watcher-ts cd ~/cerc/watcher-ts -git checkout v0.2.34 +git checkout v0.2.35 # react-peer cd ~/cerc/react-peer diff --git a/app/data/stacks/mobymask-v2/mobymask-only.md b/app/data/stacks/mobymask-v2/mobymask-only.md index 246d9000..74290151 100644 --- a/app/data/stacks/mobymask-v2/mobymask-only.md +++ b/app/data/stacks/mobymask-v2/mobymask-only.md @@ -17,7 +17,7 @@ Checkout to the required versions and branches in repos: ```bash # watcher-ts cd ~/cerc/watcher-ts -git checkout v0.2.34 +git checkout v0.2.35 # MobyMask cd ~/cerc/MobyMask @@ -38,8 +38,9 @@ This should create the required docker images in the local image registry * In [mobymask-params.env](../../config/watcher-mobymask-v2/mobymask-params.env) file set `DEPLOYED_CONTRACT` to existing deployed mobymask contract address * Setting `DEPLOYED_CONTRACT` will skip contract deployment when running stack + * `ENABLE_PEER_L2_TXS` is used to enable/disable sending txs to L2 chain from watcher peer. * Update the [optimism-params.env](../../config/watcher-mobymask-v2/optimism-params.env) file with Optimism endpoints and other params for the Optimism running separately - * If `PRIVATE_KEY_PEER` is not set the inline watcher peer will not send txs to L2 on receiving P2P network messages + * `PRIVATE_KEY_PEER` is used by watcher peer to send txs to L2 chain * NOTE: * Stack Orchestrator needs to be run in [`dev`](/docs/CONTRIBUTING.md#install-developer-mode) mode to be able to edit the env file * If Optimism is running on the host machine, use `host.docker.internal` as the hostname to access the host port From 59afaf66aeb604f0ddfddf0a058e9afed8c9b528 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 10 Apr 2023 06:17:12 -0600 Subject: [PATCH 0383/1010] Make version manually updated Former-commit-id: f92a2fb3fcd37041fd49180940016fb9dd445171 --- app/data/version.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/data/version.txt b/app/data/version.txt index 0c1b3362..60248e30 100644 --- a/app/data/version.txt +++ b/app/data/version.txt @@ -1,2 +1,2 @@ -# This file should be re-generated running: scripts/update-version-file.sh script -v1.0.36-2515878 +# Manually updated product release version +1.1.0 From bf85c617116f8a58c808a264cd7b365f1cf9d66c Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 10 Apr 2023 06:24:00 -0600 Subject: [PATCH 0384/1010] Update for new tagging scheme Former-commit-id: dbb959f6480238b9a3d8691043ff749bdfdc4481 --- .gitea/workflows/publish.yml | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index c2d0ca7a..1d16c3a9 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -13,6 +13,16 @@ jobs: steps: - name: "Clone project repository" uses: actions/checkout@v3 + - name: "Get build info" # TODO: put this in a library + id: build-info + run: | + build_time=$(date +'%Y%m%d%H%M') + product_version=$( cat app/data/version.txt ) + short_sha=$(git rev-parse --short HEAD) + build_tag=$(echo "v${product_version}-${short_sha}-${build_time}") + echo "build-time=${build_time}" >> $GITHUB_OUTPUT + echo "short-sha=${short_sha}" >> $GITHUB_OUTPUT + echo "build-tag=${build_tag}" >> $GITHUB_OUTPUT - name: "Install Python" uses: cerc-io/setup-python@v4 with: @@ -21,14 +31,6 @@ jobs: run: python3 --version - name: "Install shiv" run: pip install shiv - - name: "Create release" - uses: cerc-io/action-gh-release@gitea-v1 - # We haven't decided how to trigger this release job. - # It might be done on creation of a git tag - # Or it might be done on merge to a release branch - # Somehow by this point however we need to know the release version - with: - tag_name: "v1.2.5" - name: "Build local shiv package" id: build # Build has to be done after deciding on the version because @@ -36,13 +38,13 @@ jobs: run: | ./scripts/build_shiv_package.sh result_code=$? - echo "::set-output name=package-file::$(ls ./package/*)" + echo "package-file=$(ls ./package/*)" >> $GITHUB_OUTPUT exit $result_code - name: "Stage artifact file" run: | cp ${{ steps.build.outputs.package-file }} ./laconic-so - - name: "Upload release artifact" + - name: "Create release" uses: cerc-io/action-gh-release@gitea-v1 with: - tag_name: "v1.2.5" + tag_name: "${{ steps.build-info.outputs.build-tag }}" files: ./laconic-so From f90000d9cca91300e5acd5dcffecb50a9061da47 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 10 Apr 2023 06:43:23 -0600 Subject: [PATCH 0385/1010] New build version scheme (#305) * Use separate build tag file * Implement new versioning scheme * Update workflow file Former-commit-id: 80bbbafeb6016441ec0420ccdcb480fd4afa844d --- .gitea/workflows/publish.yml | 10 +++------- app/version.py | 2 +- scripts/build_shiv_package.sh | 2 +- scripts/create_build_tag_file.sh | 8 ++++++++ scripts/update_version_file.sh | 7 ------- 5 files changed, 13 insertions(+), 16 deletions(-) create mode 100755 scripts/create_build_tag_file.sh delete mode 100755 scripts/update_version_file.sh diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index 1d16c3a9..21976df7 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -13,15 +13,11 @@ jobs: steps: - name: "Clone project repository" uses: actions/checkout@v3 - - name: "Get build info" # TODO: put this in a library + - name: "Get build info" id: build-info run: | - build_time=$(date +'%Y%m%d%H%M') - product_version=$( cat app/data/version.txt ) - short_sha=$(git rev-parse --short HEAD) - build_tag=$(echo "v${product_version}-${short_sha}-${build_time}") - echo "build-time=${build_time}" >> $GITHUB_OUTPUT - echo "short-sha=${short_sha}" >> $GITHUB_OUTPUT + ./scripts/create_build_tag_file.sh + build_tag=$(cat ./app/data/build_tag.txt) echo "build-tag=${build_tag}" >> $GITHUB_OUTPUT - name: "Install Python" uses: cerc-io/setup-python@v4 diff --git a/app/version.py b/app/version.py index 70280cd4..4194f24a 100644 --- a/app/version.py +++ b/app/version.py @@ -23,7 +23,7 @@ def command(ctx): # See: https://stackoverflow.com/a/20885799/1701505 from . import data - with importlib.resources.open_text(data, "version.txt") as version_file: + with importlib.resources.open_text(data, "build_tag.txt") as version_file: # TODO: code better version that skips comment lines version_string = version_file.read().splitlines()[1] diff --git a/scripts/build_shiv_package.sh b/scripts/build_shiv_package.sh index a51ae9e2..3d0c12ff 100755 --- a/scripts/build_shiv_package.sh +++ b/scripts/build_shiv_package.sh @@ -1,4 +1,4 @@ # Builds the shiv "package" for distribution mkdir -p ./package -version_string=$( ./scripts/update_version_file.sh) +version_string=$( ./app/data/version.txt ) shiv -c laconic-so -o package/laconic-so-${version_string} . diff --git a/scripts/create_build_tag_file.sh b/scripts/create_build_tag_file.sh new file mode 100755 index 00000000..c814a420 --- /dev/null +++ b/scripts/create_build_tag_file.sh @@ -0,0 +1,8 @@ +build_tag_file_name=./app/data/build_tag.txt +echo "# This file should be re-generated running: scripts/create_build_tag_file.sh script" > $build_tag_file_name +product_version_string=$( tail -1 ./app/data/version.txt ) +commit_string=$( git rev-parse --short HEAD ) +timestamp_string=$(date +'%Y%m%d%H%M') +build_tag_string=${product_version_string}-${commit_string}-${timestamp_string} +echo ${build_tag_string} >> $build_tag_file_name +echo ${build_tag_string} diff --git a/scripts/update_version_file.sh b/scripts/update_version_file.sh deleted file mode 100755 index 9880b21b..00000000 --- a/scripts/update_version_file.sh +++ /dev/null @@ -1,7 +0,0 @@ -version_file_name=./app/data/version.txt -echo "# This file should be re-generated running: scripts/update-version-file.sh script" > $version_file_name -tag_string=$( git describe --tags --abbrev=0 ) -commit_string=$( git rev-parse --short HEAD ) -version_string=${tag_string}-${commit_string} -echo ${version_string} >> $version_file_name -echo ${version_string} From 17d5e37368835816b95b3b5a18fdcb840973e835 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 10 Apr 2023 06:54:30 -0600 Subject: [PATCH 0386/1010] Remove comment Former-commit-id: a26ec970bc3845c5cfa21b74271592413931ed31 --- .gitea/workflows/publish.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index 21976df7..bb7d994c 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -29,8 +29,6 @@ jobs: run: pip install shiv - name: "Build local shiv package" id: build - # Build has to be done after deciding on the version because - # we bundle the version into the build run: | ./scripts/build_shiv_package.sh result_code=$? @@ -38,7 +36,7 @@ jobs: exit $result_code - name: "Stage artifact file" run: | - cp ${{ steps.build.outputs.package-file }} ./laconic-so + cp ${{ steps.build.outputs.package-file }} ./laconic-so - name: "Create release" uses: cerc-io/action-gh-release@gitea-v1 with: From 21d7a1ba619df1075bc368abeddece9a4909ab6c Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 10 Apr 2023 06:55:25 -0600 Subject: [PATCH 0387/1010] Add v prefix Former-commit-id: 1389559bc6d2eeb162655f2a0fd472e0e87a3dda --- .gitea/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index bb7d994c..7ab521c3 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -18,7 +18,7 @@ jobs: run: | ./scripts/create_build_tag_file.sh build_tag=$(cat ./app/data/build_tag.txt) - echo "build-tag=${build_tag}" >> $GITHUB_OUTPUT + echo "build-tag=v${build_tag}" >> $GITHUB_OUTPUT - name: "Install Python" uses: cerc-io/setup-python@v4 with: From 317608140f4c8101c892a1f6671d2f01c9937b3f Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 10 Apr 2023 06:59:08 -0600 Subject: [PATCH 0388/1010] Trigger publish on PR and merge to main (#306) Former-commit-id: c359188b3df206c4121477c959c31fe79bb6d9bd --- .gitea/workflows/publish.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index 7ab521c3..32aec8ea 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -2,9 +2,12 @@ name: Publish on: pull_request: - branches: '*' + branches: + - main push: - branches: '*' + branches: + - main + - publish-test jobs: publish: From b3732bc7a6da36377f67dcdad2cfb48f144d0862 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 10 Apr 2023 07:27:31 -0600 Subject: [PATCH 0389/1010] Publish only on push to test branch Former-commit-id: 5201138d6d6ea047139ed24507421a42b2407831 --- .gitea/workflows/publish.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index 32aec8ea..3031696a 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -6,7 +6,6 @@ on: - main push: branches: - - main - publish-test jobs: From 75958adf822577feee060e85b9c230954d5f8389 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 10 Apr 2023 07:37:48 -0600 Subject: [PATCH 0390/1010] Go back to all branches Former-commit-id: 862cc4d44893f620cad2c3aa2ad98fef7f754ba7 --- .gitea/workflows/publish.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index 3031696a..0566f510 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -5,8 +5,7 @@ on: branches: - main push: - branches: - - publish-test + branches: '*' jobs: publish: From 1559330fd7add1175f3ba1c3379e7848c74a1a49 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 10 Apr 2023 07:44:14 -0600 Subject: [PATCH 0391/1010] Add test code Former-commit-id: a225d5034b5b9f221ad8671772f2f7356554e124 --- .gitea/workflows/publish.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index 0566f510..9c40a6fb 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -28,6 +28,8 @@ jobs: run: python3 --version - name: "Install shiv" run: pip install shiv + - name: "Test things" + run: echo "Build tag is: ${{ steps.build-info.outputs.build-tag }}" - name: "Build local shiv package" id: build run: | From d72dcb6c74bf3944dc78a910f2d19f9e0ef79f08 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 10 Apr 2023 07:48:22 -0600 Subject: [PATCH 0392/1010] Add test code Former-commit-id: c934ffe18e4c36e6926c287fb4d2b33150355f70 --- .gitea/workflows/publish.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index 9c40a6fb..14e96ad8 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -2,8 +2,7 @@ name: Publish on: pull_request: - branches: - - main + branches: '*' push: branches: '*' From 7bcad7b93683f872675609e9933d16784e6c3ebe Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 10 Apr 2023 09:18:39 -0600 Subject: [PATCH 0393/1010] Fix publish workflow Former-commit-id: e5cf52f188792d3ac3c09a4ce995d91d765b2d8e --- .gitea/workflows/publish.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index 14e96ad8..f474d867 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -1,10 +1,10 @@ name: Publish on: - pull_request: - branches: '*' push: - branches: '*' + branches: + - main + - publish-test jobs: publish: @@ -16,9 +16,9 @@ jobs: - name: "Get build info" id: build-info run: | - ./scripts/create_build_tag_file.sh - build_tag=$(cat ./app/data/build_tag.txt) + build_tag=$(./scripts/create_build_tag_file.sh) echo "build-tag=v${build_tag}" >> $GITHUB_OUTPUT + echo "Build tag set to v${build_tag}" - name: "Install Python" uses: cerc-io/setup-python@v4 with: @@ -28,14 +28,14 @@ jobs: - name: "Install shiv" run: pip install shiv - name: "Test things" - run: echo "Build tag is: ${{ steps.build-info.outputs.build-tag }}" + run: echo "Build tag is ${{ steps.build-info.outputs.build-tag }}" - name: "Build local shiv package" id: build run: | ./scripts/build_shiv_package.sh result_code=$? echo "package-file=$(ls ./package/*)" >> $GITHUB_OUTPUT - exit $result_code + exit $result_code - name: "Stage artifact file" run: | cp ${{ steps.build.outputs.package-file }} ./laconic-so From ce6ef81fe595f74101ee68b36a68abebf2772503 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 10 Apr 2023 11:20:15 -0600 Subject: [PATCH 0394/1010] Publish drafts on the test branch Former-commit-id: 49f14f3191d2776abe9d27d7b97c57a789b5037c --- .gitea/workflows/publish.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index f474d867..89ac38eb 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -18,7 +18,6 @@ jobs: run: | build_tag=$(./scripts/create_build_tag_file.sh) echo "build-tag=v${build_tag}" >> $GITHUB_OUTPUT - echo "Build tag set to v${build_tag}" - name: "Install Python" uses: cerc-io/setup-python@v4 with: @@ -27,20 +26,20 @@ jobs: run: python3 --version - name: "Install shiv" run: pip install shiv - - name: "Test things" - run: echo "Build tag is ${{ steps.build-info.outputs.build-tag }}" - name: "Build local shiv package" id: build run: | ./scripts/build_shiv_package.sh result_code=$? echo "package-file=$(ls ./package/*)" >> $GITHUB_OUTPUT - exit $result_code + exit $result_code - name: "Stage artifact file" run: | - cp ${{ steps.build.outputs.package-file }} ./laconic-so + cp ${{ steps.build.outputs.package-file }} ./laconic-so - name: "Create release" uses: cerc-io/action-gh-release@gitea-v1 with: - tag_name: "${{ steps.build-info.outputs.build-tag }}" + tag_name: ${{ steps.build-info.outputs.build-tag }} + # On the publish test branch, mark our release as a draft + draft: ${{ github.ref == 'refs/heads/publish-test' }} files: ./laconic-so From 607b85f447b0be7a8841f79280fc186e0c8177cf Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 10 Apr 2023 11:26:53 -0600 Subject: [PATCH 0395/1010] Fix weird whitespace Former-commit-id: 23d5d563e1d61daf5d83d31efd22f51d0ad9c325 --- .gitea/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index 89ac38eb..08e63bb3 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -35,7 +35,7 @@ jobs: exit $result_code - name: "Stage artifact file" run: | - cp ${{ steps.build.outputs.package-file }} ./laconic-so + cp ${{ steps.build.outputs.package-file }} ./laconic-so - name: "Create release" uses: cerc-io/action-gh-release@gitea-v1 with: From 2e747b17be4be737822e626c9194621d55023012 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 10 Apr 2023 11:50:09 -0600 Subject: [PATCH 0396/1010] Publish test workflow (#308) Former-commit-id: a16b1cd07311a887744c8f039ef076c052118e1a --- .gitea/workflows/publish.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index 08e63bb3..c86713ce 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -41,5 +41,6 @@ jobs: with: tag_name: ${{ steps.build-info.outputs.build-tag }} # On the publish test branch, mark our release as a draft - draft: ${{ github.ref == 'refs/heads/publish-test' }} + # Hack using endsWith to workaround Gitea sometimes sending "publish-test" vs "refs/heads/publish-test" + draft: ${{ endsWith('publish-test', github.ref ) }} files: ./laconic-so From 7021f8ed19f748165703450e8de919f9a87fa1b4 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 10 Apr 2023 12:17:54 -0600 Subject: [PATCH 0397/1010] Add call to build tag script Former-commit-id: 440b146e80af47fd67d916af3a9dbe135694b7d8 --- .gitea/workflows/test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml index e3ab4f5a..fd1c739c 100644 --- a/.gitea/workflows/test.yml +++ b/.gitea/workflows/test.yml @@ -21,6 +21,8 @@ jobs: run: python3 --version - name: "Install shiv" run: pip install shiv + - name: "Generate build version file" + run: ./scripts/create_build_tag_file.sh - name: "Build local shiv package" run: ./scripts/build_shiv_package.sh - name: "Run smoke tests" From ffc24c0be81ac13932bedfe20a7b24605e34d1ac Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 10 Apr 2023 14:39:28 -0600 Subject: [PATCH 0398/1010] Edit readme to trigger CI Former-commit-id: 9a4b5810afafdd772cd29ef8a93fec925c0f0b73 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b6551a89..0f2ca38e 100644 --- a/README.md +++ b/README.md @@ -96,3 +96,4 @@ See the [CONTRIBUTING.md](/docs/CONTRIBUTING.md) for developer mode install. Native aarm64 is _not_ currently supported. x64 emulation on ARM64 macos should work (not yet tested). + From c2a3ffe0dde841914c83dafe906df0f4ab0eea0c Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Tue, 11 Apr 2023 16:21:03 +0530 Subject: [PATCH 0399/1010] Add an option to pass env file to deploy command (#304) * Add an option to pass env file to deploy command * Use env variable mapping in fixturenet-optimism stack * Use default values from checked in env files * Use env variable mapping in mobymask-v2 stack * Update instructions * Add extra hosts in app compose files and update instructions * Add CERC prefix to env variables in fixturenet-optimism stack * Add CERC prefix to env variables in mobymask-v2 stack Former-commit-id: 6b62247ef7a32e20e55c529afa0b80fadb6873a1 --- .../docker-compose-fixturenet-optimism.yml | 33 +++++++++--- .../compose/docker-compose-mobymask-app.yml | 10 +++- .../compose/docker-compose-peer-test-app.yml | 5 ++ .../docker-compose-watcher-mobymask-v2.yml | 23 ++++++--- .../fixturenet-optimism/generate-l2-config.sh | 4 +- .../config/fixturenet-optimism/l1-params.env | 18 +++---- .../optimism-contracts/run.sh | 40 +++++++++------ .../fixturenet-optimism/run-op-batcher.sh | 4 +- .../config/fixturenet-optimism/run-op-node.sh | 4 +- .../deploy-and-generate-invite.sh | 28 ++++++---- .../watcher-mobymask-v2/mobymask-app-start.sh | 13 +++-- .../watcher-mobymask-v2/mobymask-params.env | 20 ++++---- .../watcher-mobymask-v2/optimism-params.env | 16 +++--- .../watcher-mobymask-v2/start-server.sh | 22 +++++--- .../watcher-mobymask-v2/test-app-start.sh | 6 ++- .../watcher-config-template.toml | 6 +-- .../hardhat-tasks/send-balance.ts | 2 +- .../verify-contract-deployment.ts | 2 +- app/data/stacks/fixturenet-optimism/README.md | 4 +- .../stacks/fixturenet-optimism/l2-only.md | 29 ++++++++--- app/data/stacks/mobymask-v2/README.md | 4 +- app/data/stacks/mobymask-v2/mobymask-only.md | 51 +++++++++++++++---- app/data/stacks/mobymask-v2/web-apps.md | 47 +++++++++++++---- app/deploy_system.py | 5 +- 24 files changed, 276 insertions(+), 120 deletions(-) diff --git a/app/data/compose/docker-compose-fixturenet-optimism.yml b/app/data/compose/docker-compose-fixturenet-optimism.yml index 142a2251..cc1d64d3 100644 --- a/app/data/compose/docker-compose-fixturenet-optimism.yml +++ b/app/data/compose/docker-compose-fixturenet-optimism.yml @@ -9,9 +9,17 @@ services: image: cerc/optimism-contracts:local env_file: - ../config/fixturenet-optimism/l1-params.env + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_L1_CHAIN_ID: ${CERC_L1_CHAIN_ID} + CERC_L1_RPC: ${CERC_L1_RPC} + CERC_L1_ADDRESS: ${CERC_L1_ADDRESS} + CERC_L1_PRIV_KEY: ${CERC_L1_PRIV_KEY} + CERC_L1_ADDRESS_2: ${CERC_L1_ADDRESS_2} + CERC_L1_PRIV_KEY_2: ${CERC_L1_PRIV_KEY_2} # Waits for L1 endpoint to be up before running the script command: | - "./wait-for-it.sh -h $${L1_HOST} -p $${L1_PORT} -s -t 60 -- ./run.sh" + "./wait-for-it.sh -h ${CERC_L1_HOST:-$${DEFAULT_CERC_L1_HOST}} -p ${CERC_L1_PORT:-$${DEFAULT_CERC_L1_PORT}} -s -t 60 -- ./run.sh" volumes: - ../config/wait-for-it.sh:/app/packages/contracts-bedrock/wait-for-it.sh - ../container-build/cerc-optimism-contracts/hardhat-tasks/verify-contract-deployment.ts:/app/packages/contracts-bedrock/tasks/verify-contract-deployment.ts @@ -33,6 +41,9 @@ services: condition: service_completed_successfully env_file: - ../config/fixturenet-optimism/l1-params.env + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_L1_RPC: ${CERC_L1_RPC} volumes: - ../config/fixturenet-optimism/generate-l2-config.sh:/app/generate-l2-config.sh - l1_deployment:/contracts-bedrock:ro @@ -65,12 +76,15 @@ services: # Runs the L2 consensus client (Sequencer node) op-node: - env_file: - - ../config/fixturenet-optimism/l1-params.env + image: cerc/optimism-op-node:local depends_on: op-geth: condition: service_healthy - image: cerc/optimism-op-node:local + env_file: + - ../config/fixturenet-optimism/l1-params.env + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_L1_RPC: ${CERC_L1_RPC} volumes: - ../config/fixturenet-optimism/run-op-node.sh:/app/run-op-node.sh - l2_config:/op-node-data:ro @@ -89,14 +103,17 @@ services: # Runs the batcher (takes transactions from the Sequencer and publishes them to L1) op-batcher: - env_file: - - ../config/fixturenet-optimism/l1-params.env + image: cerc/optimism-op-batcher:local depends_on: op-node: condition: service_healthy op-geth: condition: service_healthy - image: cerc/optimism-op-batcher:local + env_file: + - ../config/fixturenet-optimism/l1-params.env + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_L1_RPC: ${CERC_L1_RPC} volumes: - ../config/wait-for-it.sh:/wait-for-it.sh - ../config/fixturenet-optimism/run-op-batcher.sh:/run-op-batcher.sh @@ -104,7 +121,7 @@ services: entrypoint: ["sh", "-c"] # Waits for L1 endpoint to be up before running the batcher command: | - "/wait-for-it.sh -h $${L1_HOST} -p $${L1_PORT} -s -t 60 -- /run-op-batcher.sh" + "/wait-for-it.sh -h ${CERC_L1_HOST:-$${DEFAULT_CERC_L1_HOST}} -p ${CERC_L1_PORT:-$${DEFAULT_CERC_L1_PORT}} -s -t 60 -- /run-op-batcher.sh" extra_hosts: - "host.docker.internal:host-gateway" diff --git a/app/data/compose/docker-compose-mobymask-app.yml b/app/data/compose/docker-compose-mobymask-app.yml index db95eeac..1cd4f9ab 100644 --- a/app/data/compose/docker-compose-mobymask-app.yml +++ b/app/data/compose/docker-compose-mobymask-app.yml @@ -6,12 +6,18 @@ services: image: cerc/mobymask-ui:local env_file: - ../config/watcher-mobymask-v2/mobymask-params.env + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_CHAIN_ID: ${CERC_CHAIN_ID} + CERC_DEPLOYED_CONTRACT: ${CERC_DEPLOYED_CONTRACT} + CERC_APP_WATCHER_URL: ${CERC_APP_WATCHER_URL} + CERC_RELAY_NODES: ${CERC_RELAY_NODES} # Waits for watcher server to be up before app build # Required when running with watcher stack to get deployed contract address command: - sh - -c - - ./wait-for-it.sh -h $${WATCHER_HOST} -p $${WATCHER_PORT} -s -t 0 -- ./mobymask-app-start.sh + - ./wait-for-it.sh -h ${CERC_WATCHER_HOST:-$${DEFAULT_CERC_WATCHER_HOST}} -p ${CERC_WATCHER_PORT:-$${DEFAULT_CERC_WATCHER_PORT}} -s -t 0 -- ./mobymask-app-start.sh volumes: - ../config/wait-for-it.sh:/app/wait-for-it.sh - ../config/watcher-mobymask-v2/mobymask-app-config.json:/app/src/mobymask-app-config.json @@ -26,6 +32,8 @@ services: retries: 15 start_period: 10s shm_size: '1GB' + extra_hosts: + - "host.docker.internal:host-gateway" volumes: mobymask_deployment: diff --git a/app/data/compose/docker-compose-peer-test-app.yml b/app/data/compose/docker-compose-peer-test-app.yml index 3ddbd308..c0cc68cb 100644 --- a/app/data/compose/docker-compose-peer-test-app.yml +++ b/app/data/compose/docker-compose-peer-test-app.yml @@ -7,6 +7,9 @@ services: working_dir: /app/packages/test-app env_file: - ../config/watcher-mobymask-v2/mobymask-params.env + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_RELAY_NODES: ${CERC_RELAY_NODES} command: ["sh", "./test-app-start.sh"] volumes: - ../config/watcher-mobymask-v2/test-app-config.json:/app/packages/test-app/src/test-app-config.json @@ -19,3 +22,5 @@ services: timeout: 5s retries: 15 start_period: 10s + extra_hosts: + - "host.docker.internal:host-gateway" diff --git a/app/data/compose/docker-compose-watcher-mobymask-v2.yml b/app/data/compose/docker-compose-watcher-mobymask-v2.yml index 2e014471..3af4eccb 100644 --- a/app/data/compose/docker-compose-watcher-mobymask-v2.yml +++ b/app/data/compose/docker-compose-watcher-mobymask-v2.yml @@ -22,8 +22,8 @@ services: retries: 15 start_period: 10s - # Deploys MobyMask contract and generates an invite link - # Deployment is skipped if DEPLOYED_CONTRACT env is already set + # Deploys the MobyMask contract and generates an invite link + # Deployment is skipped if CERC_DEPLOYED_CONTRACT env is set mobymask: image: cerc/mobymask:local working_dir: /app/packages/server @@ -31,14 +31,19 @@ services: - ../config/watcher-mobymask-v2/optimism-params.env - ../config/watcher-mobymask-v2/mobymask-params.env environment: - - ENV=PROD + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + ENV: "PROD" + CERC_L2_GETH_RPC: ${CERC_L2_GETH_RPC} + CERC_PRIVATE_KEY_DEPLOYER: ${CERC_PRIVATE_KEY_DEPLOYER} + CERC_MOBYMASK_APP_BASE_URI: ${CERC_MOBYMASK_APP_BASE_URI} + CERC_DEPLOYED_CONTRACT: ${CERC_DEPLOYED_CONTRACT} # Waits for L2 Optimism Geth and Node servers to be up before deploying contract command: - sh - -c - | - ./wait-for-it.sh -h $${L2_GETH_HOST} -p $${L2_GETH_PORT} -s -t 0 && \ - ./wait-for-it.sh -h $${L2_NODE_HOST} -p $${L2_NODE_PORT} -s -t 0 && \ + ./wait-for-it.sh -h ${CERC_L2_GETH_HOST:-$${DEFAULT_CERC_L2_GETH_HOST}} -p ${CERC_L2_GETH_PORT:-$${DEFAULT_CERC_L2_GETH_PORT}} -s -t 0 && \ + ./wait-for-it.sh -h ${CERC_L2_NODE_HOST:-$${DEFAULT_CERC_L2_NODE_HOST}} -p ${CERC_L2_NODE_PORT:-$${DEFAULT_CERC_L2_NODE_PORT}} -s -t 0 && \ ./deploy-and-generate-invite.sh volumes: - ../config/wait-for-it.sh:/app/packages/server/wait-for-it.sh @@ -51,16 +56,22 @@ services: # Starts the mobymask-v2-watcher server mobymask-watcher-server: + image: cerc/watcher-mobymask-v2:local restart: unless-stopped depends_on: mobymask-watcher-db: condition: service_healthy mobymask: condition: service_completed_successfully - image: cerc/watcher-mobymask-v2:local env_file: - ../config/watcher-mobymask-v2/optimism-params.env - ../config/watcher-mobymask-v2/mobymask-params.env + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_L2_GETH_RPC: ${CERC_L2_GETH_RPC} + CERC_PRIVATE_KEY_PEER: ${CERC_PRIVATE_KEY_PEER} + CERC_ENABLE_PEER_L2_TXS: ${CERC_ENABLE_PEER_L2_TXS} + CERC_DEPLOYED_CONTRACT: ${CERC_DEPLOYED_CONTRACT} command: ["sh", "start-server.sh"] volumes: - ../config/watcher-mobymask-v2/watcher-config-template.toml:/app/packages/mobymask-v2-watcher/environments/watcher-config-template.toml diff --git a/app/data/config/fixturenet-optimism/generate-l2-config.sh b/app/data/config/fixturenet-optimism/generate-l2-config.sh index 9c439f32..b10048d2 100755 --- a/app/data/config/fixturenet-optimism/generate-l2-config.sh +++ b/app/data/config/fixturenet-optimism/generate-l2-config.sh @@ -4,6 +4,8 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi +CERC_L1_RPC="${CERC_L1_RPC:-${DEFAULT_CERC_L1_RPC}}" + # Check existing config if it exists if [ -f /app/jwt.txt ] && [ -f /app/rollup.json ]; then echo "Found existing L2 config, cross-checking with L1 deployment config" @@ -30,6 +32,6 @@ op-node genesis l2 \ --deployment-dir /contracts-bedrock/deployments/getting-started/ \ --outfile.l2 /app/genesis.json \ --outfile.rollup /app/rollup.json \ - --l1-rpc $L1_RPC + --l1-rpc $CERC_L1_RPC openssl rand -hex 32 > /app/jwt.txt diff --git a/app/data/config/fixturenet-optimism/l1-params.env b/app/data/config/fixturenet-optimism/l1-params.env index 93c58805..6b23c872 100644 --- a/app/data/config/fixturenet-optimism/l1-params.env +++ b/app/data/config/fixturenet-optimism/l1-params.env @@ -1,14 +1,14 @@ -# Change if pointing to an external L1 endpoint +# Defaults # L1 endpoint -L1_CHAIN_ID=1212 -L1_RPC="http://fixturenet-eth-geth-1:8545" -L1_HOST="fixturenet-eth-geth-1" -L1_PORT=8545 +DEFAULT_CERC_L1_CHAIN_ID=1212 +DEFAULT_CERC_L1_RPC="http://fixturenet-eth-geth-1:8545" +DEFAULT_CERC_L1_HOST="fixturenet-eth-geth-1" +DEFAULT_CERC_L1_PORT=8545 # Credentials for accounts on L1 to send balance to Optimism Proxy contract from # (enables them to do transactions on L2) -L1_ADDRESS= -L1_PRIV_KEY= -L1_ADDRESS_2= -L1_PRIV_KEY_2= +DEFAULT_CERC_L1_ADDRESS= +DEFAULT_CERC_L1_PRIV_KEY= +DEFAULT_CERC_L1_ADDRESS_2= +DEFAULT_CERC_L1_PRIV_KEY_2= diff --git a/app/data/config/fixturenet-optimism/optimism-contracts/run.sh b/app/data/config/fixturenet-optimism/optimism-contracts/run.sh index d4585d4a..c8d1911f 100755 --- a/app/data/config/fixturenet-optimism/optimism-contracts/run.sh +++ b/app/data/config/fixturenet-optimism/optimism-contracts/run.sh @@ -4,7 +4,15 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi -echo "Using L1 RPC endpoint ${L1_RPC}" +CERC_L1_CHAIN_ID="${CERC_L1_CHAIN_ID:-${DEFAULT_CERC_L1_CHAIN_ID}}" +CERC_L1_RPC="${CERC_L1_RPC:-${DEFAULT_CERC_L1_RPC}}" + +CERC_L1_ADDRESS="${CERC_L1_ADDRESS:-${DEFAULT_CERC_L1_ADDRESS}}" +CERC_L1_PRIV_KEY="${CERC_L1_PRIV_KEY:-${DEFAULT_CERC_L1_PRIV_KEY}}" +CERC_L1_ADDRESS_2="${CERC_L1_ADDRESS_2:-${DEFAULT_CERC_L1_ADDRESS_2}}" +CERC_L1_PRIV_KEY_2="${CERC_L1_PRIV_KEY_2:-${DEFAULT_CERC_L1_PRIV_KEY_2}}" + +echo "Using L1 RPC endpoint ${CERC_L1_RPC}" IMPORT_1="import './verify-contract-deployment'" IMPORT_2="import './rekey-json'" @@ -18,7 +26,7 @@ if ! grep -Fxq "$IMPORT_1" tasks/index.ts; then fi # Update the chainId in the hardhat config -sed -i "/getting-started/ {n; s/.*chainId.*/ chainId: $L1_CHAIN_ID,/}" hardhat.config.ts +sed -i "/getting-started/ {n; s/.*chainId.*/ chainId: $CERC_L1_CHAIN_ID,/}" hardhat.config.ts # Exit if a deployment already exists (on restarts) # Note: fixturenet-eth-geth currently starts fresh on a restart @@ -57,16 +65,16 @@ SEQUENCER_ADDRESS=$(echo "$KEYS_JSON" | jq -r '.Sequencer.address') # Read the private key of L1 accounts if [ -f /geth-accounts/accounts.csv ]; then echo "Using L1 account credentials from the mounted volume" - L1_ADDRESS=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 2) - L1_PRIV_KEY=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 3) - L1_ADDRESS_2=$(awk -F, 'NR==2{print $(NF-1)}' /geth-accounts/accounts.csv) - L1_PRIV_KEY_2=$(awk -F, 'NR==2{print $NF}' /geth-accounts/accounts.csv) + CERC_L1_ADDRESS=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 2) + CERC_L1_PRIV_KEY=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 3) + CERC_L1_ADDRESS_2=$(awk -F, 'NR==2{print $(NF-1)}' /geth-accounts/accounts.csv) + CERC_L1_PRIV_KEY_2=$(awk -F, 'NR==2{print $NF}' /geth-accounts/accounts.csv) else echo "Using L1 account credentials from env" fi # Select a finalized L1 block as the starting point for roll ups -until FINALIZED_BLOCK=$(cast block finalized --rpc-url "$L1_RPC"); do +until FINALIZED_BLOCK=$(cast block finalized --rpc-url "$CERC_L1_RPC"); do echo "Waiting for a finalized L1 block to exist, retrying after 10s" sleep 10 done @@ -78,22 +86,22 @@ L1_BLOCKTIMESTAMP=$(echo "$FINALIZED_BLOCK" | awk '/timestamp/{print $2}') echo "Selected L1 block ${L1_BLOCKNUMBER} as the starting block for roll ups" # Send balances to the above L2 addresses -yarn hardhat send-balance --to "${ADMIN_ADDRESS}" --amount 2 --private-key "${L1_PRIV_KEY}" --network getting-started -yarn hardhat send-balance --to "${PROPOSER_ADDRESS}" --amount 5 --private-key "${L1_PRIV_KEY}" --network getting-started -yarn hardhat send-balance --to "${BATCHER_ADDRESS}" --amount 1000 --private-key "${L1_PRIV_KEY}" --network getting-started +yarn hardhat send-balance --to "${ADMIN_ADDRESS}" --amount 2 --private-key "${CERC_L1_PRIV_KEY}" --network getting-started +yarn hardhat send-balance --to "${PROPOSER_ADDRESS}" --amount 5 --private-key "${CERC_L1_PRIV_KEY}" --network getting-started +yarn hardhat send-balance --to "${BATCHER_ADDRESS}" --amount 1000 --private-key "${CERC_L1_PRIV_KEY}" --network getting-started echo "Balances sent to L2 accounts" # Update the deployment config sed -i 's/"l2OutputOracleStartingTimestamp": TIMESTAMP/"l2OutputOracleStartingTimestamp": '"$L1_BLOCKTIMESTAMP"'/g' deploy-config/getting-started.json -jq --arg chainid "$L1_CHAIN_ID" '.l1ChainID = ($chainid | tonumber)' deploy-config/getting-started.json > tmp.json && mv tmp.json deploy-config/getting-started.json +jq --arg chainid "$CERC_L1_CHAIN_ID" '.l1ChainID = ($chainid | tonumber)' deploy-config/getting-started.json > tmp.json && mv tmp.json deploy-config/getting-started.json node update-config.js deploy-config/getting-started.json "$ADMIN_ADDRESS" "$PROPOSER_ADDRESS" "$BATCHER_ADDRESS" "$SEQUENCER_ADDRESS" "$L1_BLOCKHASH" echo "Updated the deployment config" # Create a .env file -echo "L1_RPC=$L1_RPC" > .env +echo "CERC_L1_RPC=$CERC_L1_RPC" > .env echo "PRIVATE_KEY_DEPLOYER=$ADMIN_PRIV_KEY" >> .env echo "Deploying the L1 smart contracts, this will take a while..." @@ -109,12 +117,12 @@ PROXY_ADDRESS=$(echo "$PROXY_JSON" | jq -r '.address') # Send balance to the above Proxy contract in L1 for reflecting balance in L2 # First account -yarn hardhat send-balance --to "${PROXY_ADDRESS}" --amount 1 --private-key "${L1_PRIV_KEY}" --network getting-started +yarn hardhat send-balance --to "${PROXY_ADDRESS}" --amount 1 --private-key "${CERC_L1_PRIV_KEY}" --network getting-started # Second account -yarn hardhat send-balance --to "${PROXY_ADDRESS}" --amount 1 --private-key "${L1_PRIV_KEY_2}" --network getting-started +yarn hardhat send-balance --to "${PROXY_ADDRESS}" --amount 1 --private-key "${CERC_L1_PRIV_KEY_2}" --network getting-started echo "Balance sent to Proxy L2 contract" echo "Use following accounts for transactions in L2:" -echo "${L1_ADDRESS}" -echo "${L1_ADDRESS_2}" +echo "${CERC_L1_ADDRESS}" +echo "${CERC_L1_ADDRESS_2}" echo "Done" diff --git a/app/data/config/fixturenet-optimism/run-op-batcher.sh b/app/data/config/fixturenet-optimism/run-op-batcher.sh index 3cab3e94..ff549213 100755 --- a/app/data/config/fixturenet-optimism/run-op-batcher.sh +++ b/app/data/config/fixturenet-optimism/run-op-batcher.sh @@ -4,6 +4,8 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi +CERC_L1_RPC="${CERC_L1_RPC:-${DEFAULT_CERC_L1_RPC}}" + # Get BACTHER_KEY from keys.json BATCHER_KEY=$(jq -r '.Batcher.privateKey' /l2-accounts/keys.json | tr -d '"') @@ -20,5 +22,5 @@ op-batcher \ --rpc.enable-admin \ --max-channel-duration=1 \ --target-l1-tx-size-bytes=2048 \ - --l1-eth-rpc=$L1_RPC \ + --l1-eth-rpc=$CERC_L1_RPC \ --private-key=$BATCHER_KEY diff --git a/app/data/config/fixturenet-optimism/run-op-node.sh b/app/data/config/fixturenet-optimism/run-op-node.sh index f495aeef..b7cc8680 100755 --- a/app/data/config/fixturenet-optimism/run-op-node.sh +++ b/app/data/config/fixturenet-optimism/run-op-node.sh @@ -4,6 +4,8 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi +CERC_L1_RPC="${CERC_L1_RPC:-${DEFAULT_CERC_L1_RPC}}" + # Get SEQUENCER KEY from keys.json SEQUENCER_KEY=$(jq -r '.Sequencer.privateKey' /l2-accounts/keys.json | tr -d '"') @@ -19,5 +21,5 @@ op-node \ --p2p.disable \ --rpc.enable-admin \ --p2p.sequencer.key=$SEQUENCER_KEY \ - --l1=$L1_RPC \ + --l1=$CERC_L1_RPC \ --l1.rpckind=any diff --git a/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh b/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh index f0513910..2e6ffcf7 100755 --- a/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh +++ b/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh @@ -4,30 +4,36 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi -echo "Using L2 RPC endpoint ${L2_GETH_RPC}" +CERC_L2_GETH_RPC="${CERC_L2_GETH_RPC:-${DEFAULT_CERC_L2_GETH_RPC}}" +CERC_PRIVATE_KEY_DEPLOYER="${CERC_PRIVATE_KEY_DEPLOYER:-${DEFAULT_CERC_PRIVATE_KEY_DEPLOYER}}" + +CERC_MOBYMASK_APP_BASE_URI="${CERC_MOBYMASK_APP_BASE_URI:-${DEFAULT_CERC_MOBYMASK_APP_BASE_URI}}" +CERC_DEPLOYED_CONTRACT="${CERC_DEPLOYED_CONTRACT:-${DEFAULT_CERC_DEPLOYED_CONTRACT}}" + +echo "Using L2 RPC endpoint ${CERC_L2_GETH_RPC}" if [ -f /geth-accounts/accounts.csv ]; then echo "Using L1 private key from the mounted volume" # Read the private key of L1 account to deploy contract - PRIVATE_KEY_DEPLOYER=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 3) + CERC_PRIVATE_KEY_DEPLOYER=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 3) else - echo "Using PRIVATE_KEY_DEPLOYER from env" + echo "Using CERC_PRIVATE_KEY_DEPLOYER from env" fi # Set the private key -jq --arg privateKey "$PRIVATE_KEY_DEPLOYER" '.privateKey = $privateKey' secrets-template.json > secrets.json +jq --arg privateKey "$CERC_PRIVATE_KEY_DEPLOYER" '.privateKey = $privateKey' secrets-template.json > secrets.json # Set the RPC URL -jq --arg rpcUrl "$L2_GETH_RPC" '.rpcUrl = $rpcUrl' secrets.json > secrets_updated.json && mv secrets_updated.json secrets.json +jq --arg rpcUrl "$CERC_L2_GETH_RPC" '.rpcUrl = $rpcUrl' secrets.json > secrets_updated.json && mv secrets_updated.json secrets.json # Set the MobyMask app base URI -jq --arg baseURI "$MOBYMASK_APP_BASE_URI" '.baseURI = $baseURI' secrets.json > secrets_updated.json && mv secrets_updated.json secrets.json +jq --arg baseURI "$CERC_MOBYMASK_APP_BASE_URI" '.baseURI = $baseURI' secrets.json > secrets_updated.json && mv secrets_updated.json secrets.json -export RPC_URL="${L2_GETH_RPC}" +export RPC_URL="${CERC_L2_GETH_RPC}" -# Check if DEPLOYED_CONTRACT environment variable set to skip contract deployment -if [[ -n "$DEPLOYED_CONTRACT" ]]; then - echo "DEPLOYED_CONTRACT is set to '$DEPLOYED_CONTRACT'" +# Check if CERC_DEPLOYED_CONTRACT environment variable set to skip contract deployment +if [ -n "$CERC_DEPLOYED_CONTRACT" ]; then + echo "CERC_DEPLOYED_CONTRACT is set to '$CERC_DEPLOYED_CONTRACT'" echo "Exiting without deploying contract" exit 0 fi @@ -53,7 +59,7 @@ fi # Wait until balance for deployer account is updated cd ../hardhat while true; do - ACCOUNT_BALANCE=$(yarn balance --network optimism "$PRIVATE_KEY_DEPLOYER" | grep ETH) + ACCOUNT_BALANCE=$(yarn balance --network optimism "$CERC_PRIVATE_KEY_DEPLOYER" | grep ETH) if [ "$ACCOUNT_BALANCE" != "0.0 ETH" ]; then echo "Account balance updated: $ACCOUNT_BALANCE" diff --git a/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh b/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh index 680e2e8a..fbe2fbf9 100755 --- a/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh +++ b/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh @@ -4,6 +4,11 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi +CERC_CHAIN_ID="${CERC_CHAIN_ID:-${DEFAULT_CERC_CHAIN_ID}}" +CERC_DEPLOYED_CONTRACT="${CERC_DEPLOYED_CONTRACT:-${DEFAULT_CERC_DEPLOYED_CONTRACT}}" +CERC_RELAY_NODES="${CERC_RELAY_NODES:-${DEFAULT_CERC_RELAY_NODES}}" +CERC_APP_WATCHER_URL="${CERC_APP_WATCHER_URL:-${DEFAULT_CERC_APP_WATCHER_URL}}" + # Use config from mounted volume if available (when running web-app along with watcher stack) if [ -f /server/config.json ]; then echo "Merging config for deployed contract from mounted volume" @@ -13,13 +18,13 @@ else echo "Setting deployed contract details from env" # Set config values from environment variables - jq --arg address "$DEPLOYED_CONTRACT" \ - --argjson chainId $CHAIN_ID \ - --argjson relayNodes "$RELAY_NODES" \ + jq --arg address "$CERC_DEPLOYED_CONTRACT" \ + --argjson chainId $CERC_CHAIN_ID \ + --argjson relayNodes "$CERC_RELAY_NODES" \ '.address = $address | .chainId = $chainId | .relayNodes = $relayNodes' \ /app/src/mobymask-app-config.json > /app/src/config.json fi -REACT_APP_WATCHER_URI="$APP_WATCHER_URL/graphql" npm run build +REACT_APP_WATCHER_URI="$CERC_APP_WATCHER_URL/graphql" npm run build serve -s build diff --git a/app/data/config/watcher-mobymask-v2/mobymask-params.env b/app/data/config/watcher-mobymask-v2/mobymask-params.env index a8db6b4a..9f967170 100644 --- a/app/data/config/watcher-mobymask-v2/mobymask-params.env +++ b/app/data/config/watcher-mobymask-v2/mobymask-params.env @@ -1,20 +1,22 @@ -# Change if pointing web app to external watcher endpoint -WATCHER_HOST="mobymask-watcher-server" -WATCHER_PORT=3001 -APP_WATCHER_URL="http://localhost:3001" +# Defaults + +# Watcher endpoint +DEFAULT_CERC_WATCHER_HOST="mobymask-watcher-server" +DEFAULT_CERC_WATCHER_PORT=3001 +DEFAULT_CERC_APP_WATCHER_URL="http://localhost:3001" # Base URI for mobymask-app (used for generating invite) -MOBYMASK_APP_BASE_URI="http://127.0.0.1:3002/#" +DEFAULT_CERC_MOBYMASK_APP_BASE_URI="http://127.0.0.1:3002/#" # Set to false for disabling watcher peer to send txs to L2 -ENABLE_PEER_L2_TXS=true +DEFAULT_CERC_ENABLE_PEER_L2_TXS=true # Set deployed MobyMask contract address to avoid deploying contract in stack # mobymask-app will use this contract address in config if run separately -DEPLOYED_CONTRACT= +DEFAULT_CERC_DEPLOYED_CONTRACT= # Chain ID is used by mobymask web-app for txs -CHAIN_ID=42069 +DEFAULT_CERC_CHAIN_ID=42069 # Set relay nodes to be used by web-apps -RELAY_NODES=["/ip4/127.0.0.1/tcp/9090/ws/p2p/12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t"] +DEFAULT_CERC_RELAY_NODES=["/ip4/127.0.0.1/tcp/9090/ws/p2p/12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t"] diff --git a/app/data/config/watcher-mobymask-v2/optimism-params.env b/app/data/config/watcher-mobymask-v2/optimism-params.env index 489dd879..6bdc7ea3 100644 --- a/app/data/config/watcher-mobymask-v2/optimism-params.env +++ b/app/data/config/watcher-mobymask-v2/optimism-params.env @@ -1,13 +1,13 @@ -# Change if pointing to an external optimism geth endpoint +# Defaults # L2 endpoints -L2_GETH_RPC="http://op-geth:8545" -L2_GETH_HOST="op-geth" -L2_GETH_PORT=8545 +DEFAULT_CERC_L2_GETH_RPC="http://op-geth:8545" +DEFAULT_CERC_L2_GETH_HOST="op-geth" +DEFAULT_CERC_L2_GETH_PORT=8545 -L2_NODE_HOST="op-node" -L2_NODE_PORT=8547 +DEFAULT_CERC_L2_NODE_HOST="op-node" +DEFAULT_CERC_L2_NODE_PORT=8547 # Credentials for accounts to perform txs on L2 -PRIVATE_KEY_DEPLOYER= -PRIVATE_KEY_PEER= +DEFAULT_CERC_PRIVATE_KEY_DEPLOYER= +DEFAULT_CERC_PRIVATE_KEY_PEER= diff --git a/app/data/config/watcher-mobymask-v2/start-server.sh b/app/data/config/watcher-mobymask-v2/start-server.sh index 5597850b..ee7b73c3 100755 --- a/app/data/config/watcher-mobymask-v2/start-server.sh +++ b/app/data/config/watcher-mobymask-v2/start-server.sh @@ -4,11 +4,17 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi -echo "Using L2 RPC endpoint ${L2_GETH_RPC}" +CERC_L2_GETH_RPC="${CERC_L2_GETH_RPC:-${DEFAULT_CERC_L2_GETH_RPC}}" +CERC_PRIVATE_KEY_PEER="${CERC_PRIVATE_KEY_PEER:-${DEFAULT_CERC_PRIVATE_KEY_PEER}}" + +CERC_ENABLE_PEER_L2_TXS="${CERC_ENABLE_PEER_L2_TXS:-${DEFAULT_CERC_ENABLE_PEER_L2_TXS}}" +CERC_DEPLOYED_CONTRACT="${CERC_DEPLOYED_CONTRACT:-${DEFAULT_CERC_DEPLOYED_CONTRACT}}" + +echo "Using L2 RPC endpoint ${CERC_L2_GETH_RPC}" # Use contract address from environment variable or set from config.json in mounted volume -if [ -n "$DEPLOYED_CONTRACT" ]; then - CONTRACT_ADDRESS="${DEPLOYED_CONTRACT}" +if [ -n "$CERC_DEPLOYED_CONTRACT" ]; then + CONTRACT_ADDRESS="${CERC_DEPLOYED_CONTRACT}" else # Assign deployed contract address from server config (created by mobymask container after deploying contract) CONTRACT_ADDRESS=$(jq -r '.address' /server/config.json | tr -d '"') @@ -17,19 +23,19 @@ fi if [ -f /geth-accounts/accounts.csv ]; then echo "Using L1 private key from the mounted volume" # Read the private key of L1 account for sending txs from peer - PRIVATE_KEY_PEER=$(awk -F, 'NR==2{print $NF}' /geth-accounts/accounts.csv) + CERC_PRIVATE_KEY_PEER=$(awk -F, 'NR==2{print $NF}' /geth-accounts/accounts.csv) else - echo "Using PRIVATE_KEY_PEER from env" + echo "Using CERC_PRIVATE_KEY_PEER from env" fi # Read in the config template TOML file and modify it WATCHER_CONFIG_TEMPLATE=$(cat environments/watcher-config-template.toml) WATCHER_CONFIG=$(echo "$WATCHER_CONFIG_TEMPLATE" | \ - sed -E "s/REPLACE_WITH_ENABLE_PEER_L2_TXS/${ENABLE_PEER_L2_TXS}/g; \ - s/REPLACE_WITH_PRIVATE_KEY_PEER/${PRIVATE_KEY_PEER}/g; \ + sed -E "s/REPLACE_WITH_CERC_ENABLE_PEER_L2_TXS/${CERC_ENABLE_PEER_L2_TXS}/g; \ + s/REPLACE_WITH_CERC_PRIVATE_KEY_PEER/${CERC_PRIVATE_KEY_PEER}/g; \ s/REPLACE_WITH_CONTRACT_ADDRESS/${CONTRACT_ADDRESS}/g; \ - s|REPLACE_WITH_L2_GETH_RPC_ENDPOINT|${L2_GETH_RPC}| ") + s|REPLACE_WITH_CERC_L2_GETH_RPC_ENDPOINT|${CERC_L2_GETH_RPC}| ") # Write the modified content to a new file echo "$WATCHER_CONFIG" > environments/local.toml diff --git a/app/data/config/watcher-mobymask-v2/test-app-start.sh b/app/data/config/watcher-mobymask-v2/test-app-start.sh index de6ccc7c..2f45da03 100755 --- a/app/data/config/watcher-mobymask-v2/test-app-start.sh +++ b/app/data/config/watcher-mobymask-v2/test-app-start.sh @@ -4,8 +4,10 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi -# Set relay nodes in config from RELAY_NODES environment variable -jq --argjson relayNodes "$RELAY_NODES" \ +CERC_RELAY_NODES="${CERC_RELAY_NODES:-${DEFAULT_CERC_RELAY_NODES}}" + +# Set relay nodes in config from CERC_RELAY_NODES environment variable +jq --argjson relayNodes "$CERC_RELAY_NODES" \ '.relayNodes = $relayNodes' \ ./src/test-app-config.json > ./src/config.json diff --git a/app/data/config/watcher-mobymask-v2/watcher-config-template.toml b/app/data/config/watcher-mobymask-v2/watcher-config-template.toml index c360ffed..843cdbfe 100644 --- a/app/data/config/watcher-mobymask-v2/watcher-config-template.toml +++ b/app/data/config/watcher-mobymask-v2/watcher-config-template.toml @@ -35,10 +35,10 @@ pubSubTopic = 'mobymask' peerIdFile = './peer-id.json' enableDebugInfo = true - enableL2Txs = REPLACE_WITH_ENABLE_PEER_L2_TXS + enableL2Txs = REPLACE_WITH_CERC_ENABLE_PEER_L2_TXS [server.p2p.peer.l2TxsConfig] - privateKey = 'REPLACE_WITH_PRIVATE_KEY_PEER' + privateKey = 'REPLACE_WITH_CERC_PRIVATE_KEY_PEER' contractAddress = 'REPLACE_WITH_CONTRACT_ADDRESS' [metrics] @@ -60,7 +60,7 @@ [upstream] [upstream.ethServer] gqlApiEndpoint = "http://ipld-eth-server:8083/graphql" - rpcProviderEndpoint = "REPLACE_WITH_L2_GETH_RPC_ENDPOINT" + rpcProviderEndpoint = "REPLACE_WITH_CERC_L2_GETH_RPC_ENDPOINT" blockDelayInMilliSecs = 60000 [upstream.cache] diff --git a/app/data/container-build/cerc-optimism-contracts/hardhat-tasks/send-balance.ts b/app/data/container-build/cerc-optimism-contracts/hardhat-tasks/send-balance.ts index 54615647..dd7065bc 100644 --- a/app/data/container-build/cerc-optimism-contracts/hardhat-tasks/send-balance.ts +++ b/app/data/container-build/cerc-optimism-contracts/hardhat-tasks/send-balance.ts @@ -8,7 +8,7 @@ task('send-balance', 'Sends Ether to a specified Ethereum account') .addParam('privateKey', 'The private key of the sender') .setAction(async ({ to, amount, privateKey }, {}) => { // Open the wallet using sender's private key - const provider = new ethers.providers.JsonRpcProvider(`${process.env.L1_RPC}`) + const provider = new ethers.providers.JsonRpcProvider(`${process.env.CERC_L1_RPC}`) const wallet = new ethers.Wallet(privateKey, provider) // Send amount to the specified address diff --git a/app/data/container-build/cerc-optimism-contracts/hardhat-tasks/verify-contract-deployment.ts b/app/data/container-build/cerc-optimism-contracts/hardhat-tasks/verify-contract-deployment.ts index 5b673ca1..340bc4f3 100644 --- a/app/data/container-build/cerc-optimism-contracts/hardhat-tasks/verify-contract-deployment.ts +++ b/app/data/container-build/cerc-optimism-contracts/hardhat-tasks/verify-contract-deployment.ts @@ -9,7 +9,7 @@ task( .addParam('transactionHash', 'Hash of the deployment transaction') .setAction(async ({ contract, transactionHash }, { ethers }) => { const provider = new ethers.providers.JsonRpcProvider( - `${process.env.L1_RPC}` + `${process.env.CERC_L1_RPC}` ) // Get the deployment tx receipt diff --git a/app/data/stacks/fixturenet-optimism/README.md b/app/data/stacks/fixturenet-optimism/README.md index 61ca97b3..502e3305 100644 --- a/app/data/stacks/fixturenet-optimism/README.md +++ b/app/data/stacks/fixturenet-optimism/README.md @@ -10,6 +10,8 @@ Clone required repositories: ```bash laconic-so --stack fixturenet-optimism setup-repositories + +# If this throws an error as a result of being already checked out to a branch/tag in a repo, remove the repositories mentioned below and re-run the command ``` Checkout to the required versions and branches in repos: @@ -109,7 +111,7 @@ docker volume rm $(docker volume ls -q --filter "name=.*fixturenet_geth_accounts docker volume rm $(docker volume ls -q --filter name=l2_geth_data) ``` - * Reuse the deployment command used in [Deploy](#deploy) to restart the stopped containers + * Re-run the deployment command used in [Deploy](#deploy) to restart the stopped containers ## Known Issues diff --git a/app/data/stacks/fixturenet-optimism/l2-only.md b/app/data/stacks/fixturenet-optimism/l2-only.md index a1c33717..821d16a8 100644 --- a/app/data/stacks/fixturenet-optimism/l2-only.md +++ b/app/data/stacks/fixturenet-optimism/l2-only.md @@ -10,6 +10,8 @@ Clone required repositories: ```bash laconic-so --stack fixturenet-optimism setup-repositories --exclude cerc-io/go-ethereum + +# If this throws an error as a result of being already checked out to a branch/tag in a repo, remove the repositories mentioned below and re-run the command ``` Checkout to the required versions and branches in repos: @@ -35,16 +37,29 @@ This should create the required docker images in the local image registry: ## Deploy -Update the [l1-params.env](../../config/fixturenet-optimism/l1-params.env) file with L1 endpoint (`L1_RPC`, `L1_HOST` and `L1_PORT`) and other params +Create and update an env file to be used in the next step ([defaults](../../config/fixturenet-optimism/l1-params.env)): -* NOTE: - * Stack Orchestrator needs to be run in [`dev`](/docs/CONTRIBUTING.md#install-developer-mode) mode to be able to edit the env file - * If L1 is running on the host machine, use `host.docker.internal` as the hostname to access the host port + ```bash + # External L1 endpoint + CERC_L1_CHAIN_ID= + CERC_L1_RPC= + CERC_L1_HOST= + CERC_L1_PORT= + + # Credentials for accounts on L1 to send balance to Optimism Proxy contract from + # (enables them to do transactions on L2) + CERC_L1_ADDRESS= + CERC_L1_PRIV_KEY= + CERC_L1_ADDRESS_2= + CERC_L1_PRIV_KEY_2= + ``` + +* NOTE: If L1 is running on the host machine, use `host.docker.internal` as the hostname to access the host port Deploy the stack: ```bash -laconic-so --stack fixturenet-optimism deploy up --include fixturenet-optimism +laconic-so --stack fixturenet-optimism deploy --include fixturenet-optimism --env-file up ``` The `fixturenet-optimism-contracts` service may take a while (`~15 mins`) to complete running as it: @@ -69,7 +84,7 @@ docker logs -f Stop all services running in the background: ```bash -laconic-so --stack fixturenet-optimism deploy down --include fixturenet-optimism +laconic-so --stack fixturenet-optimism deploy --include fixturenet-optimism down ``` Clear volumes created by this stack: @@ -84,4 +99,4 @@ docker volume rm $(docker volume ls -q --filter "name=.*fixturenet_geth_accounts ## Troubleshooting -See [Troubleshooting](./README.md#troubleshooting) \ No newline at end of file +See [Troubleshooting](./README.md#troubleshooting) diff --git a/app/data/stacks/mobymask-v2/README.md b/app/data/stacks/mobymask-v2/README.md index 54f66239..ab36f302 100644 --- a/app/data/stacks/mobymask-v2/README.md +++ b/app/data/stacks/mobymask-v2/README.md @@ -1,10 +1,12 @@ # MobyMask v2 watcher -Instructions to setup and deploy an end-to-end MobyMask v2 stack ([L1](../fixturenet-eth/) + [L2](../fixturenet-optimism/) chains + watcher) using [laconic-stack-orchestrator](/README.md#install) +Instructions to setup and deploy an end-to-end MobyMask v2 stack ([L1](../fixturenet-eth/) + [L2](../fixturenet-optimism/) chains + watcher + web-app(s)) using [laconic-stack-orchestrator](/README.md#install) We support running just the watcher part of stack, given an external L2 Optimism endpoint. Follow [mobymask-only](./mobymask-only.md) for the same. +We also support running just the web-app(s), given external watcher GQL (for mobymask-app) and relay node endpoints. Follow [web-apps.md](./web-apps.md) for the same. + ## Setup Clone required repositories: diff --git a/app/data/stacks/mobymask-v2/mobymask-only.md b/app/data/stacks/mobymask-v2/mobymask-only.md index 74290151..27073034 100644 --- a/app/data/stacks/mobymask-v2/mobymask-only.md +++ b/app/data/stacks/mobymask-v2/mobymask-only.md @@ -10,6 +10,8 @@ Clone required repositories: ```bash laconic-so --stack mobymask-v2 setup-repositories --include cerc-io/MobyMask,cerc-io/watcher-ts + +# If this throws an error as a result of being already checked out to a branch/tag in a repo, remove the repositories mentioned below and re-run the command ``` Checkout to the required versions and branches in repos: @@ -36,19 +38,38 @@ This should create the required docker images in the local image registry ### Configuration -* In [mobymask-params.env](../../config/watcher-mobymask-v2/mobymask-params.env) file set `DEPLOYED_CONTRACT` to existing deployed mobymask contract address - * Setting `DEPLOYED_CONTRACT` will skip contract deployment when running stack - * `ENABLE_PEER_L2_TXS` is used to enable/disable sending txs to L2 chain from watcher peer. -* Update the [optimism-params.env](../../config/watcher-mobymask-v2/optimism-params.env) file with Optimism endpoints and other params for the Optimism running separately - * `PRIVATE_KEY_PEER` is used by watcher peer to send txs to L2 chain -* NOTE: - * Stack Orchestrator needs to be run in [`dev`](/docs/CONTRIBUTING.md#install-developer-mode) mode to be able to edit the env file - * If Optimism is running on the host machine, use `host.docker.internal` as the hostname to access the host port +Create and update an env file to be used in the next step ([defaults](../../config/watcher-mobymask-v2/)): + + ```bash + # External L2 endpoints + CERC_L2_GETH_RPC= + CERC_L2_GETH_HOST= + CERC_L2_GETH_PORT= + + CERC_L2_NODE_HOST= + CERC_L2_NODE_PORT= + + # Credentials for accounts to perform txs on L2 + CERC_PRIVATE_KEY_DEPLOYER= + CERC_PRIVATE_KEY_PEER= + + # Base URI for mobymask-app + # (used for generating a root invite link after deploying the contract) + CERC_MOBYMASK_APP_BASE_URI="http://127.0.0.1:3002/#" + + # Set to false for disabling watcher peer to send txs to L2 + CERC_ENABLE_PEER_L2_TXS=true + + # (Optional) Set already deployed MobyMask contract address to avoid deploying contract in the stack + CERC_DEPLOYED_CONTRACT= + ``` + +* NOTE: If Optimism is running on the host machine, use `host.docker.internal` as the hostname to access the host port ### Deploy the stack ```bash -laconic-so --stack mobymask-v2 deploy --include watcher-mobymask-v2 up +laconic-so --stack mobymask-v2 deploy --include watcher-mobymask-v2 --env-file up ``` To list down and monitor the running containers: @@ -63,10 +84,22 @@ docker ps docker logs -f ``` +The watcher endpoint is exposed on host port `3001` and the relay node endpoint is exposed on host port `9090` + +Check the logs of the deployment container to get the deployed contract's address and generated root invite link: + +```bash +docker logs -f $(docker ps -aq --filter name="mobymask-1") +``` + ## Tests See [Tests](./README.md#tests) +## Web Apps + +For deploying the web-app(s) separately after deploying the watcher, follow [web-apps.md](./web-apps.md) + ## Clean up Stop all services running in the background: diff --git a/app/data/stacks/mobymask-v2/web-apps.md b/app/data/stacks/mobymask-v2/web-apps.md index 052a7cb7..2c1ed253 100644 --- a/app/data/stacks/mobymask-v2/web-apps.md +++ b/app/data/stacks/mobymask-v2/web-apps.md @@ -10,6 +10,8 @@ Clone required repositories: ```bash laconic-so --stack mobymask-v2 setup-repositories --include cerc-io/react-peer,cerc-io/mobymask-ui + +# If this throws an error as a result of being already checked out to a branch/tag in a repo, remove the repositories mentioned below and re-run the command ``` Checkout to the required versions and branches in repos: @@ -36,36 +38,61 @@ This should create the required docker images in the local image registry ### Configuration -* Update the [mobymask-params.env](../../config/watcher-mobymask-v2/mobymask-params.env) file with watcher endpoints and other params required by the web-apps - * `WATCHER_HOST` and `WATCHER_PORT` is used to check if watcher is up before building and deploying mobymask-app - * `APP_WATCHER_URL` is used by mobymask-app to make GQL queries - * `DEPLOYED_CONTRACT` and `CHAIN_ID` is used by mobymask-app in app config when creating messgaes for L2 txs - * `RELAY_NODES` is used by the web-apps to connect to the relay nodes (run in watcher) -* NOTE: - * Stack Orchestrator needs to be run in [`dev`](/docs/CONTRIBUTING.md#install-developer-mode) mode to be able to edit the env file - * If watcher is running on the host machine, use `host.docker.internal` as the hostname to access the host port +Create and update an env file to be used in the next step ([defaults](../../config/watcher-mobymask-v2/mobymask-params.env)): + + ```bash + # Set relay nodes to be used by the web-app + CERC_RELAY_NODES=["/ip4/127.0.0.1/tcp/9090/ws/p2p/12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t"] + + # Also add if running MobyMask app: + + # External watcher endpoint (to check if watcher is up) + CERC_WATCHER_HOST= + CERC_WATCHER_PORT= + + # Watcher endpoint used by the app for GQL queries + CERC_APP_WATCHER_URL="http://127.0.0.1:3001" + + # Set deployed MobyMask contract address to be used in MobyMask app's config + CERC_DEPLOYED_CONTRACT= + + # L2 Chain ID used by mobymask web-app for L2 txs + CERC_CHAIN_ID=42069 + ``` + +* NOTE: If watcher is running on the host machine, use `host.docker.internal` as the hostname to access the host port ### Deploy the stack For running mobymask-app ```bash -laconic-so --stack mobymask-v2 deploy --include mobymask-app up +laconic-so --stack mobymask-v2 deploy --include mobymask-app --env-file up + +# Runs on host port 3002 ``` For running peer-test-app ```bash -laconic-so --stack mobymask-v2 deploy --include peer-test-app up +laconic-so --stack mobymask-v2 deploy --include peer-test-app --env-file up + +# Runs on host port 3003 ``` To list down and monitor the running containers: ```bash +laconic-so --stack mobymask-v2 deploy --include [mobymask-app | peer-test-app] ps + docker ps # Check logs for a container docker logs -f ``` +## Demo + +Follow the [demo](./demo.md) to try out the MobyMask app with L2 chain + ## Clean up Stop all services running in the background: diff --git a/app/deploy_system.py b/app/deploy_system.py index 9371a2f8..3c347fdf 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -32,11 +32,12 @@ from .util import include_exclude_check, get_parsed_stack_config @click.command() @click.option("--include", help="only start these components") @click.option("--exclude", help="don\'t start these components") +@click.option("--env-file", help="env file to be used") @click.option("--cluster", help="specify a non-default cluster name") @click.argument('command', required=True) # help: command: up|down|ps @click.argument('extra_args', nargs=-1) # help: command: up|down|ps @click.pass_context -def command(ctx, include, exclude, cluster, command, extra_args): +def command(ctx, include, exclude, env_file, cluster, command, extra_args): '''deploy a stack''' # TODO: implement option exclusion and command value constraint lost with the move from argparse to click @@ -51,7 +52,7 @@ def command(ctx, include, exclude, cluster, command, extra_args): cluster_context = _make_cluster_context(ctx.obj, include, exclude, cluster) # See: https://gabrieldemarmiesse.github.io/python-on-whales/sub-commands/compose/ - docker = DockerClient(compose_files=cluster_context.compose_files, compose_project_name=cluster_context.cluster) + docker = DockerClient(compose_files=cluster_context.compose_files, compose_project_name=cluster_context.cluster, compose_env_file=env_file) extra_args_list = list(extra_args) or None From 6e33bd47e2929f8a713215e0f076d3b8dd3f20be Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 11 Apr 2023 07:20:38 -0600 Subject: [PATCH 0400/1010] Fix syntax errors (#314) Former-commit-id: 7c6c46febb97f7ed93efa00f170cc143cf3e70d7 --- .../cerc-laconic-console-host/apply-webapp-config.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/data/container-build/cerc-laconic-console-host/apply-webapp-config.sh b/app/data/container-build/cerc-laconic-console-host/apply-webapp-config.sh index a453cc87..d01b655d 100755 --- a/app/data/container-build/cerc-laconic-console-host/apply-webapp-config.sh +++ b/app/data/container-build/cerc-laconic-console-host/apply-webapp-config.sh @@ -8,11 +8,11 @@ if [[ $# -ne 2 ]]; then fi config_file_name=$1 webapp_files_dir=$2 -if ![[ -f ${config_file_name} ]]; then +if ! [[ -f ${config_file_name} ]]; then echo "Config file ${config_file_name} does not exist" >&2 exit 1 fi -if ![[ -d ${webapp_files_dir} ]]; then +if ! [[ -d ${webapp_files_dir} ]]; then echo "Webapp directory ${webapp_files_dir} does not exist" >&2 exit 1 fi From 80c16d2cede98217d784e10777f2aff8a0c3548e Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Tue, 11 Apr 2023 15:05:08 -0500 Subject: [PATCH 0401/1010] Update for latest act_runner. (#316) Former-commit-id: c7c3cbde8ee4b0cea5833fde7e3db12eb22c34fe --- app/data/container-build/cerc-act-runner-task-executor/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/container-build/cerc-act-runner-task-executor/build.sh b/app/data/container-build/cerc-act-runner-task-executor/build.sh index 843e86af..2bfb3bf9 100755 --- a/app/data/container-build/cerc-act-runner-task-executor/build.sh +++ b/app/data/container-build/cerc-act-runner-task-executor/build.sh @@ -1,3 +1,3 @@ #!/usr/bin/env bash # Build a local version of the task executor for act-runner -docker build -t cerc/act-runner-task-executor:local -f ${CERC_REPO_BASE_DIR}/act_runner/Dockerfile.task-executor ${CERC_REPO_BASE_DIR}/act_runner +docker build -t cerc/act-runner-task-executor:local -f ${CERC_REPO_BASE_DIR}/hosting/gitea/Dockerfile.task-executor ${CERC_REPO_BASE_DIR}/hosting From 5c6fe825fc8b2bc35b57f149759be4b69819a9c7 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 12 Apr 2023 06:32:40 -0600 Subject: [PATCH 0402/1010] Add comment to spec doc Former-commit-id: 249893f5d96decc6ff656d7b1e3c5147a94c2d5a --- docs/spec.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/spec.md b/docs/spec.md index 7bf038cb..ad6ed3c9 100644 --- a/docs/spec.md +++ b/docs/spec.md @@ -1,5 +1,7 @@ # Specification +(note this page is out of date) + ## Implementation From 8b11070870e0e9ad34c736aa16b5de289b464c24 Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Wed, 12 Apr 2023 18:17:13 +0530 Subject: [PATCH 0403/1010] Configuration fixes for mobymask-v2 stack for multiple deployments (#318) * Fix contract deployment script in fixturenet-optimism stack * Configure relay node's announce domain from env * Configure relay peers list for the relay node from env * Create and use peer ids from a mounted volume * Fix command to create watcher config * Fix mobymask-app deployment script Former-commit-id: 882f0b16aacd847570de9e6a506cdf74ef6e6f14 --- .gitignore | 2 +- .../compose/docker-compose-mobymask-app.yml | 2 ++ .../compose/docker-compose-peer-test-app.yml | 4 +++ .../docker-compose-watcher-mobymask-v2.yml | 7 ++-- .../optimism-contracts/run.sh | 2 +- .../mobymask-app-config.json | 4 +-- .../watcher-mobymask-v2/mobymask-app-start.sh | 32 ++++++++++++------- .../watcher-mobymask-v2/mobymask-params.env | 10 ++++-- .../config/watcher-mobymask-v2/peer-id.json | 5 --- app/data/config/watcher-mobymask-v2/peer.env | 1 - .../config/watcher-mobymask-v2/relay-id.json | 5 --- .../watcher-mobymask-v2/start-server.sh | 32 +++++++++++++++++-- .../watcher-mobymask-v2/test-app-config.json | 4 +-- .../watcher-mobymask-v2/test-app-start.sh | 10 +++++- .../watcher-config-template.toml | 9 +++--- app/data/stacks/mobymask-v2/README.md | 4 +-- app/data/stacks/mobymask-v2/mobymask-only.md | 10 ++++-- app/data/stacks/mobymask-v2/web-apps.md | 10 +++--- 18 files changed, 103 insertions(+), 50 deletions(-) delete mode 100644 app/data/config/watcher-mobymask-v2/peer-id.json delete mode 100644 app/data/config/watcher-mobymask-v2/peer.env delete mode 100644 app/data/config/watcher-mobymask-v2/relay-id.json diff --git a/.gitignore b/.gitignore index a1dcd886..4b30a1d3 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,4 @@ laconic-so laconic_stack_orchestrator.egg-info __pycache__ *~ - +build diff --git a/app/data/compose/docker-compose-mobymask-app.yml b/app/data/compose/docker-compose-mobymask-app.yml index 1cd4f9ab..df14d7db 100644 --- a/app/data/compose/docker-compose-mobymask-app.yml +++ b/app/data/compose/docker-compose-mobymask-app.yml @@ -22,6 +22,7 @@ services: - ../config/wait-for-it.sh:/app/wait-for-it.sh - ../config/watcher-mobymask-v2/mobymask-app-config.json:/app/src/mobymask-app-config.json - ../config/watcher-mobymask-v2/mobymask-app-start.sh:/app/mobymask-app-start.sh + - peers_ids:/peers - mobymask_deployment:/server ports: - "0.0.0.0:3002:3000" @@ -37,3 +38,4 @@ services: volumes: mobymask_deployment: + peers_ids: diff --git a/app/data/compose/docker-compose-peer-test-app.yml b/app/data/compose/docker-compose-peer-test-app.yml index c0cc68cb..7d1b89d6 100644 --- a/app/data/compose/docker-compose-peer-test-app.yml +++ b/app/data/compose/docker-compose-peer-test-app.yml @@ -14,6 +14,7 @@ services: volumes: - ../config/watcher-mobymask-v2/test-app-config.json:/app/packages/test-app/src/test-app-config.json - ../config/watcher-mobymask-v2/test-app-start.sh:/app/packages/test-app/test-app-start.sh + - peers_ids:/peers ports: - "0.0.0.0:3003:3000" healthcheck: @@ -24,3 +25,6 @@ services: start_period: 10s extra_hosts: - "host.docker.internal:host-gateway" + +volumes: + peers_ids: diff --git a/app/data/compose/docker-compose-watcher-mobymask-v2.yml b/app/data/compose/docker-compose-watcher-mobymask-v2.yml index 3af4eccb..601d13b6 100644 --- a/app/data/compose/docker-compose-watcher-mobymask-v2.yml +++ b/app/data/compose/docker-compose-watcher-mobymask-v2.yml @@ -70,15 +70,15 @@ services: CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} CERC_L2_GETH_RPC: ${CERC_L2_GETH_RPC} CERC_PRIVATE_KEY_PEER: ${CERC_PRIVATE_KEY_PEER} + CERC_RELAY_PEERS: ${CERC_RELAY_PEERS} + CERC_RELAY_ANNOUNCE_DOMAIN: ${CERC_RELAY_ANNOUNCE_DOMAIN} CERC_ENABLE_PEER_L2_TXS: ${CERC_ENABLE_PEER_L2_TXS} CERC_DEPLOYED_CONTRACT: ${CERC_DEPLOYED_CONTRACT} command: ["sh", "start-server.sh"] volumes: - ../config/watcher-mobymask-v2/watcher-config-template.toml:/app/packages/mobymask-v2-watcher/environments/watcher-config-template.toml - - ../config/watcher-mobymask-v2/peer.env:/app/packages/peer/.env - - ../config/watcher-mobymask-v2/relay-id.json:/app/packages/mobymask-v2-watcher/relay-id.json - - ../config/watcher-mobymask-v2/peer-id.json:/app/packages/mobymask-v2-watcher/peer-id.json - ../config/watcher-mobymask-v2/start-server.sh:/app/packages/mobymask-v2-watcher/start-server.sh + - peers_ids:/app/packages/mobymask-v2-watcher/peers - mobymask_deployment:/server - fixturenet_geth_accounts:/geth-accounts:ro # Expose GQL, metrics and relay node ports @@ -97,5 +97,6 @@ services: volumes: mobymask_watcher_db_data: + peers_ids: mobymask_deployment: fixturenet_geth_accounts: diff --git a/app/data/config/fixturenet-optimism/optimism-contracts/run.sh b/app/data/config/fixturenet-optimism/optimism-contracts/run.sh index c8d1911f..a256ea64 100755 --- a/app/data/config/fixturenet-optimism/optimism-contracts/run.sh +++ b/app/data/config/fixturenet-optimism/optimism-contracts/run.sh @@ -101,7 +101,7 @@ node update-config.js deploy-config/getting-started.json "$ADMIN_ADDRESS" "$PROP echo "Updated the deployment config" # Create a .env file -echo "CERC_L1_RPC=$CERC_L1_RPC" > .env +echo "L1_RPC=$CERC_L1_RPC" > .env echo "PRIVATE_KEY_DEPLOYER=$ADMIN_PRIV_KEY" >> .env echo "Deploying the L1 smart contracts, this will take a while..." diff --git a/app/data/config/watcher-mobymask-v2/mobymask-app-config.json b/app/data/config/watcher-mobymask-v2/mobymask-app-config.json index 2ccb816d..ed913b51 100644 --- a/app/data/config/watcher-mobymask-v2/mobymask-app-config.json +++ b/app/data/config/watcher-mobymask-v2/mobymask-app-config.json @@ -1,8 +1,6 @@ { "name": "MobyMask", - "relayNodes": [ - "/ip4/127.0.0.1/tcp/9090/ws/p2p/12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t" - ], + "relayNodes": [], "peer": { "enableDebugInfo": true } diff --git a/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh b/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh index fbe2fbf9..c494ed5c 100755 --- a/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh +++ b/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh @@ -9,22 +9,32 @@ CERC_DEPLOYED_CONTRACT="${CERC_DEPLOYED_CONTRACT:-${DEFAULT_CERC_DEPLOYED_CONTRA CERC_RELAY_NODES="${CERC_RELAY_NODES:-${DEFAULT_CERC_RELAY_NODES}}" CERC_APP_WATCHER_URL="${CERC_APP_WATCHER_URL:-${DEFAULT_CERC_APP_WATCHER_URL}}" +# If not set (or []), check the mounted volume for relay peer id +if [ -z "$CERC_RELAY_NODES" ] || [ "$CERC_RELAY_NODES" = "[]" ]; then + echo "CERC_RELAY_NODES not provided, taking from the mounted volume" + CERC_RELAY_NODES="[\"/ip4/127.0.0.1/tcp/9090/ws/p2p/$(jq -r '.id' /peers/relay-id.json)\"]" +fi + +echo "Using CERC_RELAY_NODES $CERC_RELAY_NODES" + # Use config from mounted volume if available (when running web-app along with watcher stack) if [ -f /server/config.json ]; then - echo "Merging config for deployed contract from mounted volume" - # Merging config files to get deployed contract address - jq -s '.[0] * .[1]' /app/src/mobymask-app-config.json /server/config.json > /app/src/config.json -else - echo "Setting deployed contract details from env" + echo "Taking config for deployed contract from mounted volume" - # Set config values from environment variables - jq --arg address "$CERC_DEPLOYED_CONTRACT" \ - --argjson chainId $CERC_CHAIN_ID \ - --argjson relayNodes "$CERC_RELAY_NODES" \ - '.address = $address | .chainId = $chainId | .relayNodes = $relayNodes' \ - /app/src/mobymask-app-config.json > /app/src/config.json + # Get deployed contract address and chain id + CERC_DEPLOYED_CONTRACT=$(jq -r '.address' /server/config.json | tr -d '"') + CERC_CHAIN_ID=$(jq -r '.chainId' /server/config.json) +else + echo "Taking deployed contract details from env" fi +# Export config values in a json file +jq --arg address "$CERC_DEPLOYED_CONTRACT" \ + --argjson chainId "$CERC_CHAIN_ID" \ + --argjson relayNodes "$CERC_RELAY_NODES" \ + '.address = $address | .chainId = $chainId | .relayNodes = $relayNodes' \ + /app/src/mobymask-app-config.json > /app/src/config.json + REACT_APP_WATCHER_URI="$CERC_APP_WATCHER_URL/graphql" npm run build serve -s build diff --git a/app/data/config/watcher-mobymask-v2/mobymask-params.env b/app/data/config/watcher-mobymask-v2/mobymask-params.env index 9f967170..22681036 100644 --- a/app/data/config/watcher-mobymask-v2/mobymask-params.env +++ b/app/data/config/watcher-mobymask-v2/mobymask-params.env @@ -5,6 +5,12 @@ DEFAULT_CERC_WATCHER_HOST="mobymask-watcher-server" DEFAULT_CERC_WATCHER_PORT=3001 DEFAULT_CERC_APP_WATCHER_URL="http://localhost:3001" +# Set of relay peers to connect to from the relay node +DEFAULT_CERC_RELAY_PEERS=[] + +# Domain to be used in the relay node's announce address +DEFAULT_CERC_RELAY_ANNOUNCE_DOMAIN= + # Base URI for mobymask-app (used for generating invite) DEFAULT_CERC_MOBYMASK_APP_BASE_URI="http://127.0.0.1:3002/#" @@ -18,5 +24,5 @@ DEFAULT_CERC_DEPLOYED_CONTRACT= # Chain ID is used by mobymask web-app for txs DEFAULT_CERC_CHAIN_ID=42069 -# Set relay nodes to be used by web-apps -DEFAULT_CERC_RELAY_NODES=["/ip4/127.0.0.1/tcp/9090/ws/p2p/12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t"] +# Set of relay nodes to be used by web-apps +DEFAULT_CERC_RELAY_NODES=[] diff --git a/app/data/config/watcher-mobymask-v2/peer-id.json b/app/data/config/watcher-mobymask-v2/peer-id.json deleted file mode 100644 index ceb55fc0..00000000 --- a/app/data/config/watcher-mobymask-v2/peer-id.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "id": "12D3KooWK6myjc8r1KBnfP9igp31qJkPaVfsKDjKrjoSefV5SDEo", - "privKey": "CAESQJMHbMaH+UEOtjGOzXYtoPO/cdHakCtN1hcnknIWzx/6ie1lxb+8kfzBjwt7apfj8fHlTCYSIVK8Q2AWu9a2h3g=", - "pubKey": "CAESIIntZcW/vJH8wY8Le2qX4/Hx5UwmEiFSvENgFrvWtod4" -} diff --git a/app/data/config/watcher-mobymask-v2/peer.env b/app/data/config/watcher-mobymask-v2/peer.env deleted file mode 100644 index 4cce4d9a..00000000 --- a/app/data/config/watcher-mobymask-v2/peer.env +++ /dev/null @@ -1 +0,0 @@ -RELAY="/ip4/127.0.0.1/tcp/9090/ws/p2p/12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t" diff --git a/app/data/config/watcher-mobymask-v2/relay-id.json b/app/data/config/watcher-mobymask-v2/relay-id.json deleted file mode 100644 index d7edc6dc..00000000 --- a/app/data/config/watcher-mobymask-v2/relay-id.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "id": "12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t", - "privKey": "CAESQGsqG5o4VlWJZM9XlA3MjabyZOXWQ2MLZU5AhBQsjXGt9iSlGtTuNOrHX5xSRgLBxLuMoqWsjGxE/dDB9c46RI8=", - "pubKey": "CAESIPYkpRrU7jTqx1+cUkYCwcS7jKKlrIxsRP3QwfXOOkSP" -} diff --git a/app/data/config/watcher-mobymask-v2/start-server.sh b/app/data/config/watcher-mobymask-v2/start-server.sh index ee7b73c3..b5a3518e 100755 --- a/app/data/config/watcher-mobymask-v2/start-server.sh +++ b/app/data/config/watcher-mobymask-v2/start-server.sh @@ -7,11 +7,34 @@ fi CERC_L2_GETH_RPC="${CERC_L2_GETH_RPC:-${DEFAULT_CERC_L2_GETH_RPC}}" CERC_PRIVATE_KEY_PEER="${CERC_PRIVATE_KEY_PEER:-${DEFAULT_CERC_PRIVATE_KEY_PEER}}" +CERC_RELAY_PEERS="${CERC_RELAY_PEERS:-${DEFAULT_CERC_RELAY_PEERS}}" +CERC_RELAY_ANNOUNCE_DOMAIN="${CERC_RELAY_ANNOUNCE_DOMAIN:-${DEFAULT_CERC_RELAY_ANNOUNCE_DOMAIN}}" CERC_ENABLE_PEER_L2_TXS="${CERC_ENABLE_PEER_L2_TXS:-${DEFAULT_CERC_ENABLE_PEER_L2_TXS}}" CERC_DEPLOYED_CONTRACT="${CERC_DEPLOYED_CONTRACT:-${DEFAULT_CERC_DEPLOYED_CONTRACT}}" echo "Using L2 RPC endpoint ${CERC_L2_GETH_RPC}" +# Check for peer ids in ./peers folder, create if not present +if [ -f ./peers/relay-id.json ]; then + echo "Using peer id for relay node from the mounted volume" +else + echo "Creating a new peer id for relay node" + cd ../peer + yarn create-peer -f ../mobymask-v2-watcher/peers/relay-id.json + cd ../mobymask-v2-watcher +fi + +if [ -f ./peers/peer-id.json ]; then + echo "Using peer id for peer node from the mounted volume" +else + echo "Creating a new peer id for peer node" + cd ../peer + yarn create-peer -f ../mobymask-v2-watcher/peers/peer-id.json + cd ../mobymask-v2-watcher +fi + +CERC_RELAY_MULTIADDR="/dns4/mobymask-watcher-server/tcp/9090/ws/p2p/$(jq -r '.id' ./peers/relay-id.json)" + # Use contract address from environment variable or set from config.json in mounted volume if [ -n "$CERC_DEPLOYED_CONTRACT" ]; then CONTRACT_ADDRESS="${CERC_DEPLOYED_CONTRACT}" @@ -28,11 +51,13 @@ else echo "Using CERC_PRIVATE_KEY_PEER from env" fi - # Read in the config template TOML file and modify it WATCHER_CONFIG_TEMPLATE=$(cat environments/watcher-config-template.toml) WATCHER_CONFIG=$(echo "$WATCHER_CONFIG_TEMPLATE" | \ - sed -E "s/REPLACE_WITH_CERC_ENABLE_PEER_L2_TXS/${CERC_ENABLE_PEER_L2_TXS}/g; \ + sed -E "s|REPLACE_WITH_CERC_RELAY_PEERS|${CERC_RELAY_PEERS}|g; \ + s/REPLACE_WITH_CERC_RELAY_ANNOUNCE_DOMAIN/${CERC_RELAY_ANNOUNCE_DOMAIN}/g; \ + s|REPLACE_WITH_CERC_RELAY_MULTIADDR|${CERC_RELAY_MULTIADDR}|g; \ + s/REPLACE_WITH_CERC_ENABLE_PEER_L2_TXS/${CERC_ENABLE_PEER_L2_TXS}/g; \ s/REPLACE_WITH_CERC_PRIVATE_KEY_PEER/${CERC_PRIVATE_KEY_PEER}/g; \ s/REPLACE_WITH_CONTRACT_ADDRESS/${CONTRACT_ADDRESS}/g; \ s|REPLACE_WITH_CERC_L2_GETH_RPC_ENDPOINT|${CERC_L2_GETH_RPC}| ") @@ -40,5 +65,8 @@ WATCHER_CONFIG=$(echo "$WATCHER_CONFIG_TEMPLATE" | \ # Write the modified content to a new file echo "$WATCHER_CONFIG" > environments/local.toml +# Write the relay node's multiaddr to /app/packages/peer/.env for running tests +echo "RELAY=\"$CERC_RELAY_MULTIADDR\"" > /app/packages/peer/.env + echo 'yarn server' yarn server diff --git a/app/data/config/watcher-mobymask-v2/test-app-config.json b/app/data/config/watcher-mobymask-v2/test-app-config.json index 3b00674f..cce15fd8 100644 --- a/app/data/config/watcher-mobymask-v2/test-app-config.json +++ b/app/data/config/watcher-mobymask-v2/test-app-config.json @@ -1,7 +1,5 @@ { - "relayNodes": [ - "/ip4/127.0.0.1/tcp/9090/ws/p2p/12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t" - ], + "relayNodes": [], "peer": { "enableDebugInfo": true } diff --git a/app/data/config/watcher-mobymask-v2/test-app-start.sh b/app/data/config/watcher-mobymask-v2/test-app-start.sh index 2f45da03..ef7aa539 100755 --- a/app/data/config/watcher-mobymask-v2/test-app-start.sh +++ b/app/data/config/watcher-mobymask-v2/test-app-start.sh @@ -6,7 +6,15 @@ fi CERC_RELAY_NODES="${CERC_RELAY_NODES:-${DEFAULT_CERC_RELAY_NODES}}" -# Set relay nodes in config from CERC_RELAY_NODES environment variable +# If not set (or []), check the mounted volume for relay peer id +if [ -z "$CERC_RELAY_NODES" ] || [ "$CERC_RELAY_NODES" = "[]" ]; then + echo "CERC_RELAY_NODES not provided, taking from the mounted volume" + CERC_RELAY_NODES="[\"/ip4/127.0.0.1/tcp/9090/ws/p2p/$(jq -r '.id' /peers/relay-id.json)\"]" +fi + +echo "Using CERC_RELAY_NODES $CERC_RELAY_NODES" + +# Set relay nodes in config using CERC_RELAY_NODES jq --argjson relayNodes "$CERC_RELAY_NODES" \ '.relayNodes = $relayNodes' \ ./src/test-app-config.json > ./src/config.json diff --git a/app/data/config/watcher-mobymask-v2/watcher-config-template.toml b/app/data/config/watcher-mobymask-v2/watcher-config-template.toml index 843cdbfe..e6ce0750 100644 --- a/app/data/config/watcher-mobymask-v2/watcher-config-template.toml +++ b/app/data/config/watcher-mobymask-v2/watcher-config-template.toml @@ -26,14 +26,15 @@ [server.p2p.relay] host = "0.0.0.0" port = 9090 - relayPeers = [] - peerIdFile = './relay-id.json' + relayPeers = REPLACE_WITH_CERC_RELAY_PEERS + peerIdFile = './peers/relay-id.json' + announce = 'REPLACE_WITH_CERC_RELAY_ANNOUNCE_DOMAIN' enableDebugInfo = true [server.p2p.peer] - relayMultiaddr = '/dns4/mobymask-watcher-server/tcp/9090/ws/p2p/12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t' + relayMultiaddr = 'REPLACE_WITH_CERC_RELAY_MULTIADDR' pubSubTopic = 'mobymask' - peerIdFile = './peer-id.json' + peerIdFile = './peers/peer-id.json' enableDebugInfo = true enableL2Txs = REPLACE_WITH_CERC_ENABLE_PEER_L2_TXS diff --git a/app/data/stacks/mobymask-v2/README.md b/app/data/stacks/mobymask-v2/README.md index ab36f302..9dcca6c0 100644 --- a/app/data/stacks/mobymask-v2/README.md +++ b/app/data/stacks/mobymask-v2/README.md @@ -122,8 +122,8 @@ Clear volumes created by this stack: ```bash # List all relevant volumes -docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*mobymask_deployment|.*fixturenet_geth_accounts|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data" +docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*peers_ids|.*mobymask_deployment|.*fixturenet_geth_accounts|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data" # Remove all the listed volumes -docker volume rm $(docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*mobymask_deployment|.*fixturenet_geth_accounts|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data") +docker volume rm $(docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*peers_ids|.*mobymask_deployment|.*fixturenet_geth_accounts|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data") ``` diff --git a/app/data/stacks/mobymask-v2/mobymask-only.md b/app/data/stacks/mobymask-v2/mobymask-only.md index 27073034..f4d25702 100644 --- a/app/data/stacks/mobymask-v2/mobymask-only.md +++ b/app/data/stacks/mobymask-v2/mobymask-only.md @@ -57,6 +57,12 @@ Create and update an env file to be used in the next step ([defaults](../../conf # (used for generating a root invite link after deploying the contract) CERC_MOBYMASK_APP_BASE_URI="http://127.0.0.1:3002/#" + # (Optional) Set of relay peers to connect to from the relay node + CERC_RELAY_PEERS=[] + + # (Optional) Domain to be used in the relay node's announce address + CERC_RELAY_ANNOUNCE_DOMAIN= + # Set to false for disabling watcher peer to send txs to L2 CERC_ENABLE_PEER_L2_TXS=true @@ -112,8 +118,8 @@ Clear volumes created by this stack: ```bash # List all relevant volumes -docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*mobymask_deployment|.*fixturenet_geth_accounts" +docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*peers_ids|.*mobymask_deployment|.*fixturenet_geth_accounts" # Remove all the listed volumes -docker volume rm $(docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*mobymask_deployment|.*fixturenet_geth_accounts") +docker volume rm $(docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*peers_ids|.*mobymask_deployment|.*fixturenet_geth_accounts") ``` diff --git a/app/data/stacks/mobymask-v2/web-apps.md b/app/data/stacks/mobymask-v2/web-apps.md index 2c1ed253..09d6834d 100644 --- a/app/data/stacks/mobymask-v2/web-apps.md +++ b/app/data/stacks/mobymask-v2/web-apps.md @@ -41,8 +41,10 @@ This should create the required docker images in the local image registry Create and update an env file to be used in the next step ([defaults](../../config/watcher-mobymask-v2/mobymask-params.env)): ```bash - # Set relay nodes to be used by the web-app - CERC_RELAY_NODES=["/ip4/127.0.0.1/tcp/9090/ws/p2p/12D3KooWSPCsVkHVyLQoCqhu2YRPvvM7o6r6NRYyLM5zeA6Uig5t"] + # Set of relay nodes to be used by the web-app + # (use double quotes " for strings) + # Eg. CERC_RELAY_NODES=["/dns4/example.com/tcp/443/wss/p2p/12D3KooWGHmDDCc93XUWL16FMcTPCGu2zFaMkf67k8HZ4gdQbRDr"] + CERC_RELAY_NODES=[] # Also add if running MobyMask app: @@ -111,8 +113,8 @@ Clear volumes created by this stack: ```bash # List all relevant volumes -docker volume ls -q --filter "name=.*mobymask_deployment" +docker volume ls -q --filter "name=.*mobymask_deployment|.*peers_ids" # Remove all the listed volumes -docker volume rm $(docker volume ls -q --filter "name=.*mobymask_deployment") +docker volume rm $(docker volume ls -q --filter "name=.*mobymask_deployment|.*peers_ids") ``` From 0f7c23951dae7e604281c220514d43add6b4b08b Mon Sep 17 00:00:00 2001 From: zramsay Date: Wed, 12 Apr 2023 17:36:47 -0400 Subject: [PATCH 0404/1010] run kubo as a stack Former-commit-id: eae124fdf161db9cfb675cd3cc2aaccbdfd6b002 --- app/data/stacks/kubo/README.md | 7 +++++++ app/data/stacks/kubo/stack.yml | 7 +++++++ 2 files changed, 14 insertions(+) create mode 100644 app/data/stacks/kubo/README.md create mode 100644 app/data/stacks/kubo/stack.yml diff --git a/app/data/stacks/kubo/README.md b/app/data/stacks/kubo/README.md new file mode 100644 index 00000000..a7c3ae98 --- /dev/null +++ b/app/data/stacks/kubo/README.md @@ -0,0 +1,7 @@ +# Kubo (IPFS) + +The Kubo stack is currently uses the provided docker image, therefore a single command will do: + +``` +laconic-so --stack kubo deploy up +``` diff --git a/app/data/stacks/kubo/stack.yml b/app/data/stacks/kubo/stack.yml new file mode 100644 index 00000000..2552df38 --- /dev/null +++ b/app/data/stacks/kubo/stack.yml @@ -0,0 +1,7 @@ +version: "1.0" +name: kubo +description: "Run kubo (IPFS)" +repos: +containers: +pods: + - kubo From 6e343bec5a07e7b75724b24b0ebdcaa56cf93359 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 12 Apr 2023 19:39:37 -0600 Subject: [PATCH 0405/1010] Build with hosting config file (#321) Former-commit-id: bb9c0706c35e72a26b5a62d60b4cbd771cd88406 --- app/build_npms.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/build_npms.py b/app/build_npms.py index 877916be..3750c4bd 100644 --- a/app/build_npms.py +++ b/app/build_npms.py @@ -119,7 +119,9 @@ def command(ctx, include, exclude): # Originally we used the PEP 584 merge operator: # envs = {"CERC_NPM_AUTH_TOKEN": npm_registry_url_token} | ({"CERC_SCRIPT_DEBUG": "true"} if debug else {}) # but that isn't available in Python 3.8 (default in Ubuntu 20) so for now we use dict.update: - envs = {"CERC_NPM_AUTH_TOKEN": npm_registry_url_token} + envs = {"CERC_NPM_AUTH_TOKEN": npm_registry_url_token, + "LACONIC_HOSTED_CONFIG_FILE": "config-hosted.yml" # Convention used by our web app packages + } envs.update({"CERC_SCRIPT_DEBUG": "true"} if debug else {}) try: docker.run(builder_js_image_name, From 13499c6e4b369bba94f9fd654277070684cacf5c Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 12 Apr 2023 19:46:50 -0600 Subject: [PATCH 0406/1010] Add MuKnSys npm scope (#322) Former-commit-id: 6b27731a814b1487535dff8cd5236af559757202 --- .../cerc-builder-js/build-npm-package-local-dependencies.sh | 4 ++-- app/data/container-build/cerc-builder-js/build-npm-package.sh | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh b/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh index 33b6c613..c3a9b520 100755 --- a/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh +++ b/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh @@ -1,7 +1,7 @@ #!/bin/bash # Usage: build-npm-package-local-dependencies.sh # Runs build-npm-package.sh after first fixing up yarn.lock to use a local -# npm registry for all packages in a spcific scope (currently @cerc-io and @lirewine) +# npm registry for all packages in a spcific scope (currently @cerc-io, @lirewine and @muknsys) if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi @@ -18,7 +18,7 @@ set -e local_npm_registry_url=$1 package_publish_version=$2 # If we need to handle an additional scope, add it to the list below: -npm_scopes_to_handle=("@cerc-io" "@lirewine") +npm_scopes_to_handle=("@cerc-io" "@lirewine" "@muknsys") for npm_scope_for_local in ${npm_scopes_to_handle[@]} do # We need to configure the local registry diff --git a/app/data/container-build/cerc-builder-js/build-npm-package.sh b/app/data/container-build/cerc-builder-js/build-npm-package.sh index c8c1e810..668e0bec 100755 --- a/app/data/container-build/cerc-builder-js/build-npm-package.sh +++ b/app/data/container-build/cerc-builder-js/build-npm-package.sh @@ -24,6 +24,7 @@ package_name=$( cat package.json | jq -r .name ) local_npm_registry_url=$1 npm config set @cerc-io:registry ${local_npm_registry_url} npm config set @lirewine:registry ${local_npm_registry_url} +npm config set @muknsys:registry ${local_npm_registry_url} npm config set -- ${local_npm_registry_url}:_authToken ${CERC_NPM_AUTH_TOKEN} # First check if the version of this package we're trying to build already exists in the registry package_exists=$( yarn info --json ${package_name}@${package_publish_version} 2>/dev/null | jq -r .data.dist.tarball ) From 3e80f5f238851e19ef6df3ffbaa603c1313108d6 Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Thu, 13 Apr 2023 12:43:41 +0530 Subject: [PATCH 0407/1010] Wait for transfer tx receipts when configuring Optimism (#323) Former-commit-id: c99fc0941a522215b2b90ea744d20e1bbb261349 --- .../cerc-optimism-contracts/hardhat-tasks/send-balance.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/data/container-build/cerc-optimism-contracts/hardhat-tasks/send-balance.ts b/app/data/container-build/cerc-optimism-contracts/hardhat-tasks/send-balance.ts index dd7065bc..99bf4f74 100644 --- a/app/data/container-build/cerc-optimism-contracts/hardhat-tasks/send-balance.ts +++ b/app/data/container-build/cerc-optimism-contracts/hardhat-tasks/send-balance.ts @@ -16,7 +16,11 @@ task('send-balance', 'Sends Ether to a specified Ethereum account') to, value: ethers.utils.parseEther(amount), }) + const txReceipt = await tx.wait() console.log(`Balance sent to: ${to}, from: ${wallet.address}`) + console.log( + `Block: { number: ${txReceipt.blockNumber}, hash: ${txReceipt.blockHash} }` + ) console.log(`Transaction hash: ${tx.hash}`) }) From 391759e92982d597c7e4d60bad49260a5d6ad581 Mon Sep 17 00:00:00 2001 From: zramsay Date: Thu, 13 Apr 2023 05:27:04 -0400 Subject: [PATCH 0408/1010] expose ports Former-commit-id: e72ea19c5cb93dfad26463e02ff8dbe7d2e2a74c --- app/data/compose/docker-compose-kubo.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/data/compose/docker-compose-kubo.yml b/app/data/compose/docker-compose-kubo.yml index 11c1d2ee..f5f8b06e 100644 --- a/app/data/compose/docker-compose-kubo.yml +++ b/app/data/compose/docker-compose-kubo.yml @@ -8,6 +8,6 @@ services: - ./ipfs/import:/import - ./ipfs/data:/data/ipfs ports: - - "8080" - - "4001" - - "5001" + - "0.0.0.0:8080:8080" + - "0.0.0.0:4001:4001" + - "0.0.0.0:5001:5001" From 18f3c2cc4fd006e4d9c1fc2d54a5c7a7feff642b Mon Sep 17 00:00:00 2001 From: zramsay Date: Thu, 13 Apr 2023 06:55:47 -0400 Subject: [PATCH 0409/1010] update kubo stack README to enable CORS for running in the cloud Former-commit-id: cfa32a3515ee2d2a274753c695f4251961f545ee --- app/data/stacks/kubo/README.md | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/app/data/stacks/kubo/README.md b/app/data/stacks/kubo/README.md index a7c3ae98..233874c1 100644 --- a/app/data/stacks/kubo/README.md +++ b/app/data/stacks/kubo/README.md @@ -1,7 +1,38 @@ # Kubo (IPFS) -The Kubo stack is currently uses the provided docker image, therefore a single command will do: +The Kubo stack currently uses the native IPFS docker image, therefore a single command will do: ``` laconic-so --stack kubo deploy up ``` + +If running locally, visit: [localhost:5001/webui](localhost:5001/webui) and explore the functionality of the WebUI. + +If running in the cloud, visit `IP:5001/webui` and you'll likely see this error: "Could not connect to the IPFS API". To fix it: + +1. Get the container name: + +``` +docker ps +``` + +``` +4dc93dea88df ipfs/kubo:master-2023-02-20-714a968 "/sbin/tini -- /usr/…" 51 minutes ago Up 51 minutes (healthy) 0.0.0.0:4001->4001/tcp, 0.0.0.0:5001->5001/tcp, 4001/udp, 0.0.0.0:8080->8080/tcp, 8081/tcp laconic-dbbf5498fd7d322930b9484121a6a5f4-ipfs-1 +``` + +2. Go into the container (replace with your container name): + +``` +docker exec -it laconic-dbbf5498fd7d322930b9484121a6a5f4-ipfs-1 sh +``` + +3. Enable CORS as described in point 2 of the error message. Copy/paste/run each line in sequence, then run `exit` to exit the container. + +4. Restart the container: + +``` +laconic-so --stack kubo deploy down +laconic-so --stack kubo deploy up +``` + +5. Refresh the `IP:5001/webui` URL in your browser, you should now be connected to IPFS. From a1a4837c894c940d93bd3236a4bfce19912b0e34 Mon Sep 17 00:00:00 2001 From: zramsay Date: Thu, 13 Apr 2023 07:05:03 -0400 Subject: [PATCH 0410/1010] lil fixes Former-commit-id: bafdfe6d2a6550595c96fa66533f59edb8314130 --- app/data/stacks/kubo/README.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/app/data/stacks/kubo/README.md b/app/data/stacks/kubo/README.md index 233874c1..e9b12321 100644 --- a/app/data/stacks/kubo/README.md +++ b/app/data/stacks/kubo/README.md @@ -6,19 +6,11 @@ The Kubo stack currently uses the native IPFS docker image, therefore a single c laconic-so --stack kubo deploy up ``` -If running locally, visit: [localhost:5001/webui](localhost:5001/webui) and explore the functionality of the WebUI. +If running locally, visit: http://localhost:5001/webui and explore the functionality of the WebUI. If running in the cloud, visit `IP:5001/webui` and you'll likely see this error: "Could not connect to the IPFS API". To fix it: -1. Get the container name: - -``` -docker ps -``` - -``` -4dc93dea88df ipfs/kubo:master-2023-02-20-714a968 "/sbin/tini -- /usr/…" 51 minutes ago Up 51 minutes (healthy) 0.0.0.0:4001->4001/tcp, 0.0.0.0:5001->5001/tcp, 4001/udp, 0.0.0.0:8080->8080/tcp, 8081/tcp laconic-dbbf5498fd7d322930b9484121a6a5f4-ipfs-1 -``` +1. Get the container name with `docker ps`: 2. Go into the container (replace with your container name): From f0ce0fef1ce9aecd89bf971f7698a195fe42bedf Mon Sep 17 00:00:00 2001 From: zramsay Date: Thu, 13 Apr 2023 12:31:53 -0400 Subject: [PATCH 0411/1010] typos Former-commit-id: 16c9607a6c7f43bf3fc63cc0124fe46285457c80 --- .../cerc-builder-js/build-npm-package-local-dependencies.sh | 2 +- scripts/quick-install-ubuntu.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh b/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh index c3a9b520..5ae0e073 100755 --- a/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh +++ b/app/data/container-build/cerc-builder-js/build-npm-package-local-dependencies.sh @@ -1,7 +1,7 @@ #!/bin/bash # Usage: build-npm-package-local-dependencies.sh # Runs build-npm-package.sh after first fixing up yarn.lock to use a local -# npm registry for all packages in a spcific scope (currently @cerc-io, @lirewine and @muknsys) +# npm registry for all packages in a specific scope (currently @cerc-io, @lirewine and @muknsys) if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi diff --git a/scripts/quick-install-ubuntu.sh b/scripts/quick-install-ubuntu.sh index 3611abdf..e28c2052 100755 --- a/scripts/quick-install-ubuntu.sh +++ b/scripts/quick-install-ubuntu.sh @@ -60,7 +60,7 @@ sudo apt -y install jq # laconic-so depends on git sudo apt -y install git # curl used below -sudo apt -y install jq +sudo apt -y install curl # docker repo add depends on gnupg and updated ca-certificates sudo apt -y install ca-certificates gnupg From 332085f80bc5c20516ef8739abf1c31bbdc86e6d Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 14 Apr 2023 14:19:27 -0600 Subject: [PATCH 0412/1010] Add force rebuild option (#329) Former-commit-id: 1443c6c6d20f3e9f95432e87ea61109c6b0f1beb --- app/build_containers.py | 9 +++- app/build_npms.py | 6 ++- app/data/container-build/build-base.sh | 13 ++++++ .../cerc-act-runner-task-executor/build.sh | 3 +- .../container-build/cerc-act-runner/build.sh | 4 +- .../cerc-builder-js/build-npm-package.sh | 15 +++++-- .../container-build/cerc-eth-probe/build.sh | 3 +- .../cerc-eth-statediff-fill-service/build.sh | 3 +- .../cerc-eth-statediff-service/build.sh | 3 +- .../cerc-fixturenet-eth-geth/build.sh | 4 +- .../cerc-fixturenet-eth-lighthouse/build.sh | 4 +- .../container-build/cerc-foundry/build.sh | 3 +- .../cerc-go-ethereum-foundry/build.sh | 4 +- .../container-build/cerc-go-ethereum/build.sh | 3 +- .../cerc-ipld-eth-beacon-db/build.sh | 3 +- .../cerc-ipld-eth-beacon-indexer/build.sh | 3 +- .../container-build/cerc-ipld-eth-db/build.sh | 3 +- .../cerc-ipld-eth-server/build.sh | 3 +- .../container-build/cerc-keycloak/build.sh | 4 +- .../cerc-laconic-console-host/build.sh | 4 +- .../cerc-laconic-registry-cli/build.sh | 4 +- .../container-build/cerc-laconicd/build.sh | 5 ++- .../container-build/cerc-lighthouse/build.sh | 4 +- .../container-build/cerc-mobymask-ui/build.sh | 4 +- .../container-build/cerc-mobymask/build.sh | 4 +- .../cerc-optimism-contracts/build.sh | 4 +- .../cerc-optimism-l2geth/build.sh | 3 +- .../cerc-optimism-op-batcher/build.sh | 3 +- .../cerc-optimism-op-node/build.sh | 3 +- .../container-build/cerc-react-peer/build.sh | 4 +- .../cerc-test-container/build.sh | 3 +- .../cerc-test-contract/build.sh | 3 +- .../container-build/cerc-tx-spammer/build.sh | 3 +- .../cerc-uniswap-v3-info/build.sh | 4 +- .../cerc-watcher-erc20/build.sh | 4 +- .../cerc-watcher-erc721/build.sh | 4 +- .../cerc-watcher-mobymask-v2/build.sh | 4 +- .../cerc-watcher-mobymask/build.sh | 4 +- .../cerc-watcher-uniswap-v3/build.sh | 4 +- app/data/container-build/default-build.sh | 9 ++-- docs/cli.md | 45 +++++++++++++++++++ 41 files changed, 176 insertions(+), 46 deletions(-) create mode 100755 app/data/container-build/build-base.sh diff --git a/app/build_containers.py b/app/build_containers.py index 5b85f5bf..3a47a6da 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -36,13 +36,16 @@ from .util import include_exclude_check, get_parsed_stack_config @click.command() @click.option('--include', help="only build these containers") @click.option('--exclude', help="don\'t build these containers") +@click.option("--force-rebuild", is_flag=True, default=False, help="Override dependency checking -- always rebuild") +@click.option("--extra-build-args", help="Supply extra arguments to build") @click.pass_context -def command(ctx, include, exclude): +def command(ctx, include, exclude, force_rebuild, extra_build_args): '''build the set of containers required for a complete stack''' quiet = ctx.obj.quiet verbose = ctx.obj.verbose dry_run = ctx.obj.dry_run + debug = ctx.obj.debug local_stack = ctx.obj.local_stack stack = ctx.obj.stack continue_on_error = ctx.obj.continue_on_error @@ -84,10 +87,14 @@ def command(ctx, include, exclude): "CERC_NPM_URL": "http://gitea.local:3000/api/packages/cerc-io/npm/", "CERC_NPM_AUTH_TOKEN": config("CERC_NPM_AUTH_TOKEN", default=""), "CERC_REPO_BASE_DIR": dev_root_path, + "CERC_CONTAINER_BASE_DIR": container_build_dir, "CERC_HOST_UID": f"{os.getuid()}", "CERC_HOST_GID": f"{os.getgid()}", "DOCKER_BUILDKIT": "0" } + container_build_env.update({"CERC_SCRIPT_DEBUG": "true"} if debug else {}) + container_build_env.update({"CERC_FORCE_REBUILD": "true"} if force_rebuild else {}) + container_build_env.update({"CERC_CONTAINER_EXTRA_BUILD_ARGS": extra_build_args} if extra_build_args else {}) def process_container(container): if not quiet: diff --git a/app/build_npms.py b/app/build_npms.py index 3750c4bd..d56b2774 100644 --- a/app/build_npms.py +++ b/app/build_npms.py @@ -33,8 +33,10 @@ builder_js_image_name = "cerc/builder-js:local" @click.command() @click.option('--include', help="only build these packages") @click.option('--exclude', help="don\'t build these packages") +@click.option("--force-rebuild", is_flag=True, default=False, help="Override existing target package version check -- force rebuild") +@click.option("--extra-build-args", help="Supply extra arguments to build") @click.pass_context -def command(ctx, include, exclude): +def command(ctx, include, exclude, force_rebuild, extra_build_args): '''build the set of npm packages required for a complete stack''' quiet = ctx.obj.quiet @@ -123,6 +125,8 @@ def command(ctx, include, exclude): "LACONIC_HOSTED_CONFIG_FILE": "config-hosted.yml" # Convention used by our web app packages } envs.update({"CERC_SCRIPT_DEBUG": "true"} if debug else {}) + envs.update({"CERC_FORCE_REBUILD": "true"} if force_rebuild else {}) + envs.update({"CERC_CONTAINER_EXTRA_BUILD_ARGS": extra_build_args} if extra_build_args else {}) try: docker.run(builder_js_image_name, remove=True, diff --git a/app/data/container-build/build-base.sh b/app/data/container-build/build-base.sh new file mode 100755 index 00000000..61705b79 --- /dev/null +++ b/app/data/container-build/build-base.sh @@ -0,0 +1,13 @@ +# source'ed into container build scripts to do generic command setup +if [[ -n "$CERC_SCRIPT_DEBUG" ]]; then + set -x + echo "Build environment variables:" + env +fi +build_command_args="" +if [[ ${CERC_FORCE_REBUILD} == "true" ]]; then + build_command_args="${build_command_args} --no-cache" +fi +if [[ -n "$CERC_CONTAINER_EXTRA_BUILD_ARGS" ]]; then + build_command_args="${build_command_args} ${CERC_CONTAINER_EXTRA_BUILD_ARGS}" +fi diff --git a/app/data/container-build/cerc-act-runner-task-executor/build.sh b/app/data/container-build/cerc-act-runner-task-executor/build.sh index 2bfb3bf9..53bfd23b 100755 --- a/app/data/container-build/cerc-act-runner-task-executor/build.sh +++ b/app/data/container-build/cerc-act-runner-task-executor/build.sh @@ -1,3 +1,4 @@ #!/usr/bin/env bash # Build a local version of the task executor for act-runner -docker build -t cerc/act-runner-task-executor:local -f ${CERC_REPO_BASE_DIR}/hosting/gitea/Dockerfile.task-executor ${CERC_REPO_BASE_DIR}/hosting +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh +docker build -t cerc/act-runner-task-executor:local -f ${CERC_REPO_BASE_DIR}/hosting/gitea/Dockerfile.task-executor ${build_command_args} ${CERC_REPO_BASE_DIR}/hosting diff --git a/app/data/container-build/cerc-act-runner/build.sh b/app/data/container-build/cerc-act-runner/build.sh index 2fdb3f2e..89a6e74f 100755 --- a/app/data/container-build/cerc-act-runner/build.sh +++ b/app/data/container-build/cerc-act-runner/build.sh @@ -1,3 +1,5 @@ #!/usr/bin/env bash +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh # Build a local version of the act-runner image -docker build -t cerc/act-runner:local -f ${CERC_REPO_BASE_DIR}/act_runner/Dockerfile ${CERC_REPO_BASE_DIR}/act_runner +# TODO: enhance the default build code path to cope with this container (repo has an _ which needs to be converted to - in the image tag) +docker build -t cerc/act-runner:local -f ${CERC_REPO_BASE_DIR}/act_runner/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/act_runner diff --git a/app/data/container-build/cerc-builder-js/build-npm-package.sh b/app/data/container-build/cerc-builder-js/build-npm-package.sh index 668e0bec..db27955c 100755 --- a/app/data/container-build/cerc-builder-js/build-npm-package.sh +++ b/app/data/container-build/cerc-builder-js/build-npm-package.sh @@ -25,12 +25,21 @@ local_npm_registry_url=$1 npm config set @cerc-io:registry ${local_npm_registry_url} npm config set @lirewine:registry ${local_npm_registry_url} npm config set @muknsys:registry ${local_npm_registry_url} -npm config set -- ${local_npm_registry_url}:_authToken ${CERC_NPM_AUTH_TOKEN} +# Workaround bug in npm unpublish where it needs the url to be of the form // and not http:// +local_npm_registry_url_fixed=$( echo ${local_npm_registry_url} | sed -e 's/^http[s]\{0,1\}://') +npm config set -- ${local_npm_registry_url_fixed}:_authToken ${CERC_NPM_AUTH_TOKEN} # First check if the version of this package we're trying to build already exists in the registry package_exists=$( yarn info --json ${package_name}@${package_publish_version} 2>/dev/null | jq -r .data.dist.tarball ) if [[ ! -z "$package_exists" && "$package_exists" != "null" ]]; then - echo "${package_publish_version} of ${package_name} already exists in the registry, skipping build" - exit 0 + echo "${package_publish_version} of ${package_name} already exists in the registry" + if [[ ${CERC_FORCE_REBUILD} == "true" ]]; then + # Attempt to unpublish the existing package + echo "NOTE: unpublishing existing package version since force rebuild is enabled" + npm unpublish --force ${package_name}@${package_publish_version} + else + echo "skipping build since target version already exists" + exit 0 + fi fi echo "Build and publish ${package_name} version ${package_publish_version}" yarn install diff --git a/app/data/container-build/cerc-eth-probe/build.sh b/app/data/container-build/cerc-eth-probe/build.sh index 4f211307..c90e0627 100755 --- a/app/data/container-build/cerc-eth-probe/build.sh +++ b/app/data/container-build/cerc-eth-probe/build.sh @@ -1,3 +1,4 @@ #!/usr/bin/env bash # Build cerc/eth-probe -docker build -t cerc/eth-probe:local ${CERC_REPO_BASE_DIR}/eth-probe +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh +docker build -t cerc/eth-probe:local ${build_command_args} ${CERC_REPO_BASE_DIR}/eth-probe diff --git a/app/data/container-build/cerc-eth-statediff-fill-service/build.sh b/app/data/container-build/cerc-eth-statediff-fill-service/build.sh index 2a73352f..03896052 100755 --- a/app/data/container-build/cerc-eth-statediff-fill-service/build.sh +++ b/app/data/container-build/cerc-eth-statediff-fill-service/build.sh @@ -1,3 +1,4 @@ #!/usr/bin/env bash # Build cerc/eth-statediff-fill-service -docker build -t cerc/eth-statediff-fill-service:local ${CERC_REPO_BASE_DIR}/eth-statediff-fill-service +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh +docker build -t cerc/eth-statediff-fill-service:local ${build_command_args} ${CERC_REPO_BASE_DIR}/eth-statediff-fill-service diff --git a/app/data/container-build/cerc-eth-statediff-service/build.sh b/app/data/container-build/cerc-eth-statediff-service/build.sh index 6091e8ec..07c2d2ef 100755 --- a/app/data/container-build/cerc-eth-statediff-service/build.sh +++ b/app/data/container-build/cerc-eth-statediff-service/build.sh @@ -1,3 +1,4 @@ #!/usr/bin/env bash # Build cerc/eth-statediff-service -docker build -t cerc/eth-statediff-service:local ${CERC_REPO_BASE_DIR}/eth-statediff-service +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh +docker build -t cerc/eth-statediff-service:local ${build_command_args} ${CERC_REPO_BASE_DIR}/eth-statediff-service diff --git a/app/data/container-build/cerc-fixturenet-eth-geth/build.sh b/app/data/container-build/cerc-fixturenet-eth-geth/build.sh index b06044c7..a00a3f17 100755 --- a/app/data/container-build/cerc-fixturenet-eth-geth/build.sh +++ b/app/data/container-build/cerc-fixturenet-eth-geth/build.sh @@ -1,6 +1,8 @@ #!/usr/bin/env bash # Build cerc/fixturenet-eth-geth +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/fixturenet-eth-geth:local -f ${SCRIPT_DIR}/Dockerfile $SCRIPT_DIR +docker build -t cerc/fixturenet-eth-geth:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} $SCRIPT_DIR diff --git a/app/data/container-build/cerc-fixturenet-eth-lighthouse/build.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/build.sh index bc48fde0..e7e06039 100755 --- a/app/data/container-build/cerc-fixturenet-eth-lighthouse/build.sh +++ b/app/data/container-build/cerc-fixturenet-eth-lighthouse/build.sh @@ -1,6 +1,8 @@ #!/usr/bin/env bash # Build cerc/fixturenet-eth-lighthouse +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/fixturenet-eth-lighthouse:local -f ${SCRIPT_DIR}/Dockerfile $SCRIPT_DIR +docker build -t cerc/fixturenet-eth-lighthouse:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} $SCRIPT_DIR diff --git a/app/data/container-build/cerc-foundry/build.sh b/app/data/container-build/cerc-foundry/build.sh index c765f03d..f80276eb 100755 --- a/app/data/container-build/cerc-foundry/build.sh +++ b/app/data/container-build/cerc-foundry/build.sh @@ -1,3 +1,4 @@ #!/usr/bin/env bash # Build a local version of the foundry-rs/foundry image -docker build -t cerc/foundry:local -f ${CERC_REPO_BASE_DIR}/foundry/Dockerfile-debian ${CERC_REPO_BASE_DIR}/foundry +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh +docker build -t cerc/foundry:local -f ${CERC_REPO_BASE_DIR}/foundry/Dockerfile-debian ${build_command_args} ${CERC_REPO_BASE_DIR}/foundry diff --git a/app/data/container-build/cerc-go-ethereum-foundry/build.sh b/app/data/container-build/cerc-go-ethereum-foundry/build.sh index d4fd2deb..41781112 100755 --- a/app/data/container-build/cerc-go-ethereum-foundry/build.sh +++ b/app/data/container-build/cerc-go-ethereum-foundry/build.sh @@ -1,7 +1,9 @@ #!/usr/bin/env bash # Build cerc/go-ethereum-foundry +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/go-ethereum-foundry:local --build-arg GENESIS_FILE_PATH=genesis-automine.json ${SCRIPT_DIR} +docker build -t cerc/go-ethereum-foundry:local --build-arg GENESIS_FILE_PATH=genesis-automine.json ${build_command_args} ${SCRIPT_DIR} diff --git a/app/data/container-build/cerc-go-ethereum/build.sh b/app/data/container-build/cerc-go-ethereum/build.sh index 0ab91354..171d0079 100755 --- a/app/data/container-build/cerc-go-ethereum/build.sh +++ b/app/data/container-build/cerc-go-ethereum/build.sh @@ -1,3 +1,4 @@ #!/usr/bin/env bash # Build cerc/go-ethereum -docker build -t cerc/go-ethereum:local ${CERC_REPO_BASE_DIR}/go-ethereum +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh +docker build -t cerc/go-ethereum:local ${build_command_args} ${CERC_REPO_BASE_DIR}/go-ethereum diff --git a/app/data/container-build/cerc-ipld-eth-beacon-db/build.sh b/app/data/container-build/cerc-ipld-eth-beacon-db/build.sh index c3c620d2..47875ec3 100755 --- a/app/data/container-build/cerc-ipld-eth-beacon-db/build.sh +++ b/app/data/container-build/cerc-ipld-eth-beacon-db/build.sh @@ -1,3 +1,4 @@ #!/usr/bin/env bash # Build cerc/ipld-eth-beacon-db -docker build -t cerc/ipld-eth-beacon-db:local ${CERC_REPO_BASE_DIR}/ipld-eth-beacon-db +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh +docker build -t cerc/ipld-eth-beacon-db:local ${build_command_args} ${build_command_args} ${CERC_REPO_BASE_DIR}/ipld-eth-beacon-db diff --git a/app/data/container-build/cerc-ipld-eth-beacon-indexer/build.sh b/app/data/container-build/cerc-ipld-eth-beacon-indexer/build.sh index 78a4cd00..d304bf3f 100755 --- a/app/data/container-build/cerc-ipld-eth-beacon-indexer/build.sh +++ b/app/data/container-build/cerc-ipld-eth-beacon-indexer/build.sh @@ -1,3 +1,4 @@ #!/usr/bin/env bash # Build cerc/ipld-eth-beacon-indexer -docker build -t cerc/ipld-eth-beacon-indexer:local ${CERC_REPO_BASE_DIR}/ipld-eth-beacon-indexer +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh +docker build -t cerc/ipld-eth-beacon-indexer:local ${build_command_args} ${CERC_REPO_BASE_DIR}/ipld-eth-beacon-indexer diff --git a/app/data/container-build/cerc-ipld-eth-db/build.sh b/app/data/container-build/cerc-ipld-eth-db/build.sh index ec5a905e..d454f3f8 100755 --- a/app/data/container-build/cerc-ipld-eth-db/build.sh +++ b/app/data/container-build/cerc-ipld-eth-db/build.sh @@ -1,3 +1,4 @@ #!/usr/bin/env bash # Build cerc/ipld-eth-db -docker build -t cerc/ipld-eth-db:local ${CERC_REPO_BASE_DIR}/ipld-eth-db +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh +docker build -t cerc/ipld-eth-db:local ${build_command_args} ${CERC_REPO_BASE_DIR}/ipld-eth-db diff --git a/app/data/container-build/cerc-ipld-eth-server/build.sh b/app/data/container-build/cerc-ipld-eth-server/build.sh index 7e714294..04c3907e 100755 --- a/app/data/container-build/cerc-ipld-eth-server/build.sh +++ b/app/data/container-build/cerc-ipld-eth-server/build.sh @@ -1,3 +1,4 @@ #!/usr/bin/env bash # Build cerc/ipld-eth-server -docker build -t cerc/ipld-eth-server:local ${CERC_REPO_BASE_DIR}/ipld-eth-server +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh +docker build -t cerc/ipld-eth-server:local ${build_command_args} ${CERC_REPO_BASE_DIR}/ipld-eth-server diff --git a/app/data/container-build/cerc-keycloak/build.sh b/app/data/container-build/cerc-keycloak/build.sh index 0e147a9d..be8a7d11 100755 --- a/app/data/container-build/cerc-keycloak/build.sh +++ b/app/data/container-build/cerc-keycloak/build.sh @@ -2,7 +2,9 @@ # #Build cerc/keycloack +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/keycloak:local ${SCRIPT_DIR} +docker build -t cerc/keycloak:local ${build_command_args} ${SCRIPT_DIR} diff --git a/app/data/container-build/cerc-laconic-console-host/build.sh b/app/data/container-build/cerc-laconic-console-host/build.sh index cc84d249..a321b195 100755 --- a/app/data/container-build/cerc-laconic-console-host/build.sh +++ b/app/data/container-build/cerc-laconic-console-host/build.sh @@ -1,9 +1,11 @@ #!/usr/bin/env bash # Build cerc/laconic-registry-cli +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/laconic-console-host:local -f ${SCRIPT_DIR}/Dockerfile \ +docker build -t cerc/laconic-console-host:local ${build_command_args} -f ${SCRIPT_DIR}/Dockerfile \ --add-host gitea.local:host-gateway \ --build-arg CERC_NPM_AUTH_TOKEN --build-arg CERC_NPM_URL ${SCRIPT_DIR} diff --git a/app/data/container-build/cerc-laconic-registry-cli/build.sh b/app/data/container-build/cerc-laconic-registry-cli/build.sh index ea157dac..a6264f4b 100755 --- a/app/data/container-build/cerc-laconic-registry-cli/build.sh +++ b/app/data/container-build/cerc-laconic-registry-cli/build.sh @@ -1,9 +1,11 @@ #!/usr/bin/env bash # Build cerc/laconic-registry-cli +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/laconic-registry-cli:local -f ${SCRIPT_DIR}/Dockerfile \ +docker build -t cerc/laconic-registry-cli:local ${build_command_args} -f ${SCRIPT_DIR}/Dockerfile \ --add-host gitea.local:host-gateway \ --build-arg CERC_NPM_AUTH_TOKEN --build-arg CERC_NPM_URL ${SCRIPT_DIR} diff --git a/app/data/container-build/cerc-laconicd/build.sh b/app/data/container-build/cerc-laconicd/build.sh index f5685097..3d897446 100755 --- a/app/data/container-build/cerc-laconicd/build.sh +++ b/app/data/container-build/cerc-laconicd/build.sh @@ -1,3 +1,4 @@ #!/usr/bin/env bash -# Build cerc/chiba-clonk -docker build -t cerc/laconicd:local ${CERC_REPO_BASE_DIR}/laconicd \ No newline at end of file +# Build cerc/laconicd +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh +docker build -t cerc/laconicd:local ${build_command_args} ${CERC_REPO_BASE_DIR}/laconicd \ No newline at end of file diff --git a/app/data/container-build/cerc-lighthouse/build.sh b/app/data/container-build/cerc-lighthouse/build.sh index 7babdbd1..2e9cfe3c 100755 --- a/app/data/container-build/cerc-lighthouse/build.sh +++ b/app/data/container-build/cerc-lighthouse/build.sh @@ -1,7 +1,9 @@ #!/usr/bin/env bash # Build cerc/lighthouse +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/lighthouse:local ${SCRIPT_DIR} +docker build -t cerc/lighthouse:local ${build_command_args} ${SCRIPT_DIR} diff --git a/app/data/container-build/cerc-mobymask-ui/build.sh b/app/data/container-build/cerc-mobymask-ui/build.sh index cabd63ff..52687093 100755 --- a/app/data/container-build/cerc-mobymask-ui/build.sh +++ b/app/data/container-build/cerc-mobymask-ui/build.sh @@ -1,7 +1,9 @@ #!/usr/bin/env bash # Build cerc/mobymask-ui +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/mobymask-ui:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/mobymask-ui +docker build -t cerc/mobymask-ui:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/mobymask-ui diff --git a/app/data/container-build/cerc-mobymask/build.sh b/app/data/container-build/cerc-mobymask/build.sh index 7628a228..f156846a 100755 --- a/app/data/container-build/cerc-mobymask/build.sh +++ b/app/data/container-build/cerc-mobymask/build.sh @@ -1,7 +1,9 @@ #!/usr/bin/env bash # Build cerc/mobymask +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/mobymask:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/MobyMask +docker build -t cerc/mobymask:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/MobyMask diff --git a/app/data/container-build/cerc-optimism-contracts/build.sh b/app/data/container-build/cerc-optimism-contracts/build.sh index 8b8e0eaa..b1ddd819 100755 --- a/app/data/container-build/cerc-optimism-contracts/build.sh +++ b/app/data/container-build/cerc-optimism-contracts/build.sh @@ -1,7 +1,9 @@ #!/usr/bin/env bash # Build cerc/optimism-contracts +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/optimism-contracts:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/optimism +docker build -t cerc/optimism-contracts:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/optimism diff --git a/app/data/container-build/cerc-optimism-l2geth/build.sh b/app/data/container-build/cerc-optimism-l2geth/build.sh index 3ffada73..5e125703 100755 --- a/app/data/container-build/cerc-optimism-l2geth/build.sh +++ b/app/data/container-build/cerc-optimism-l2geth/build.sh @@ -1,3 +1,4 @@ #!/usr/bin/env bash # Build cerc/optimism-l2geth -docker build -t cerc/optimism-l2geth:local ${CERC_REPO_BASE_DIR}/op-geth +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh +docker build -t cerc/optimism-l2geth:local ${build_command_args} ${CERC_REPO_BASE_DIR}/op-geth diff --git a/app/data/container-build/cerc-optimism-op-batcher/build.sh b/app/data/container-build/cerc-optimism-op-batcher/build.sh index 5bc3a238..08b209d0 100755 --- a/app/data/container-build/cerc-optimism-op-batcher/build.sh +++ b/app/data/container-build/cerc-optimism-op-batcher/build.sh @@ -1,5 +1,6 @@ #!/usr/bin/env bash # Build cerc/optimism-op-batcher # TODO: use upstream Dockerfile once its buildx-specific content has been removed +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/optimism-op-batcher:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/optimism +docker build -t cerc/optimism-op-batcher:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/optimism diff --git a/app/data/container-build/cerc-optimism-op-node/build.sh b/app/data/container-build/cerc-optimism-op-node/build.sh index 0ec7e656..9c33529a 100755 --- a/app/data/container-build/cerc-optimism-op-node/build.sh +++ b/app/data/container-build/cerc-optimism-op-node/build.sh @@ -1,5 +1,6 @@ #!/usr/bin/env bash # Build cerc/optimism-op-node # TODO: use upstream Dockerfile once its buildx-specific content has been removed +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/optimism-op-node:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/optimism +docker build -t cerc/optimism-op-node:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/optimism diff --git a/app/data/container-build/cerc-react-peer/build.sh b/app/data/container-build/cerc-react-peer/build.sh index a3d328de..48edc4b3 100755 --- a/app/data/container-build/cerc-react-peer/build.sh +++ b/app/data/container-build/cerc-react-peer/build.sh @@ -1,7 +1,9 @@ #!/usr/bin/env bash # Build cerc/react-peer +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/react-peer:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/react-peer +docker build -t cerc/react-peer:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/react-peer diff --git a/app/data/container-build/cerc-test-container/build.sh b/app/data/container-build/cerc-test-container/build.sh index 1595645c..ee56576a 100755 --- a/app/data/container-build/cerc-test-container/build.sh +++ b/app/data/container-build/cerc-test-container/build.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash # Build cerc/test-container +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/test-container:local -f ${SCRIPT_DIR}/Dockerfile $SCRIPT_DIR \ No newline at end of file +docker build -t cerc/test-container:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} $SCRIPT_DIR \ No newline at end of file diff --git a/app/data/container-build/cerc-test-contract/build.sh b/app/data/container-build/cerc-test-contract/build.sh index 1b3c925e..9df768fb 100755 --- a/app/data/container-build/cerc-test-contract/build.sh +++ b/app/data/container-build/cerc-test-contract/build.sh @@ -1,3 +1,4 @@ #!/usr/bin/env bash # Build cerc/test-contract -docker build -t cerc/test-contract:local --build-arg ETH_ADDR=http://go-ethereum:8545 ${CERC_REPO_BASE_DIR}/ipld-eth-db-validator/test/contract +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh +docker build -t cerc/test-contract:local --build-arg ETH_ADDR=http://go-ethereum:8545 ${build_command_args} ${CERC_REPO_BASE_DIR}/ipld-eth-db-validator/test/contract diff --git a/app/data/container-build/cerc-tx-spammer/build.sh b/app/data/container-build/cerc-tx-spammer/build.sh index b6752dd7..ee4494e0 100755 --- a/app/data/container-build/cerc-tx-spammer/build.sh +++ b/app/data/container-build/cerc-tx-spammer/build.sh @@ -1,3 +1,4 @@ #!/usr/bin/env bash # Build cerc/tx-spammer -docker build -t cerc/tx-spammer:local ${CERC_REPO_BASE_DIR}/tx-spammer +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh +docker build -t cerc/tx-spammer:local ${build_command_args} ${CERC_REPO_BASE_DIR}/tx-spammer diff --git a/app/data/container-build/cerc-uniswap-v3-info/build.sh b/app/data/container-build/cerc-uniswap-v3-info/build.sh index bda1bb5e..efbc1c08 100755 --- a/app/data/container-build/cerc-uniswap-v3-info/build.sh +++ b/app/data/container-build/cerc-uniswap-v3-info/build.sh @@ -1,7 +1,9 @@ #!/usr/bin/env bash # Build cerc/uniswap-v3-info +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/uniswap-v3-info:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/uniswap-v3-info +docker build -t cerc/uniswap-v3-info:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/uniswap-v3-info diff --git a/app/data/container-build/cerc-watcher-erc20/build.sh b/app/data/container-build/cerc-watcher-erc20/build.sh index b800b73d..67ac0d24 100755 --- a/app/data/container-build/cerc-watcher-erc20/build.sh +++ b/app/data/container-build/cerc-watcher-erc20/build.sh @@ -1,7 +1,9 @@ #!/usr/bin/env bash # Build cerc/watcher-erc20 +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/watcher-erc20:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/watcher-ts +docker build -t cerc/watcher-erc20:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/watcher-ts diff --git a/app/data/container-build/cerc-watcher-erc721/build.sh b/app/data/container-build/cerc-watcher-erc721/build.sh index b9c9c0b8..f9c630ac 100755 --- a/app/data/container-build/cerc-watcher-erc721/build.sh +++ b/app/data/container-build/cerc-watcher-erc721/build.sh @@ -1,7 +1,9 @@ #!/usr/bin/env bash # Build cerc/watcher-erc721 +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/watcher-erc721:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/watcher-ts +docker build -t cerc/watcher-erc721:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/watcher-ts diff --git a/app/data/container-build/cerc-watcher-mobymask-v2/build.sh b/app/data/container-build/cerc-watcher-mobymask-v2/build.sh index 19e82818..f8b59224 100755 --- a/app/data/container-build/cerc-watcher-mobymask-v2/build.sh +++ b/app/data/container-build/cerc-watcher-mobymask-v2/build.sh @@ -1,7 +1,9 @@ #!/usr/bin/env bash # Build cerc/watcher-mobymask-v2 +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/watcher-mobymask-v2:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/watcher-ts +docker build -t cerc/watcher-mobymask-v2:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/watcher-ts diff --git a/app/data/container-build/cerc-watcher-mobymask/build.sh b/app/data/container-build/cerc-watcher-mobymask/build.sh index f965c770..219b864f 100755 --- a/app/data/container-build/cerc-watcher-mobymask/build.sh +++ b/app/data/container-build/cerc-watcher-mobymask/build.sh @@ -1,9 +1,11 @@ #!/usr/bin/env bash # Build cerc/watcher-mobymask +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/watcher-mobymask:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/watcher-ts +docker build -t cerc/watcher-mobymask:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/watcher-ts # TODO: add a mechanism to pass two repos into a container rather than the parent directory diff --git a/app/data/container-build/cerc-watcher-uniswap-v3/build.sh b/app/data/container-build/cerc-watcher-uniswap-v3/build.sh index 432feb02..5dc63d50 100755 --- a/app/data/container-build/cerc-watcher-uniswap-v3/build.sh +++ b/app/data/container-build/cerc-watcher-uniswap-v3/build.sh @@ -1,7 +1,9 @@ #!/usr/bin/env bash # Build cerc/watcher-uniswap-v3 +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/watcher-uniswap-v3:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/uniswap-watcher-ts +docker build -t cerc/watcher-uniswap-v3:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/uniswap-watcher-ts diff --git a/app/data/container-build/default-build.sh b/app/data/container-build/default-build.sh index c52dd043..6757812b 100755 --- a/app/data/container-build/default-build.sh +++ b/app/data/container-build/default-build.sh @@ -1,14 +1,13 @@ #!/usr/bin/env bash # Usage: default-build.sh [] # if is not supplied, the context is the directory where the Dockerfile lives -if [[ -n "$CERC_SCRIPT_DEBUG" ]]; then - set -x -fi + +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + if [[ $# -ne 2 ]]; then echo "Illegal number of parameters" >&2 exit 1 fi image_tag=$1 build_dir=$2 -echo "Building ${image_tag} in ${build_dir}" -docker build -t ${image_tag} --build-arg CERC_HOST_UID=${CERC_HOST_UID} --build-arg CERC_HOST_GID=${CERC_HOST_GID} ${build_dir} +docker build -t ${image_tag} ${build_command_args} --build-arg CERC_HOST_UID=${CERC_HOST_UID} --build-arg CERC_HOST_GID=${CERC_HOST_GID} ${build_dir} diff --git a/docs/cli.md b/docs/cli.md index 70905d87..f7c6205f 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -1,3 +1,48 @@ # laconic-so Sub-commands and flags + +## build-containers + +Build a single container: +``` +$ laconic-so build-containers --include +``` +e.g. +``` +$ laconic-so build-containers --include cerc/go-ethereum +``` +Build the containers for a stack: +``` +$ laconic-so --stack build-containers +``` +e.g. +``` +$ laconic-so --stack fixturenet-eth build-containers +``` +Force full rebuild of container images: +``` +$ laconic-so build-containers --include --force-rebuild +``` +## build-npms + +Build a single package: +``` +$ laconic-so build-npms --include +``` +e.g. +``` +$ laconic-so build-npms --include laconic-sdk +``` +Build the packages for a stack: +``` +$ laconic-so --stack build-npms +``` +e.g. +``` +$ laconic-so --stack fixturenet-laconicd build-npms +``` +Force full rebuild of packages: +``` +$ laconic-so build-npms --include --force-rebuild +``` From bfa86cbc29c1a2a4d057fdb38e0ed0197de3b1a4 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 14 Apr 2023 17:51:22 -0600 Subject: [PATCH 0413/1010] Add doc for setup-repositories Former-commit-id: d464c1c5474ce3f68ffabe9a60f5e6ba49c5bccc --- docs/cli.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/cli.md b/docs/cli.md index f7c6205f..287d6c68 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -2,6 +2,25 @@ Sub-commands and flags +## setup-repositories + +Clone a single repository: +``` +$ laconic-so setup-repositories --include cerc-io/go-ethereum +``` +Clone the repositories for a stack: +``` +$ laconic-so --stack fixturenet-eth setup-repositories +``` +Pull latest commits from origin: +``` +$ laconic-so --stack fixturenet-eth setup-repositories --pull +``` +Use SSH rather than https: +``` +$ laconic-so --stack fixturenet-eth setup-repositories --git-ssh +``` + ## build-containers Build a single container: From 99af105b9c9d4a2a087499b7a6a13b98f4b792f4 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Fri, 14 Apr 2023 21:09:22 -0600 Subject: [PATCH 0414/1010] quiet npm version warning (#331) Former-commit-id: 2eb93d09331b256c3a13f0b7f7fc9a9387dcddcf --- app/data/container-build/cerc-builder-js/Dockerfile | 3 +++ app/data/container-build/cerc-laconic-console-host/Dockerfile | 2 ++ app/data/container-build/cerc-laconic-registry-cli/Dockerfile | 2 ++ 3 files changed, 7 insertions(+) diff --git a/app/data/container-build/cerc-builder-js/Dockerfile b/app/data/container-build/cerc-builder-js/Dockerfile index d8475d2b..9e02327e 100644 --- a/app/data/container-build/cerc-builder-js/Dockerfile +++ b/app/data/container-build/cerc-builder-js/Dockerfile @@ -29,6 +29,9 @@ RUN \ usermod -u ${CERC_HOST_UID} -g ${CERC_HOST_GID} ${USERNAME} && chown ${CERC_HOST_UID}:${CERC_HOST_GID} /home/${USERNAME}; \ fi +# Prevents npm from printing version warnings +ENV NPM_CONFIG_UPDATE_NOTIFIER=false + RUN \ # Configure global npm install location, use group to adapt to UID/GID changes if ! cat /etc/group | grep -e "^npm:" > /dev/null 2>&1; then groupadd -r npm; fi \ diff --git a/app/data/container-build/cerc-laconic-console-host/Dockerfile b/app/data/container-build/cerc-laconic-console-host/Dockerfile index 66eec1f5..51a86560 100644 --- a/app/data/container-build/cerc-laconic-console-host/Dockerfile +++ b/app/data/container-build/cerc-laconic-console-host/Dockerfile @@ -12,6 +12,8 @@ ARG CERC_NPM_AUTH_TOKEN # Add NPM global to PATH. ENV PATH=${NPM_GLOBAL}/bin:${PATH} +# Prevents npm from printing version warnings +ENV NPM_CONFIG_UPDATE_NOTIFIER=false RUN \ # Configure global npm install location, use group to adapt to UID/GID changes diff --git a/app/data/container-build/cerc-laconic-registry-cli/Dockerfile b/app/data/container-build/cerc-laconic-registry-cli/Dockerfile index 213ef8f4..b7e87475 100644 --- a/app/data/container-build/cerc-laconic-registry-cli/Dockerfile +++ b/app/data/container-build/cerc-laconic-registry-cli/Dockerfile @@ -12,6 +12,8 @@ ARG CERC_NPM_AUTH_TOKEN # Add NPM global to PATH. ENV PATH=${NPM_GLOBAL}/bin:${PATH} +# Prevents npm from printing version warnings +ENV NPM_CONFIG_UPDATE_NOTIFIER=false RUN \ # Configure global npm install location, use group to adapt to UID/GID changes From 5a50e46718af089d768044e71849ed80e62f552d Mon Sep 17 00:00:00 2001 From: David Boreham Date: Sun, 16 Apr 2023 20:14:15 -0600 Subject: [PATCH 0415/1010] Support for complete laconic stack with console and test registration record (#335) * Configure cli with necessary gas and fees args and address * Update version Former-commit-id: 0068a994f63c7a420ab223dd67b969ebaa604200 --- .../docker-compose-fixturenet-laconicd.yml | 1 + .../fixturenet-laconicd/export-myaddress.sh | 2 ++ .../registry-cli-config-template.yml | 2 ++ .../cerc-laconic-registry-cli/Dockerfile | 2 ++ .../create-demo-records.sh | 29 +++++++++++++++++++ .../import-address.sh | 2 ++ .../fixturenet-laconic-loaded/README.md | 15 ++++++++++ .../fixturenet-laconic-loaded/stack.yml | 4 ++- app/data/stacks/fixturenet-laconicd/stack.yml | 1 + 9 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 app/data/config/fixturenet-laconicd/export-myaddress.sh create mode 100755 app/data/container-build/cerc-laconic-registry-cli/create-demo-records.sh create mode 100644 app/data/container-build/cerc-laconic-registry-cli/import-address.sh diff --git a/app/data/compose/docker-compose-fixturenet-laconicd.yml b/app/data/compose/docker-compose-fixturenet-laconicd.yml index 5d777b5d..9a974e90 100644 --- a/app/data/compose/docker-compose-fixturenet-laconicd.yml +++ b/app/data/compose/docker-compose-fixturenet-laconicd.yml @@ -8,6 +8,7 @@ services: # TODO: look at folding these scripts into the container - ../config/fixturenet-laconicd/create-fixturenet.sh:/docker-entrypoint-scripts.d/create-fixturenet.sh - ../config/fixturenet-laconicd/export-mykey.sh:/docker-entrypoint-scripts.d/export-mykey.sh + - ../config/fixturenet-laconicd/export-myaddress.sh:/docker-entrypoint-scripts.d/export-myaddress.sh # TODO: determine which of the ports below is really needed ports: - "6060" diff --git a/app/data/config/fixturenet-laconicd/export-myaddress.sh b/app/data/config/fixturenet-laconicd/export-myaddress.sh new file mode 100644 index 00000000..e454c0b0 --- /dev/null +++ b/app/data/config/fixturenet-laconicd/export-myaddress.sh @@ -0,0 +1,2 @@ +#!/bin/sh +laconicd keys show mykey | grep address | cut -d ' ' -f 3 diff --git a/app/data/config/fixturenet-laconicd/registry-cli-config-template.yml b/app/data/config/fixturenet-laconicd/registry-cli-config-template.yml index 6074cc6d..16432c18 100644 --- a/app/data/config/fixturenet-laconicd/registry-cli-config-template.yml +++ b/app/data/config/fixturenet-laconicd/registry-cli-config-template.yml @@ -5,3 +5,5 @@ services: userKey: REPLACE_WITH_MYKEY bondId: chainId: laconic_9000-1 + gas: 250000 + fees: 200000aphoton diff --git a/app/data/container-build/cerc-laconic-registry-cli/Dockerfile b/app/data/container-build/cerc-laconic-registry-cli/Dockerfile index b7e87475..da7ff19a 100644 --- a/app/data/container-build/cerc-laconic-registry-cli/Dockerfile +++ b/app/data/container-build/cerc-laconic-registry-cli/Dockerfile @@ -55,7 +55,9 @@ RUN yarn global add @cerc-io/laconic-registry-cli # Add scripts RUN mkdir /scripts ENV PATH="${PATH}:/scripts" +COPY ./create-demo-records.sh /scripts COPY ./import-key.sh /scripts +COPY ./import-address.sh /scripts # Default command sleeps forever so docker doesn't kill it CMD ["sh", "-c", "while :; do sleep 600; done"] diff --git a/app/data/container-build/cerc-laconic-registry-cli/create-demo-records.sh b/app/data/container-build/cerc-laconic-registry-cli/create-demo-records.sh new file mode 100755 index 00000000..0d90da8d --- /dev/null +++ b/app/data/container-build/cerc-laconic-registry-cli/create-demo-records.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +# Create some demo/test records in the registry +set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi +registry_command="laconic cns" +record_1_filename=demo-record-1.yml +cat < ${record_1_filename} +record: + type: WebsiteRegistrationRecord + url: 'https://cerc.io' + repo_registration_record_cid: QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D + build_artifact_cid: QmP8jTG1m9GSDJLCbeWhVSVgEzCPPwXRdCRuJtQ5Tz9Kc9 + tls_cert_cid: QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR + version: 1.0.23 +EOF +# Check we have funds +funds_response=$(${registry_command} account get --address $(cat my-address.txt)) +funds_balance=$(echo ${funds_response} | jq -r .[0].balance[0].quantity) +echo "Balance is: ${funds_balance}" +# Create a bond +bond_create_result=$(${registry_command} bond create --type aphoton --quantity 1000000000) +bond_id=$(echo ${bond_create_result} | jq -r .bondId) +echo "Created bond with id: ${bond_id}" +# Publish a demo record +publish_response=$(${registry_command} record publish --filename ${record_1_filename} --bond-id ${bond_id}) +published_record_id=$(echo ${publish_response} | jq -r .id) +echo "Published ${record_1_filename} with id: ${published_record_id}" diff --git a/app/data/container-build/cerc-laconic-registry-cli/import-address.sh b/app/data/container-build/cerc-laconic-registry-cli/import-address.sh new file mode 100644 index 00000000..06b5d08d --- /dev/null +++ b/app/data/container-build/cerc-laconic-registry-cli/import-address.sh @@ -0,0 +1,2 @@ +#!/bin/sh +echo ${1} > my-address.txt diff --git a/app/data/stacks/fixturenet-laconic-loaded/README.md b/app/data/stacks/fixturenet-laconic-loaded/README.md index 000596ee..a2e48efb 100644 --- a/app/data/stacks/fixturenet-laconic-loaded/README.md +++ b/app/data/stacks/fixturenet-laconic-loaded/README.md @@ -48,3 +48,18 @@ $ laconic-so --stack fixturenet-laconicd deploy logs ``` $ laconic-so --stack fixturenet-laconicd deploy exec cli "laconic cns status" ``` +## 7. View the laconic console +Get the URL for the console web app with this command (the port number will be different for each deployment): +``` +$ echo http://localhost:$(laconic-so --stack fixturenet-laconic-loaded deploy port laconic-console 80 | cut -d ':' -f 2) +http://localhost:58364 +``` +Open that address with a browser. The console should display +## 8. Load demo data into the registry +``` +$ laconic-so --stack fixturenet-laconic-loaded deploy exec cli ./scripts/create-demo-records.sh +Balance is: 99998999999999998999600000 +Created bond with id: dd88e8d6f9567b32b28e70552aea4419c5dd3307ebae85a284d1fe38904e301a +Published demo-record-1.yml with id: bafyreierh3xnfivexlscdwubvczmddsnf46uytyfvrbdhkjzztvsz6ruly +``` +The published record should be visible in the console. \ No newline at end of file diff --git a/app/data/stacks/fixturenet-laconic-loaded/stack.yml b/app/data/stacks/fixturenet-laconic-loaded/stack.yml index 03d0a4c9..009212f0 100644 --- a/app/data/stacks/fixturenet-laconic-loaded/stack.yml +++ b/app/data/stacks/fixturenet-laconic-loaded/stack.yml @@ -1,4 +1,4 @@ -version: "1.0" +version: "1.1" name: fixturenet-laconic-loaded description: "A full featured laconic fixturenet" repos: @@ -28,3 +28,5 @@ pods: config: cli: key: laconicd.mykey + address: laconicd.myaddress + diff --git a/app/data/stacks/fixturenet-laconicd/stack.yml b/app/data/stacks/fixturenet-laconicd/stack.yml index 86fb2144..54c5dba6 100644 --- a/app/data/stacks/fixturenet-laconicd/stack.yml +++ b/app/data/stacks/fixturenet-laconicd/stack.yml @@ -16,3 +16,4 @@ pods: config: cli: key: laconicd.mykey + address: laconicd.myaddress From ecb3b363877909413331777e3130e35a76408266 Mon Sep 17 00:00:00 2001 From: Zach Date: Mon, 17 Apr 2023 11:25:21 -0400 Subject: [PATCH 0416/1010] Update README.md Former-commit-id: dd59579b876f88e6b748c4308a782e5b1f86ee7a --- app/data/stacks/fixturenet-laconic-loaded/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/data/stacks/fixturenet-laconic-loaded/README.md b/app/data/stacks/fixturenet-laconic-loaded/README.md index a2e48efb..2fc21594 100644 --- a/app/data/stacks/fixturenet-laconic-loaded/README.md +++ b/app/data/stacks/fixturenet-laconic-loaded/README.md @@ -19,6 +19,7 @@ Detailed instructions can be found [here](../build-support/README.md). For the i ``` $ laconic-so --stack build-support build-containers --exclude cerc/builder-gerbil $ laconic-so --stack package-registry setup-repositories +$ laconic-so --stack package-registry build-containers $ laconic-so --stack package-registry deploy-system up ``` Then add the localhost alias `gitea.local` and set `CERC_NPM_AUTH_TOKEN` to the token printed when the package-registry stack was deployed above: @@ -62,4 +63,4 @@ Balance is: 99998999999999998999600000 Created bond with id: dd88e8d6f9567b32b28e70552aea4419c5dd3307ebae85a284d1fe38904e301a Published demo-record-1.yml with id: bafyreierh3xnfivexlscdwubvczmddsnf46uytyfvrbdhkjzztvsz6ruly ``` -The published record should be visible in the console. \ No newline at end of file +The published record should be visible in the console. From f537cdbe297531d469d6364d71f4c265ffe17efd Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 17 Apr 2023 10:06:25 -0600 Subject: [PATCH 0417/1010] Add note on developer-mode-setup script Former-commit-id: e4b57b58153e2967c1e6061efda76eab7f89d29d --- docs/CONTRIBUTING.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 93437364..633fc30f 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -34,7 +34,9 @@ In addition to the pre-requisites listed in the [README](/README.md), the follow $ cd stack-orchestrator ``` -3. Create and activate a venv: +3. (This and the next step can be done by running `source ./scripts/developer-mode-setup.sh`) + + Create and activate a venv: ``` $ python3 -m venv venv $ source ./venv/bin/activate From 7673de73bb0782a1e5ec6b25e6029ccfd61f1768 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 17 Apr 2023 13:11:45 -0600 Subject: [PATCH 0418/1010] Add github actions Former-commit-id: fcbea7984f3eec9e203e9c5df9b99cc44204576b --- .github/workflows/publish.yml | 46 +++++++++++++++++++++++++++++++++++ .github/workflows/test.yml | 29 ++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 .github/workflows/publish.yml create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 00000000..8dde6e41 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,46 @@ +name: Publish + +on: + push: + branches: + - main + - publish-test + +jobs: + publish: + name: "Build and publish" + runs-on: ubuntu-latest + steps: + - name: "Clone project repository" + uses: actions/checkout@v3 + - name: "Get build info" + id: build-info + run: | + build_tag=$(./scripts/create_build_tag_file.sh) + echo "build-tag=v${build_tag}" >> $GITHUB_OUTPUT + - name: "Install Python" + uses: actions/setup-python@v4 + with: + python-version: '3.8' + - name: "Print Python version" + run: python3 --version + - name: "Install shiv" + run: pip install shiv + - name: "Build local shiv package" + id: build + run: | + ./scripts/build_shiv_package.sh + result_code=$? + echo "package-file=$(ls ./package/*)" >> $GITHUB_OUTPUT + exit $result_code + - name: "Stage artifact file" + run: | + cp ${{ steps.build.outputs.package-file }} ./laconic-so + - name: "Create release" + uses: softprops/action-gh-release@v1 + with: + tag_name: ${{ steps.build-info.outputs.build-tag }} + # On the publish test branch, mark our release as a draft + # Hack using endsWith to workaround Gitea sometimes sending "publish-test" vs "refs/heads/publish-test" + draft: ${{ endsWith('publish-test', github.ref ) }} + files: ./laconic-so diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..c6284900 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,29 @@ +name: Test + +on: + pull_request: + branches: '*' + push: + branches: '*' + +jobs: + test: + name: "Run basic test suite" + runs-on: ubuntu-latest + steps: + - name: "Clone project repository" + uses: actions/checkout@v3 + - name: "Install Python" + uses: actions/setup-python@v4 + with: + python-version: '3.8' + - name: "Print Python version" + run: python3 --version + - name: "Install shiv" + run: pip install shiv + - name: "Generate build version file" + run: ./scripts/create_build_tag_file.sh + - name: "Build local shiv package" + run: ./scripts/build_shiv_package.sh + - name: "Run smoke tests" + run: ./tests/smoke-test/run-smoke-test.sh From c715e11a88b558afac6db93386d6277aa101b840 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 17 Apr 2023 13:40:49 -0600 Subject: [PATCH 0419/1010] Use CERC_NPM_REGISTRY_URL everywhere (#340) Former-commit-id: 39a54bc62a90c9fdf5e7b53e9c9cfaba656d5d8a --- app/build_containers.py | 2 +- .../container-build/cerc-laconic-console-host/Dockerfile | 8 ++++---- .../container-build/cerc-laconic-console-host/build.sh | 2 +- .../container-build/cerc-laconic-registry-cli/Dockerfile | 8 ++++---- .../container-build/cerc-laconic-registry-cli/build.sh | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/build_containers.py b/app/build_containers.py index 3a47a6da..ea16c3c9 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -84,7 +84,7 @@ def command(ctx, include, exclude, force_rebuild, extra_build_args): # TODO: make this configurable container_build_env = { - "CERC_NPM_URL": "http://gitea.local:3000/api/packages/cerc-io/npm/", + "CERC_NPM_REGISTRY_URL": config("CERC_NPM_REGISTRY_URL", default="http://gitea.local:3000/api/packages/cerc-io/npm/"), "CERC_NPM_AUTH_TOKEN": config("CERC_NPM_AUTH_TOKEN", default=""), "CERC_REPO_BASE_DIR": dev_root_path, "CERC_CONTAINER_BASE_DIR": container_build_dir, diff --git a/app/data/container-build/cerc-laconic-console-host/Dockerfile b/app/data/container-build/cerc-laconic-console-host/Dockerfile index 51a86560..a31aa265 100644 --- a/app/data/container-build/cerc-laconic-console-host/Dockerfile +++ b/app/data/container-build/cerc-laconic-console-host/Dockerfile @@ -7,7 +7,7 @@ ARG USERNAME=node ARG NPM_GLOBAL=/usr/local/share/npm-global # This container pulls npm packages from a local registry configured via these env vars -ARG CERC_NPM_URL +ARG CERC_NPM_REGISTRY_URL ARG CERC_NPM_AUTH_TOKEN # Add NPM global to PATH. @@ -49,9 +49,9 @@ COPY ./start-serving-app.sh /scripts # RUN su node -c "npm install -g " # Configure the local npm registry -RUN npm config set @cerc-io:registry ${CERC_NPM_URL} \ - && npm config set @lirewine:registry ${CERC_NPM_URL} \ - && npm config set -- ${CERC_NPM_URL}:_authToken ${CERC_NPM_AUTH_TOKEN} +RUN npm config set @cerc-io:registry ${CERC_NPM_REGISTRY_URL} \ + && npm config set @lirewine:registry ${CERC_NPM_REGISTRY_URL} \ + && npm config set -- ${CERC_NPM_REGISTRY_URL}:_authToken ${CERC_NPM_AUTH_TOKEN} RUN mkdir -p /config COPY ./config.yml /config diff --git a/app/data/container-build/cerc-laconic-console-host/build.sh b/app/data/container-build/cerc-laconic-console-host/build.sh index a321b195..77a38917 100755 --- a/app/data/container-build/cerc-laconic-console-host/build.sh +++ b/app/data/container-build/cerc-laconic-console-host/build.sh @@ -8,4 +8,4 @@ SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) docker build -t cerc/laconic-console-host:local ${build_command_args} -f ${SCRIPT_DIR}/Dockerfile \ --add-host gitea.local:host-gateway \ - --build-arg CERC_NPM_AUTH_TOKEN --build-arg CERC_NPM_URL ${SCRIPT_DIR} + --build-arg CERC_NPM_AUTH_TOKEN --build-arg CERC_NPM_REGISTRY_URL ${SCRIPT_DIR} diff --git a/app/data/container-build/cerc-laconic-registry-cli/Dockerfile b/app/data/container-build/cerc-laconic-registry-cli/Dockerfile index da7ff19a..7859adb4 100644 --- a/app/data/container-build/cerc-laconic-registry-cli/Dockerfile +++ b/app/data/container-build/cerc-laconic-registry-cli/Dockerfile @@ -7,7 +7,7 @@ ARG USERNAME=node ARG NPM_GLOBAL=/usr/local/share/npm-global # This container pulls npm packages from a local registry configured via these env vars -ARG CERC_NPM_URL +ARG CERC_NPM_REGISTRY_URL ARG CERC_NPM_AUTH_TOKEN # Add NPM global to PATH. @@ -42,9 +42,9 @@ RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ # RUN su node -c "npm install -g " # Configure the local npm registry -RUN npm config set @cerc-io:registry ${CERC_NPM_URL} \ - && npm config set @lirewine:registry ${CERC_NPM_URL} \ - && npm config set -- ${CERC_NPM_URL}:_authToken ${CERC_NPM_AUTH_TOKEN} +RUN npm config set @cerc-io:registry ${CERC_NPM_REGISTRY_URL} \ + && npm config set @lirewine:registry ${CERC_NPM_REGISTRY_URL} \ + && npm config set -- ${CERC_NPM_REGISTRY_URL}:_authToken ${CERC_NPM_AUTH_TOKEN} # TODO: the image at this point could be made a base image for several different CLI images # that install different Node-based CLI commands diff --git a/app/data/container-build/cerc-laconic-registry-cli/build.sh b/app/data/container-build/cerc-laconic-registry-cli/build.sh index a6264f4b..c9379856 100755 --- a/app/data/container-build/cerc-laconic-registry-cli/build.sh +++ b/app/data/container-build/cerc-laconic-registry-cli/build.sh @@ -8,4 +8,4 @@ SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) docker build -t cerc/laconic-registry-cli:local ${build_command_args} -f ${SCRIPT_DIR}/Dockerfile \ --add-host gitea.local:host-gateway \ - --build-arg CERC_NPM_AUTH_TOKEN --build-arg CERC_NPM_URL ${SCRIPT_DIR} + --build-arg CERC_NPM_AUTH_TOKEN --build-arg CERC_NPM_REGISTRY_URL ${SCRIPT_DIR} From c7a4d3f4e75a5427c7e64caf242a0fd01b8c473a Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 17 Apr 2023 13:53:16 -0600 Subject: [PATCH 0420/1010] Default token needs to be empty string (#341) Former-commit-id: 99aa1fa27e068a10726d15f355d554e015579033 --- app/build_containers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build_containers.py b/app/build_containers.py index ea16c3c9..5e8495cb 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -85,7 +85,7 @@ def command(ctx, include, exclude, force_rebuild, extra_build_args): # TODO: make this configurable container_build_env = { "CERC_NPM_REGISTRY_URL": config("CERC_NPM_REGISTRY_URL", default="http://gitea.local:3000/api/packages/cerc-io/npm/"), - "CERC_NPM_AUTH_TOKEN": config("CERC_NPM_AUTH_TOKEN", default=""), + "CERC_NPM_AUTH_TOKEN": config("CERC_NPM_AUTH_TOKEN", default=""), "CERC_REPO_BASE_DIR": dev_root_path, "CERC_CONTAINER_BASE_DIR": container_build_dir, "CERC_HOST_UID": f"{os.getuid()}", From cb72e5c03f647de6412d088a31412e6bdb6c3860 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Mon, 17 Apr 2023 20:46:05 -0600 Subject: [PATCH 0421/1010] Simple implementation of LACONIC_HOSTED_ENDPOINT (#342) Former-commit-id: 172300d7bd64ea14e912af88a2c2e6e3113c5ea0 --- .../compose/docker-compose-fixturenet-laconic-console.yml | 2 ++ .../cerc-laconic-console-host/apply-webapp-config.sh | 5 +++-- .../container-build/cerc-laconic-console-host/config.yml | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/data/compose/docker-compose-fixturenet-laconic-console.yml b/app/data/compose/docker-compose-fixturenet-laconic-console.yml index f402fa70..23185957 100644 --- a/app/data/compose/docker-compose-fixturenet-laconic-console.yml +++ b/app/data/compose/docker-compose-fixturenet-laconic-console.yml @@ -2,5 +2,7 @@ services: laconic-console: restart: unless-stopped image: cerc/laconic-console-host:local + environment: + - LACONIC_HOSTED_ENDPOINT=${LACONIC_HOSTED_ENDPOINT:-http://localhost} ports: - "80" diff --git a/app/data/container-build/cerc-laconic-console-host/apply-webapp-config.sh b/app/data/container-build/cerc-laconic-console-host/apply-webapp-config.sh index d01b655d..bf041708 100755 --- a/app/data/container-build/cerc-laconic-console-host/apply-webapp-config.sh +++ b/app/data/container-build/cerc-laconic-console-host/apply-webapp-config.sh @@ -26,9 +26,10 @@ do kv_pair=(${kv_pair_string//=/ }) template_string_to_replace=${kv_pair[0]} template_value_to_substitute=${kv_pair[1]} + template_value_to_substitute_expanded=${template_value_to_substitute//LACONIC_HOSTED_ENDPOINT/${LACONIC_HOSTED_ENDPOINT}} # Run find and sed to do the substitution of one variable over all files # See: https://stackoverflow.com/a/21479607/1701505 - echo "Substituting: ${template_string_to_replace} = ${template_value_to_substitute}" + echo "Substituting: ${template_string_to_replace} = ${template_value_to_substitute_expanded}" # Note: we do not escape our strings, on the expectation they do not container the '#' char. - find ${webapp_files_dir} -type f -exec sed -i 's#'${template_string_to_replace}'#'${template_value_to_substitute}'#g' {} + + find ${webapp_files_dir} -type f -exec sed -i 's#'${template_string_to_replace}'#'${template_value_to_substitute_expanded}'#g' {} + done diff --git a/app/data/container-build/cerc-laconic-console-host/config.yml b/app/data/container-build/cerc-laconic-console-host/config.yml index da57724a..d557ace5 100644 --- a/app/data/container-build/cerc-laconic-console-host/config.yml +++ b/app/data/container-build/cerc-laconic-console-host/config.yml @@ -2,5 +2,5 @@ services: wns: - server: 'http://localhost:9473/api' - webui: 'http://localhost:9473/console' + server: 'LACONIC_HOSTED_ENDPOINT:9473/api' + webui: 'LACONIC_HOSTED_ENDPOINT:9473/console' From b0aeff50bbef1497cfe2aaafb82414b92409c5d8 Mon Sep 17 00:00:00 2001 From: Nabarun Gogoi Date: Tue, 18 Apr 2023 18:25:58 +0530 Subject: [PATCH 0422/1010] Package mobymask-v2 stack web-apps similar to laconic-console app (#310) * Build MobyMask web-app at container build step * Fix web-app start script to use env variables in config * Replace variables in built web-app files * Use published mobymask-ui package from gitea * Use published react-peer/test-app from gitea * Remove local gitea publish TODO Former-commit-id: cf79f0de0adccbd8812ed23a3d0a013cd5af7ff8 --- .../compose/docker-compose-mobymask-app.yml | 11 ++-- .../compose/docker-compose-peer-test-app.yml | 9 ++- .../mobymask-app-config.json | 7 --- .../watcher-mobymask-v2/mobymask-app-start.sh | 17 +++--- .../watcher-mobymask-v2/test-app-start.sh | 10 +--- .../cerc-mobymask-ui/Dockerfile | 59 ++++++++++++++++--- .../cerc-mobymask-ui/apply-webapp-config.sh | 42 +++++++++++++ .../container-build/cerc-mobymask-ui/build.sh | 5 +- .../cerc-mobymask-ui/start-serving-app.sh | 9 +++ .../cerc-react-peer/Dockerfile | 30 +++++++--- .../cerc-react-peer/apply-webapp-config.sh | 42 +++++++++++++ .../container-build/cerc-react-peer/build.sh | 5 +- .../cerc-react-peer/start-serving-app.sh | 9 +++ .../fixturenet-laconic-loaded/README.md | 2 +- app/data/stacks/mobymask-v2/README.md | 4 +- app/data/stacks/mobymask-v2/web-apps.md | 6 +- 16 files changed, 210 insertions(+), 57 deletions(-) delete mode 100644 app/data/config/watcher-mobymask-v2/mobymask-app-config.json create mode 100755 app/data/container-build/cerc-mobymask-ui/apply-webapp-config.sh create mode 100755 app/data/container-build/cerc-mobymask-ui/start-serving-app.sh create mode 100755 app/data/container-build/cerc-react-peer/apply-webapp-config.sh create mode 100755 app/data/container-build/cerc-react-peer/start-serving-app.sh diff --git a/app/data/compose/docker-compose-mobymask-app.yml b/app/data/compose/docker-compose-mobymask-app.yml index df14d7db..6df48130 100644 --- a/app/data/compose/docker-compose-mobymask-app.yml +++ b/app/data/compose/docker-compose-mobymask-app.yml @@ -3,6 +3,7 @@ version: '3.2' services: # Builds and serves the MobyMask react-app mobymask-app: + restart: unless-stopped image: cerc/mobymask-ui:local env_file: - ../config/watcher-mobymask-v2/mobymask-params.env @@ -12,6 +13,7 @@ services: CERC_DEPLOYED_CONTRACT: ${CERC_DEPLOYED_CONTRACT} CERC_APP_WATCHER_URL: ${CERC_APP_WATCHER_URL} CERC_RELAY_NODES: ${CERC_RELAY_NODES} + working_dir: /scripts # Waits for watcher server to be up before app build # Required when running with watcher stack to get deployed contract address command: @@ -19,15 +21,14 @@ services: - -c - ./wait-for-it.sh -h ${CERC_WATCHER_HOST:-$${DEFAULT_CERC_WATCHER_HOST}} -p ${CERC_WATCHER_PORT:-$${DEFAULT_CERC_WATCHER_PORT}} -s -t 0 -- ./mobymask-app-start.sh volumes: - - ../config/wait-for-it.sh:/app/wait-for-it.sh - - ../config/watcher-mobymask-v2/mobymask-app-config.json:/app/src/mobymask-app-config.json - - ../config/watcher-mobymask-v2/mobymask-app-start.sh:/app/mobymask-app-start.sh + - ../config/wait-for-it.sh:/scripts/wait-for-it.sh + - ../config/watcher-mobymask-v2/mobymask-app-start.sh:/scripts/mobymask-app-start.sh - peers_ids:/peers - mobymask_deployment:/server ports: - - "0.0.0.0:3002:3000" + - "0.0.0.0:3002:80" healthcheck: - test: ["CMD", "nc", "-v", "localhost", "3000"] + test: ["CMD", "nc", "-v", "localhost", "80"] interval: 20s timeout: 5s retries: 15 diff --git a/app/data/compose/docker-compose-peer-test-app.yml b/app/data/compose/docker-compose-peer-test-app.yml index 7d1b89d6..0a8d1c65 100644 --- a/app/data/compose/docker-compose-peer-test-app.yml +++ b/app/data/compose/docker-compose-peer-test-app.yml @@ -4,7 +4,7 @@ services: peer-test-app: # Builds and serves the peer-test react-app image: cerc/react-peer:local - working_dir: /app/packages/test-app + working_dir: /scripts env_file: - ../config/watcher-mobymask-v2/mobymask-params.env environment: @@ -12,13 +12,12 @@ services: CERC_RELAY_NODES: ${CERC_RELAY_NODES} command: ["sh", "./test-app-start.sh"] volumes: - - ../config/watcher-mobymask-v2/test-app-config.json:/app/packages/test-app/src/test-app-config.json - - ../config/watcher-mobymask-v2/test-app-start.sh:/app/packages/test-app/test-app-start.sh + - ../config/watcher-mobymask-v2/test-app-start.sh:/scripts/test-app-start.sh - peers_ids:/peers ports: - - "0.0.0.0:3003:3000" + - "0.0.0.0:3003:80" healthcheck: - test: ["CMD", "nc", "-v", "localhost", "3000"] + test: ["CMD", "nc", "-v", "localhost", "80"] interval: 20s timeout: 5s retries: 15 diff --git a/app/data/config/watcher-mobymask-v2/mobymask-app-config.json b/app/data/config/watcher-mobymask-v2/mobymask-app-config.json deleted file mode 100644 index ed913b51..00000000 --- a/app/data/config/watcher-mobymask-v2/mobymask-app-config.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "MobyMask", - "relayNodes": [], - "peer": { - "enableDebugInfo": true - } -} diff --git a/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh b/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh index c494ed5c..0437d22d 100755 --- a/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh +++ b/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env bash set -e if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x @@ -28,13 +28,10 @@ else echo "Taking deployed contract details from env" fi -# Export config values in a json file -jq --arg address "$CERC_DEPLOYED_CONTRACT" \ - --argjson chainId "$CERC_CHAIN_ID" \ - --argjson relayNodes "$CERC_RELAY_NODES" \ - '.address = $address | .chainId = $chainId | .relayNodes = $relayNodes' \ - /app/src/mobymask-app-config.json > /app/src/config.json +# Use yq to create config.yml with environment variables +yq -n ".address = env(CERC_DEPLOYED_CONTRACT)" > /config/config.yml +yq ".watcherUrl = env(CERC_APP_WATCHER_URL)" -i /config/config.yml +yq ".chainId = env(CERC_CHAIN_ID)" -i /config/config.yml +yq ".relayNodes = strenv(CERC_RELAY_NODES)" -i /config/config.yml -REACT_APP_WATCHER_URI="$CERC_APP_WATCHER_URL/graphql" npm run build - -serve -s build +/scripts/start-serving-app.sh diff --git a/app/data/config/watcher-mobymask-v2/test-app-start.sh b/app/data/config/watcher-mobymask-v2/test-app-start.sh index ef7aa539..42e4397d 100755 --- a/app/data/config/watcher-mobymask-v2/test-app-start.sh +++ b/app/data/config/watcher-mobymask-v2/test-app-start.sh @@ -14,11 +14,7 @@ fi echo "Using CERC_RELAY_NODES $CERC_RELAY_NODES" -# Set relay nodes in config using CERC_RELAY_NODES -jq --argjson relayNodes "$CERC_RELAY_NODES" \ - '.relayNodes = $relayNodes' \ - ./src/test-app-config.json > ./src/config.json +# Use yq to create config.yml with environment variables +yq -n ".relayNodes = strenv(CERC_RELAY_NODES)" > /config/config.yml -yarn build - -serve -s build +/scripts/start-serving-app.sh diff --git a/app/data/container-build/cerc-mobymask-ui/Dockerfile b/app/data/container-build/cerc-mobymask-ui/Dockerfile index c04b001d..3f04ec45 100644 --- a/app/data/container-build/cerc-mobymask-ui/Dockerfile +++ b/app/data/container-build/cerc-mobymask-ui/Dockerfile @@ -1,14 +1,57 @@ -FROM node:18.15.0-alpine3.16 +# Originally from: https://github.com/devcontainers/images/blob/main/src/javascript-node/.devcontainer/Dockerfile +# [Choice] Node.js version (use -bullseye variants on local arm64/Apple Silicon): 18, 16, 14, 18-bullseye, 16-bullseye, 14-bullseye, 18-buster, 16-buster, 14-buster +ARG VARIANT=16-bullseye +FROM node:${VARIANT} -RUN apk --update --no-cache add make git jq bash +ARG USERNAME=node +ARG NPM_GLOBAL=/usr/local/share/npm-global -WORKDIR /app +# This container pulls npm package from a registry configured via env var +ARG CERC_NPM_REGISTRY_URL -COPY . . +# Add NPM global to PATH. +ENV PATH=${NPM_GLOBAL}/bin:${PATH} +# Prevents npm from printing version warnings +ENV NPM_CONFIG_UPDATE_NOTIFIER=false -RUN npm install -g serve +RUN \ + # Configure global npm install location, use group to adapt to UID/GID changes + if ! cat /etc/group | grep -e "^npm:" > /dev/null 2>&1; then groupadd -r npm; fi \ + && usermod -a -G npm ${USERNAME} \ + && umask 0002 \ + && mkdir -p ${NPM_GLOBAL} \ + && touch /usr/local/etc/npmrc \ + && chown ${USERNAME}:npm ${NPM_GLOBAL} /usr/local/etc/npmrc \ + && chmod g+s ${NPM_GLOBAL} \ + && npm config -g set prefix ${NPM_GLOBAL} \ + && su ${USERNAME} -c "npm config -g set prefix ${NPM_GLOBAL}" \ + # Install eslint + && su ${USERNAME} -c "umask 0002 && npm install -g eslint" \ + && npm cache clean --force > /dev/null 2>&1 -RUN echo "Building mobymask-ui" && \ - npm install +# Install additional OS packages. +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ + && apt-get -y install --no-install-recommends jq bash -WORKDIR /app +# We do this to get a yq binary from the published container, for the correct architecture we're building here +COPY --from=docker.io/mikefarah/yq:latest /usr/bin/yq /usr/local/bin/yq + +RUN mkdir -p /scripts +COPY ./apply-webapp-config.sh /scripts +COPY ./start-serving-app.sh /scripts + +# Configure the local npm registry +RUN npm config set @cerc-io:registry ${CERC_NPM_REGISTRY_URL} + +RUN mkdir -p /config + +# Install simple web server for now (use nginx perhaps later) +RUN yarn global add http-server + +# Globally install the payload web app package +RUN yarn global add @cerc-io/mobymask-ui + +# Expose port for http +EXPOSE 80 + +CMD ["/scripts/start-serving-app.sh"] diff --git a/app/data/container-build/cerc-mobymask-ui/apply-webapp-config.sh b/app/data/container-build/cerc-mobymask-ui/apply-webapp-config.sh new file mode 100755 index 00000000..9f32cd23 --- /dev/null +++ b/app/data/container-build/cerc-mobymask-ui/apply-webapp-config.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi +if [[ $# -ne 3 ]]; then + echo "Illegal number of parameters" >&2 + exit 1 +fi +config_file_name=$1 +webapp_files_dir=$2 +config_prefix=$3 +if ! [[ -f ${config_file_name} ]]; then + echo "Config file ${config_file_name} does not exist" >&2 + exit 1 +fi +if ! [[ -d ${webapp_files_dir} ]]; then + echo "Webapp directory ${webapp_files_dir} does not exist" >&2 + exit 1 +fi +# First some magic using sed to translate our yaml config file into an array of key value pairs like: +# ${config_prefix}= +# sed "s/'//g" is used to remove single quote for relayNodes value +readarray -t config_kv_pair_array < <( sed -E 's/([^:]+):\s*(.*)/\1=\2/g' ${config_file_name} | sed "s/'//g" | sed "s/^/${config_prefix}_/" ) +declare -p config_kv_pair_array +# Then iterate over that kv array making the template substitution in our web app files +for kv_pair_string in "${config_kv_pair_array[@]}" +do + kv_pair=(${kv_pair_string//=/ }) + template_string_to_replace=${kv_pair[0]} + template_value_to_substitute=${kv_pair[1]} + # Run find and sed to do the substitution of one variable over all files + # See: https://stackoverflow.com/a/21479607/1701505 + echo "Substituting: ${template_string_to_replace} = ${template_value_to_substitute}" + + # TODO: Pass keys to be replaced without double quotes + if [[ "$template_string_to_replace" =~ ^${config_prefix}_(relayNodes|chainId)$ ]]; then + find ${webapp_files_dir} -type f -exec sed -i 's#"'"${template_string_to_replace}"'"#'"${template_value_to_substitute}"'#g' {} + + else + # Note: we do not escape our strings, on the expectation they do not container the '#' char. + find ${webapp_files_dir} -type f -exec sed -i 's#'${template_string_to_replace}'#'${template_value_to_substitute}'#g' {} + + fi +done diff --git a/app/data/container-build/cerc-mobymask-ui/build.sh b/app/data/container-build/cerc-mobymask-ui/build.sh index 52687093..7628ff5c 100755 --- a/app/data/container-build/cerc-mobymask-ui/build.sh +++ b/app/data/container-build/cerc-mobymask-ui/build.sh @@ -6,4 +6,7 @@ source ${CERC_CONTAINER_BASE_DIR}/build-base.sh # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/mobymask-ui:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/mobymask-ui +CERC_NPM_REGISTRY_URL="https://git.vdb.to/api/packages/cerc-io/npm/" + +docker build -t cerc/mobymask-ui:local ${build_command_args} -f ${SCRIPT_DIR}/Dockerfile \ + --build-arg CERC_NPM_REGISTRY_URL ${SCRIPT_DIR} diff --git a/app/data/container-build/cerc-mobymask-ui/start-serving-app.sh b/app/data/container-build/cerc-mobymask-ui/start-serving-app.sh new file mode 100755 index 00000000..4e0a976c --- /dev/null +++ b/app/data/container-build/cerc-mobymask-ui/start-serving-app.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi + +# TODO: Don't hard wire this: +webapp_files_dir=/usr/local/share/.config/yarn/global/node_modules/@cerc-io/mobymask-ui/build +/scripts/apply-webapp-config.sh /config/config.yml ${webapp_files_dir} MOBYMASK_HOSTED_CONFIG +http-server -p 80 ${webapp_files_dir} diff --git a/app/data/container-build/cerc-react-peer/Dockerfile b/app/data/container-build/cerc-react-peer/Dockerfile index fcc198f3..f60ba504 100644 --- a/app/data/container-build/cerc-react-peer/Dockerfile +++ b/app/data/container-build/cerc-react-peer/Dockerfile @@ -1,14 +1,30 @@ FROM node:18.15.0-alpine3.16 -RUN apk --update --no-cache add make git python3 jq +# This container pulls npm package from a registry configured via env var +ARG CERC_NPM_REGISTRY_URL -WORKDIR /app +RUN apk --update --no-cache add make git python3 jq bash -COPY . . +# We do this to get a yq binary from the published container, for the correct architecture we're building here +COPY --from=docker.io/mikefarah/yq:latest /usr/bin/yq /usr/local/bin/yq -RUN yarn global add serve +RUN mkdir -p /scripts +COPY ./apply-webapp-config.sh /scripts +COPY ./start-serving-app.sh /scripts -RUN echo "Building react-peer" && \ - yarn install --ignore-scripts && yarn build --ignore @cerc-io/test-app +# Configure the local npm registry +RUN npm config set @cerc-io:registry ${CERC_NPM_REGISTRY_URL} -WORKDIR /app +RUN mkdir -p /config + +# Install simple web server for now (use nginx perhaps later) +RUN yarn global add http-server + +# Globally install the payload web app package +RUN yarn global add @cerc-io/test-app + + +# Expose port for http +EXPOSE 80 + +CMD ["/scripts/start-serving-app.sh"] diff --git a/app/data/container-build/cerc-react-peer/apply-webapp-config.sh b/app/data/container-build/cerc-react-peer/apply-webapp-config.sh new file mode 100755 index 00000000..a7f0a28e --- /dev/null +++ b/app/data/container-build/cerc-react-peer/apply-webapp-config.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi +if [[ $# -ne 3 ]]; then + echo "Illegal number of parameters" >&2 + exit 1 +fi +config_file_name=$1 +webapp_files_dir=$2 +config_prefix=$3 +if ! [[ -f ${config_file_name} ]]; then + echo "Config file ${config_file_name} does not exist" >&2 + exit 1 +fi +if ! [[ -d ${webapp_files_dir} ]]; then + echo "Webapp directory ${webapp_files_dir} does not exist" >&2 + exit 1 +fi +# First some magic using sed to translate our yaml config file into an array of key value pairs like: +# ${config_prefix}= +# sed "s/'//g" is used to remove single quote for relayNodes value +readarray -t config_kv_pair_array < <( sed -E 's/([^:]+):\s*(.*)/\1=\2/g' ${config_file_name} | sed "s/'//g" | sed "s/^/${config_prefix}_/" ) +declare -p config_kv_pair_array +# Then iterate over that kv array making the template substitution in our web app files +for kv_pair_string in "${config_kv_pair_array[@]}" +do + kv_pair=(${kv_pair_string//=/ }) + template_string_to_replace=${kv_pair[0]} + template_value_to_substitute=${kv_pair[1]} + # Run find and sed to do the substitution of one variable over all files + # See: https://stackoverflow.com/a/21479607/1701505 + echo "Substituting: ${template_string_to_replace} = ${template_value_to_substitute}" + + # TODO: Pass keys to be replaced without double quotes + if [[ "$template_string_to_replace" == "${config_prefix}_relayNodes" ]]; then + find ${webapp_files_dir} -type f -exec sed -i 's#"'"${template_string_to_replace}"'"#'"${template_value_to_substitute}"'#g' {} + + else + # Note: we do not escape our strings, on the expectation they do not container the '#' char. + find ${webapp_files_dir} -type f -exec sed -i 's#'${template_string_to_replace}'#'${template_value_to_substitute}'#g' {} + + fi +done diff --git a/app/data/container-build/cerc-react-peer/build.sh b/app/data/container-build/cerc-react-peer/build.sh index 48edc4b3..7078b754 100755 --- a/app/data/container-build/cerc-react-peer/build.sh +++ b/app/data/container-build/cerc-react-peer/build.sh @@ -6,4 +6,7 @@ source ${CERC_CONTAINER_BASE_DIR}/build-base.sh # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/react-peer:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/react-peer +CERC_NPM_REGISTRY_URL="https://git.vdb.to/api/packages/cerc-io/npm/" + +docker build -t cerc/react-peer:local ${build_command_args} -f ${SCRIPT_DIR}/Dockerfile \ + --build-arg CERC_NPM_REGISTRY_URL ${SCRIPT_DIR} diff --git a/app/data/container-build/cerc-react-peer/start-serving-app.sh b/app/data/container-build/cerc-react-peer/start-serving-app.sh new file mode 100755 index 00000000..e01b91c3 --- /dev/null +++ b/app/data/container-build/cerc-react-peer/start-serving-app.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi + +# TODO: Don't hard wire this: +webapp_files_dir=/usr/local/share/.config/yarn/global/node_modules/@cerc-io/test-app/build +/scripts/apply-webapp-config.sh /config/config.yml ${webapp_files_dir} MOBYMASK_HOSTED_CONFIG +http-server -p 80 ${webapp_files_dir} diff --git a/app/data/stacks/fixturenet-laconic-loaded/README.md b/app/data/stacks/fixturenet-laconic-loaded/README.md index 2fc21594..b94189c2 100644 --- a/app/data/stacks/fixturenet-laconic-loaded/README.md +++ b/app/data/stacks/fixturenet-laconic-loaded/README.md @@ -14,7 +14,7 @@ $ chmod +x ./laconic-so $ export PATH=$PATH:$(pwd) # Or move laconic-so to ~/bin or your favorite on-path directory ``` ## 2. Prepare the local build environment -Note that this step needs only to be done once on a new machine. +Note that this step needs only to be done once on a new machine. Detailed instructions can be found [here](../build-support/README.md). For the impatient run these commands: ``` $ laconic-so --stack build-support build-containers --exclude cerc/builder-gerbil diff --git a/app/data/stacks/mobymask-v2/README.md b/app/data/stacks/mobymask-v2/README.md index 9dcca6c0..aaa4ac7f 100644 --- a/app/data/stacks/mobymask-v2/README.md +++ b/app/data/stacks/mobymask-v2/README.md @@ -27,11 +27,11 @@ git checkout v0.2.35 # react-peer cd ~/cerc/react-peer -git checkout v0.2.31 +git checkout v0.2.32 # mobymask-ui cd ~/cerc/mobymask-ui -git checkout laconic +git checkout v0.1.2 # MobyMask cd ~/cerc/MobyMask diff --git a/app/data/stacks/mobymask-v2/web-apps.md b/app/data/stacks/mobymask-v2/web-apps.md index 09d6834d..866f22f0 100644 --- a/app/data/stacks/mobymask-v2/web-apps.md +++ b/app/data/stacks/mobymask-v2/web-apps.md @@ -19,17 +19,17 @@ Checkout to the required versions and branches in repos: ```bash # react-peer cd ~/cerc/react-peer -git checkout v0.2.31 +git checkout v0.2.32 # mobymask-ui cd ~/cerc/mobymask-ui -git checkout laconic +git checkout v0.1.2 ``` Build the container images: ```bash -laconic-so --stack mobymask-v2 build-containers --include cerc/react-peer-v2,cerc/mobymask-ui +laconic-so --stack mobymask-v2 build-containers --include cerc/react-peer,cerc/mobymask-ui ``` This should create the required docker images in the local image registry From ddf51e01a3af4c971c2aa61de5cf1436326b2f55 Mon Sep 17 00:00:00 2001 From: zramsay Date: Tue, 18 Apr 2023 18:01:54 -0400 Subject: [PATCH 0423/1010] first pass Former-commit-id: ca29e9cf0d887228db37ef4c190800c5fa107e79 --- docs/laconicd-fixturenet.md | 113 ++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 docs/laconicd-fixturenet.md diff --git a/docs/laconicd-fixturenet.md b/docs/laconicd-fixturenet.md new file mode 100644 index 00000000..bb60af9b --- /dev/null +++ b/docs/laconicd-fixturenet.md @@ -0,0 +1,113 @@ +# Running a laconicd fixturenet with console + +The following tutorial explains the steps to run a laconicd fixturenet with CLI and web console that displays records in the registry. It is designed as an introduction to Stack Orchestrator and to showcase one component of the Laconic Stack. Prior to Stack Orchestrator, the following 4 repositories had to be cloned and setup manually: + +- https://github.com/cerc-io/laconicd +- https://github.com/cerc-io/laconic-sdk +- https://github.com/cerc-io/laconic-registry-cli +- https://github.com/cerc-io/laconic-console + +Now, with Stack Orchestrator, it is a few quick commands. Additionally, the `docker` and `docker compose` integration on the back-end allows the stack to easily persist, facilitating workflows. + +## Setup laconic-so + +To avoid hiccups on Mac M1/M2 and any local machine nuances that may affect the user experience, this tutorial is focused on using a fresh Digital Ocean (DO) droplet with similar specs: +16 GB Memory / 8 Intel vCPUs / 160 GB Disk. + +1. Login to the droplet as root (either by SSH key or password set in the DO console) + +``` +ssh root@IP +``` + +2. Get the install script, give it executable permissions, and run it: + +``` +curl -o install.sh https://raw.githubusercontent.com/cerc-io/stack-orchestrator/main/scripts/quick-install-ubuntu.sh +``` +``` +chmod +x install.sh +``` +``` +bash install.sh +``` + +3. Confirm docker was installed and activate the changes in `~/.profile`: + +``` +docker run hello-world +``` +``` +source ~/.profile +``` + +4. Verify installation: + +``` +laconic-so version +``` + +## Setup the laconic fixturenet stack + +1. Get the repositories + +``` +laconic-so --stack fixturenet-laconic-loaded setup-repositories --include cerc-io/laconicd,cerc-io/laconic-sdk,cerc-io/laconic-registry-cli,cerc-io/laconic-console +``` + +2. Set this environment variable to the Laconic self-hosted Gitea instance: + +``` +export CERC_NPM_REGISTRY_URL=https://git.vdb.to/api/packages/cerc-io/npm/ +``` + +3. Build the containers: + +``` +laconic-so --stack fixturenet-laconic-loaded build-containers +``` + +It's possible to run into an `ESOCKETTIMEDOUT` error, e.g., `error An unexpected error occurred: "https://registry.yarnpkg.com/@material-ui/icons/-/icons-4.11.3.tgz: ESOCKETTIMEDOUT"`. This may happen even if you have a great internet connection. In that case, re-run the `build-containers` command. + +4. Set this environment variable to your droplet's IP address: + +``` +export LACONIC_HOSTED_ENDPOINT=68.183.195.210 +``` + +5. Deploy the stack: + +``` +laconic-so --stack fixturenet-laconic-loaded deploy up +``` + +6. Check the logs: + +``` +laconic-so --stack fixturenet-laconic-loaded deploy logs +``` + +You'll see output from `laconicd` and the block height should be >1 to confirm it is running: + +``` +laconic-5cd0a80c1442c3044c8b295d26426bae-laconicd-1 | 9:29PM INF indexed block exents height=12 module=txindex server=node +laconic-5cd0a80c1442c3044c8b295d26426bae-laconicd-1 | 9:30PM INF Timed out dur=4976.960115 height=13 module=consensus round=0 server=node step=1 +laconic-5cd0a80c1442c3044c8b295d26426bae-laconicd-1 | 9:30PM INF received proposal module=consensus proposal={"Type":32,"block_id":{"hash":"D26C088A711F912ADB97888C269F628DA33153795621967BE44DCB43C3D03CA4","parts":{"hash":"22411A20B7F14CDA33244420FBDDAF24450C0628C7A06034FF22DAC3699DDCC8","total":1}},"height":13,"pol_round":-1,"round":0,"signature":"DEuqnaQmvyYbUwckttJmgKdpRu6eVm9i+9rQ1pIrV2PidkMNdWRZBLdmNghkIrUzGbW8Xd7UVJxtLRmwRASgBg==","timestamp":"2023-04-18T21:30:01.49450663Z"} server=node +laconic-5cd0a80c1442c3044c8b295d26426bae-laconicd-1 | 9:30PM INF received complete proposal block hash=D26C088A711F912ADB97888C269F628DA33153795621967BE44DCB43C3D03CA4 height=13 module=consensus server=node +laconic-5cd0a80c1442c3044c8b295d26426bae-laconicd-1 | 9:30PM INF finalizing commit of block hash={} height=13 module=consensus num_txs=0 root=1A8CA1AF139CCC80EC007C6321D8A63A46A793386EE2EDF9A5CA0AB2C90728B7 server=node +laconic-5cd0a80c1442c3044c8b295d26426bae-laconicd-1 | 9:30PM INF minted coins from module account amount=2059730459416582643aphoton from=mint module=x/bank +laconic-5cd0a80c1442c3044c8b295d26426bae-laconicd-1 | 9:30PM INF executed block height=13 module=state num_invalid_txs=0 num_valid_txs=0 server=node +laconic-5cd0a80c1442c3044c8b295d26426bae-laconicd-1 | 9:30PM INF commit synced commit=436F6D6D697449447B5B363520313037203630203232372039352038352032303820313334203231392032303520313433203130372031343920313431203139203139322038362031323720362031383520323533203137362031333820313735203135392031383620323334203135382031323120313431203230342037335D3A447D +laconic-5cd0a80c1442c3044c8b295d26426bae-laconicd-1 | 9:30PM INF committed state app_hash=416B3CE35F55D086DBCD8F6B958D13C0567F06B9FDB08AAF9FBAEA9E798DCC49 height=13 module=state num_txs=0 server=node +laconic-5cd0a80c1442c3044c8b295d26426bae-laconicd-1 | 9:30PM INF indexed block exents height=13 module=txindex server=node +``` + +7. Confirm operation of the registry CLI: + +``` +laconic-so --stack fixturenet-laconic-loaded deploy exec cli "laconic cns status" +``` + +## Configure Digital Ocean firewall + +Let's open some ports. In the DO web console, navigate to your droplet's main page. Select the "Networking" tab and scroll down to "Firewall". From feee38140d8602f903779570a8296cc6955eeb72 Mon Sep 17 00:00:00 2001 From: zramsay Date: Tue, 18 Apr 2023 18:48:52 -0400 Subject: [PATCH 0424/1010] second pass Former-commit-id: 07c2a01a5810d2d446e8465f4db4ce4bdcfc619f --- docs/laconicd-fixturenet.md | 72 ++++++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/docs/laconicd-fixturenet.md b/docs/laconicd-fixturenet.md index bb60af9b..b9045970 100644 --- a/docs/laconicd-fixturenet.md +++ b/docs/laconicd-fixturenet.md @@ -110,4 +110,74 @@ laconic-so --stack fixturenet-laconic-loaded deploy exec cli "laconic cns status ## Configure Digital Ocean firewall -Let's open some ports. In the DO web console, navigate to your droplet's main page. Select the "Networking" tab and scroll down to "Firewall". +Let's open some ports. + +1. In the Digital Ocean web console, navigate to your droplet's main page. Select the "Networking" tab and scroll down to "Firewall". + +2. Get the port for the running console: + +``` +echo http://IP:$(laconic-so --stack fixturenet-laconic-loaded deploy port laconic-console 80 | cut -d ':' -f 2) +``` +``` +http://IP:32778 +``` + +3. Go back to the Digital Ocean web console and set an Inbound Rule for Custom TCP of the above port: + +- `32778` in this example, but yours will be different. +- do the same for port `9473` + +Additional ports will need to be opened depending on your application. Ensure you add your droplet to this new Firewall and wait a minute or so for the update to propagate. + +4. Navigate to http://IP:port and ensure laconic-console is functioning as expected: + +- ensure you are connected to `laconicd`; no error message should pop up; +- the wifi symbol in the bottom right should have a green check mark beside it +- navigate to the status tab; it should display similar/identical information +- navigate to the config tab, you'll see something like (with your IP): + +``` +wns + webui 68.183.195.210:9473/console + server 68.183.195.210:9473/api +``` + +## Publish and query a sample record to the registry + +1. The following command will create a bond and publish a record: + +``` +laconic-so --stack fixturenet-laconic-loaded deploy exec cli ./scripts/create-demo-records.sh +``` + +You'll get an output like: + +``` +Balance is: 99998999999999998999600000 +Created bond with id: dd88e8d6f9567b32b28e70552aea4419c5dd3307ebae85a284d1fe38904e301a +Published demo-record-1.yml with id: bafyreierh3xnfivexlscdwubvczmddsnf46uytyfvrbdhkjzztvsz6ruly +``` + +The sample record we deployed looks like: + +``` +TODO +``` + +2. Return to the laconic-console + +- the published record should now be viewable +- explore it for more information +- click on the link that opens the GraphQL console +- the query is pre-loaded, click the button to run it +- inspect the output + +3. Try out additional CLI commands + +- these are documented [here](https://github.com/cerc-io/laconic-registry-cli#readme) and updates are forthcoming +- e.g,: + +``` +laconic-so --stack fixturenet-laconic-loaded deploy exec cli "laconic cns record list" +``` From 1629129cd5f1edea30fb0ed34d5556a7feefc571 Mon Sep 17 00:00:00 2001 From: zramsay Date: Tue, 18 Apr 2023 19:54:18 -0400 Subject: [PATCH 0425/1010] the fix Former-commit-id: e5b9b74b4c0b890d6e79627f47139ef0b255e7a2 --- docs/laconicd-fixturenet.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/laconicd-fixturenet.md b/docs/laconicd-fixturenet.md index b9045970..66ae1020 100644 --- a/docs/laconicd-fixturenet.md +++ b/docs/laconicd-fixturenet.md @@ -72,7 +72,7 @@ It's possible to run into an `ESOCKETTIMEDOUT` error, e.g., `error An unexpected 4. Set this environment variable to your droplet's IP address: ``` -export LACONIC_HOSTED_ENDPOINT=68.183.195.210 +export LACONIC_HOSTED_ENDPOINT=http://68.183.195.210 ``` 5. Deploy the stack: @@ -139,8 +139,8 @@ Additional ports will need to be opened depending on your application. Ensure yo ``` wns - webui 68.183.195.210:9473/console - server 68.183.195.210:9473/api + webui http://68.183.195.210:9473/console + server http://68.183.195.210:9473/api ``` ## Publish and query a sample record to the registry From 3f79c2b81172f224513868980c72765d981dce8b Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Wed, 19 Apr 2023 12:22:13 +0530 Subject: [PATCH 0426/1010] [WIP] Handle restarts in fixturenet-eth stack (#324) * Use mounted volumes for data in geth nodes * Use mounted volumes for data in lighthouse nodes * Avoid resetting genesis time in a lighthouse node on restart * Mount parent datadir for lighthouse nodes * Trap signals on shutdown and clean up in lighthouse nodes * Allow stalled sync in lighthouse beacon nodes * Gracefully shutdown geth nodes * Add clean up instructions * Gracefully shutdown lighthouse boot node Former-commit-id: 3130af161539c701e46b4ef8a8af5b503ce0433b --- .../compose/docker-compose-fixturenet-eth.yml | 17 ++++++++++ .../cerc-fixturenet-eth-geth/Dockerfile | 2 +- .../genesis/accounts/import_keys.sh | 2 +- .../cerc-fixturenet-eth-geth/run-el.sh | 30 ++++++++++++++++-- .../genesis/cl/beacon_node.sh | 5 +-- .../genesis/cl/bootnode.sh | 18 ++++++++--- .../genesis/cl/reset_genesis_time.sh | 2 +- .../genesis/cl/validator_client.sh | 2 +- .../cerc-fixturenet-eth-lighthouse/run-cl.sh | 31 ++++++++++++++----- app/data/stacks/fixturenet-eth/README.md | 28 +++++++++++++++-- 10 files changed, 113 insertions(+), 24 deletions(-) diff --git a/app/data/compose/docker-compose-fixturenet-eth.yml b/app/data/compose/docker-compose-fixturenet-eth.yml index 508543e4..2024cacb 100644 --- a/app/data/compose/docker-compose-fixturenet-eth.yml +++ b/app/data/compose/docker-compose-fixturenet-eth.yml @@ -8,6 +8,8 @@ services: environment: RUN_BOOTNODE: "true" image: cerc/fixturenet-eth-geth:local + volumes: + - fixturenet_eth_bootnode_geth_data:/root/ethdata ports: - "9898" - "30303" @@ -26,6 +28,7 @@ services: image: cerc/fixturenet-eth-geth:local volumes: - fixturenet_geth_accounts:/opt/testnet/build/el + - fixturenet_eth_geth_1_data:/root/ethdata healthcheck: test: ["CMD", "nc", "-v", "localhost", "8545"] interval: 30s @@ -52,12 +55,16 @@ services: image: cerc/fixturenet-eth-geth:local depends_on: - fixturenet-eth-bootnode-geth + volumes: + - fixturenet_eth_geth_2_data:/root/ethdata fixturenet-eth-bootnode-lighthouse: hostname: fixturenet-eth-bootnode-lighthouse environment: RUN_BOOTNODE: "true" image: cerc/fixturenet-eth-lighthouse:local + volumes: + - fixturenet_eth_bootnode_lighthouse_data:/opt/testnet/build/cl fixturenet-eth-lighthouse-1: hostname: fixturenet-eth-lighthouse-1 @@ -74,6 +81,8 @@ services: ETH1_ENDPOINT: "http://fixturenet-eth-geth-1:8545" EXECUTION_ENDPOINT: "http://fixturenet-eth-geth-1:8551" image: cerc/fixturenet-eth-lighthouse:local + volumes: + - fixturenet_eth_lighthouse_1_data:/opt/testnet/build/cl depends_on: fixturenet-eth-bootnode-lighthouse: condition: service_started @@ -98,6 +107,8 @@ services: EXECUTION_ENDPOINT: "http://fixturenet-eth-geth-2:8551" LIGHTHOUSE_GENESIS_STATE_URL: "http://fixturenet-eth-lighthouse-1:8001/eth/v2/debug/beacon/states/0" image: cerc/fixturenet-eth-lighthouse:local + volumes: + - fixturenet_eth_lighthouse_2_data:/opt/testnet/build/cl depends_on: fixturenet-eth-bootnode-lighthouse: condition: service_started @@ -106,3 +117,9 @@ services: volumes: fixturenet_geth_accounts: + fixturenet_eth_bootnode_geth_data: + fixturenet_eth_geth_1_data: + fixturenet_eth_geth_2_data: + fixturenet_eth_bootnode_lighthouse_data: + fixturenet_eth_lighthouse_1_data: + fixturenet_eth_lighthouse_2_data: diff --git a/app/data/container-build/cerc-fixturenet-eth-geth/Dockerfile b/app/data/container-build/cerc-fixturenet-eth-geth/Dockerfile index 51dbbcd4..63c3c0a7 100644 --- a/app/data/container-build/cerc-fixturenet-eth-geth/Dockerfile +++ b/app/data/container-build/cerc-fixturenet-eth-geth/Dockerfile @@ -22,6 +22,6 @@ COPY run-el.sh /opt/testnet/run.sh RUN cd /opt/testnet && make genesis-el COPY --from=geth /usr/local/bin/geth /usr/local/bin/ -RUN geth init /opt/testnet/build/el/geth.json && rm -f ~/.ethereum/geth/nodekey +RUN geth --datadir ~/ethdata init /opt/testnet/build/el/geth.json && rm -f ~/ethdata/geth/nodekey ENTRYPOINT ["/opt/testnet/run.sh"] diff --git a/app/data/container-build/cerc-fixturenet-eth-geth/genesis/accounts/import_keys.sh b/app/data/container-build/cerc-fixturenet-eth-geth/genesis/accounts/import_keys.sh index 719b9f59..e8dce0ea 100755 --- a/app/data/container-build/cerc-fixturenet-eth-geth/genesis/accounts/import_keys.sh +++ b/app/data/container-build/cerc-fixturenet-eth-geth/genesis/accounts/import_keys.sh @@ -12,6 +12,6 @@ for line in `cat ../build/el/accounts.csv`; do echo "" echo "$ADDRESS" - geth account import --password .pw.$$ .key.$$ + geth account import --datadir=~/ethdata --password .pw.$$ .key.$$ rm -f .pw.$$ .key.$$ done diff --git a/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh b/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh index 12e59462..526c76d7 100755 --- a/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh +++ b/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh @@ -18,17 +18,35 @@ if [ "true" == "$CERC_REMOTE_DEBUG" ] && [ -x "/usr/local/bin/dlv" ]; then START_CMD="/usr/local/bin/dlv --listen=:40000 --headless=true --api-version=2 --accept-multiclient exec /usr/local/bin/geth --continue --" fi +# See https://linuxconfig.org/how-to-propagate-a-signal-to-child-processes-from-a-bash-script +cleanup() { + echo "Signal received, cleaning up..." + + # Kill the child process first (CERC_REMOTE_DEBUG=true uses dlv which starts geth as a child process) + pkill -P ${geth_pid} + sleep 2 + kill $(jobs -p) + + wait + echo "Done" +} +trap 'cleanup' SIGINT SIGTERM + if [ "true" == "$RUN_BOOTNODE" ]; then $START_CMD \ + --datadir=~/ethdata \ --nodekeyhex="${BOOTNODE_KEY}" \ --nodiscover \ --ipcdisable \ --networkid=${NETWORK_ID} \ - --netrestrict="${NETRESTRICT}" + --netrestrict="${NETRESTRICT}" \ + & + + geth_pid=$! else cd /opt/testnet/accounts ./import_keys.sh - + echo -n "$JWT" > /opt/testnet/build/el/jwtsecret if [ "$CERC_RUN_STATEDIFF" == "detect" ] && [ -n "$CERC_STATEDIFF_DB_HOST" ]; then @@ -74,6 +92,7 @@ else fi $START_CMD \ + --datadir=~/ethdata \ --bootnodes="${ENODE}" \ --allow-insecure-unlock \ --http \ @@ -101,5 +120,10 @@ else --metrics.addr="0.0.0.0" \ --verbosity=${CERC_GETH_VERBOSITY:-3} \ --vmodule="${CERC_GETH_VMODULE:-statediff/*=5}" \ - --miner.etherbase="${ETHERBASE}" ${STATEDIFF_OPTS} + --miner.etherbase="${ETHERBASE}" ${STATEDIFF_OPTS} \ + & + + geth_pid=$! fi + +wait $geth_pid diff --git a/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh index 6fa1d8d4..1f906155 100755 --- a/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh +++ b/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/beacon_node.sh @@ -19,9 +19,9 @@ http_port=8001 authrpc_port=8551 exec lighthouse \ - --debug-level $DEBUG_LEVEL \ bn \ $SUBSCRIBE_ALL_SUBNETS \ + --debug-level $DEBUG_LEVEL \ --boot-nodes "$ENR" \ --datadir $data_dir \ --testnet-dir $TESTNET_DIR \ @@ -38,4 +38,5 @@ exec lighthouse \ --execution-jwt $JWTSECRET \ --terminal-total-difficulty-override $ETH1_TTD \ --suggested-fee-recipient $SUGGESTED_FEE_RECIPIENT \ - --target-peers $((BN_COUNT - 1)) + --target-peers $((BN_COUNT - 1)) \ + --http-allow-sync-stalled \ diff --git a/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/bootnode.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/bootnode.sh index f6f5cc73..a395f41a 100755 --- a/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/bootnode.sh +++ b/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/bootnode.sh @@ -21,14 +21,22 @@ if [ ! -f "$DATADIR/bootnode/enr.dat" ]; then --udp-port $BOOTNODE_PORT \ --tcp-port $BOOTNODE_PORT \ --genesis-fork-version $GENESIS_FORK_VERSION \ - --output-dir $DATADIR/bootnode + --output-dir $DATADIR/bootnode-temp - bootnode_enr=`cat $DATADIR/bootnode/enr.dat` - echo "- $bootnode_enr" > $TESTNET_DIR/boot_enr.yaml - - echo "Generated bootnode enr and written to $TESTNET_DIR/boot_enr.yaml" + # Output ENR to a temp dir and mv as "lcli generate-bootnode-enr" will not overwrite an empty dir (mounted volume) + mkdir -p $DATADIR/bootnode + mv $DATADIR/bootnode-temp/* $DATADIR/bootnode + rm -r $DATADIR/bootnode-temp + + echo "Generated bootnode enr" +else + echo "Found existing bootnode enr" fi +bootnode_enr=`cat $DATADIR/bootnode/enr.dat` +echo "- $bootnode_enr" > $TESTNET_DIR/boot_enr.yaml +echo "Written bootnode enr to $TESTNET_DIR/boot_enr.yaml" + exec lighthouse boot_node \ --testnet-dir $TESTNET_DIR \ --port $BOOTNODE_PORT \ diff --git a/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/reset_genesis_time.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/reset_genesis_time.sh index a8cc2e2b..f21a8ee0 100755 --- a/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/reset_genesis_time.sh +++ b/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/reset_genesis_time.sh @@ -16,4 +16,4 @@ lcli \ $TESTNET_DIR/genesis.ssz \ $NOW -echo "Reset genesis time to now ($NOW)" +echo "Reset genesis time to ($NOW)" diff --git a/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/validator_client.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/validator_client.sh index c7f0dba4..30168f80 100755 --- a/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/validator_client.sh +++ b/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/validator_client.sh @@ -21,9 +21,9 @@ while getopts "pd:" flag; do done exec lighthouse \ - --debug-level $DEBUG_LEVEL \ vc \ $BUILDER_PROPOSALS \ + --debug-level $DEBUG_LEVEL \ --validators-dir $DATADIR/node_$NODE_NUMBER/validators \ --secrets-dir $DATADIR/node_$NODE_NUMBER/secrets \ --testnet-dir $TESTNET_DIR \ diff --git a/app/data/container-build/cerc-fixturenet-eth-lighthouse/run-cl.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/run-cl.sh index ee5fc55c..ec0e9aeb 100755 --- a/app/data/container-build/cerc-fixturenet-eth-lighthouse/run-cl.sh +++ b/app/data/container-build/cerc-fixturenet-eth-lighthouse/run-cl.sh @@ -1,12 +1,25 @@ #!/bin/bash -if [ "true" == "$RUN_BOOTNODE" ]; then +# See https://linuxconfig.org/how-to-propagate-a-signal-to-child-processes-from-a-bash-script +cleanup() { + echo "Signal received, cleaning up..." + kill $(jobs -p) + + wait + echo "Done" +} +trap 'cleanup' SIGINT SIGTERM + +if [ "true" == "$RUN_BOOTNODE" ]; then cd /opt/testnet/build/cl python3 -m http.server 3000 & cd /opt/testnet/cl - ./bootnode.sh 2>&1 | tee /var/log/lighthouse_bootnode.log + ./bootnode.sh 2>&1 | tee /var/log/lighthouse_bootnode.log & + bootnode_pid=$! + + wait $bootnode_pid else while [ 1 -eq 1 ]; do echo "Waiting on geth ..." @@ -25,7 +38,12 @@ else cd /opt/testnet/cl if [ -z "$LIGHTHOUSE_GENESIS_STATE_URL" ]; then - ./reset_genesis_time.sh + # Check if beacon node data exists to avoid resetting genesis time on a restart + if [ -d /opt/testnet/build/cl/node_"$NODE_NUMBER"/beacon ]; then + echo "Skipping genesis time reset" + else + ./reset_genesis_time.sh + fi else while [ 1 -eq 1 ]; do echo "Waiting on Genesis time ..." @@ -54,10 +72,9 @@ else echo -n "$JWT" > $JWTSECRET ./beacon_node.sh 2>&1 | tee /var/log/lighthouse_bn.log & - lpid=$! + beacon_pid=$! ./validator_client.sh 2>&1 | tee /var/log/lighthouse_vc.log & - vpid=$! + validator_pid=$! - wait $lpid $vpid + wait $beacon_pid $validator_pid fi - diff --git a/app/data/stacks/fixturenet-eth/README.md b/app/data/stacks/fixturenet-eth/README.md index 3aa41dec..86404af0 100644 --- a/app/data/stacks/fixturenet-eth/README.md +++ b/app/data/stacks/fixturenet-eth/README.md @@ -3,15 +3,18 @@ Instructions for deploying a local a geth + lighthouse blockchain "fixturenet" for development and testing purposes using laconic-stack-orchestrator (the installation of which is covered [here](https://github.com/cerc-io/stack-orchestrator#user-mode)): ## Clone required repositories + ``` $ laconic-so --stack fixturenet-eth setup-repositories ``` ## Build the fixturenet-eth containers + ``` $ laconic-so --stack fixturenet-eth build-containers ``` -This should create several container images in the local image registry: + +This should create several container images in the local image registry: * cerc/go-ethereum * cerc/lighthouse @@ -19,6 +22,7 @@ This should create several container images in the local image registry: * cerc/fixturenet-eth-lighthouse ## Deploy the stack + ``` $ laconic-so --stack fixturenet-eth deploy up ``` @@ -57,7 +61,7 @@ Several other containers can used with the basic `fixturenet-eth`: * `eth-probe` (captures eth1 tx gossip) * `keycloak` (nginx proxy with keycloak auth for API authentication) * `tx-spammer` (generates and sends automated transactions to the fixturenet) - + It is not necessary to use them all at once, but a complete example follows: ``` @@ -99,4 +103,22 @@ keycloak-db-1 0.0.0.0:55850->5432/tcp keycloak-nginx-1 0.0.0.0:55859->80/tcp migrations-1 tx-spammer-1 -``` \ No newline at end of file +``` + +## Clean up + +Stop all services running in the background: + +```bash +$ laconic-so --stack fixturenet-eth deploy down +``` + +Clear volumes created by this stack: + +```bash +# List all relevant volumes +$ docker volume ls -q --filter "name=.*fixturenet_eth_bootnode_geth_data|.*fixturenet_eth_bootnode_lighthouse_data|.*fixturenet_eth_geth_1_data|.*fixturenet_eth_geth_2_data|.*fixturenet_eth_lighthouse_1_data|.*fixturenet_eth_lighthouse_2_data|.*fixturenet_geth_accounts" + +# Remove all the listed volumes +$ docker volume rm $(docker volume ls -q --filter "name=.*fixturenet_eth_bootnode_geth_data|.*fixturenet_eth_bootnode_lighthouse_data|.*fixturenet_eth_geth_1_data|.*fixturenet_eth_geth_2_data|.*fixturenet_eth_lighthouse_1_data|.*fixturenet_eth_lighthouse_2_data|.*fixturenet_geth_accounts") +``` From 4caae1d850835f5a3f0b585aa7bd1539101355ab Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Wed, 19 Apr 2023 12:48:38 +0530 Subject: [PATCH 0427/1010] Gracefully shutdown optimism batcher and op-geth containers (#345) * Gracefully shutdown optimism batcher and op-geth containers * Remove unnecessary env export Former-commit-id: c6e6122516f07240d64d5775e235735fa7237bdc --- .../config/fixturenet-optimism/run-op-batcher.sh | 15 ++++++++++++++- .../config/fixturenet-optimism/run-op-geth.sh | 15 ++++++++++++++- app/data/stacks/fixturenet-optimism/README.md | 3 +++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/app/data/config/fixturenet-optimism/run-op-batcher.sh b/app/data/config/fixturenet-optimism/run-op-batcher.sh index ff549213..4bee6036 100755 --- a/app/data/config/fixturenet-optimism/run-op-batcher.sh +++ b/app/data/config/fixturenet-optimism/run-op-batcher.sh @@ -9,6 +9,15 @@ CERC_L1_RPC="${CERC_L1_RPC:-${DEFAULT_CERC_L1_RPC}}" # Get BACTHER_KEY from keys.json BATCHER_KEY=$(jq -r '.Batcher.privateKey' /l2-accounts/keys.json | tr -d '"') +cleanup() { + echo "Signal received, cleaning up..." + kill ${batcher_pid} + + wait + echo "Done" +} +trap 'cleanup' INT TERM + op-batcher \ --l2-eth-rpc=http://op-geth:8545 \ --rollup-rpc=http://op-node:8547 \ @@ -23,4 +32,8 @@ op-batcher \ --max-channel-duration=1 \ --target-l1-tx-size-bytes=2048 \ --l1-eth-rpc=$CERC_L1_RPC \ - --private-key=$BATCHER_KEY + --private-key=$BATCHER_KEY \ + & + +batcher_pid=$! +wait $batcher_pid diff --git a/app/data/config/fixturenet-optimism/run-op-geth.sh b/app/data/config/fixturenet-optimism/run-op-geth.sh index 68f6c5c5..48391d73 100755 --- a/app/data/config/fixturenet-optimism/run-op-geth.sh +++ b/app/data/config/fixturenet-optimism/run-op-geth.sh @@ -47,6 +47,15 @@ fi SEQUENCER_ADDRESS=$(jq -r '.Sequencer.address' /l2-accounts/keys.json | tr -d '"') echo "SEQUENCER_ADDRESS: ${SEQUENCER_ADDRESS}" +cleanup() { + echo "Signal received, cleaning up..." + kill ${geth_pid} + + wait + echo "Done" +} +trap 'cleanup' INT TERM + # Run op-geth geth \ --datadir ./datadir \ @@ -74,4 +83,8 @@ geth \ --allow-insecure-unlock \ --mine \ --miner.etherbase=$SEQUENCER_ADDRESS \ - --unlock=$SEQUENCER_ADDRESS + --unlock=$SEQUENCER_ADDRESS \ + & + +geth_pid=$! +wait $geth_pid diff --git a/app/data/stacks/fixturenet-optimism/README.md b/app/data/stacks/fixturenet-optimism/README.md index 502e3305..5099cdd3 100644 --- a/app/data/stacks/fixturenet-optimism/README.md +++ b/app/data/stacks/fixturenet-optimism/README.md @@ -91,6 +91,9 @@ docker volume rm $(docker volume ls -q --filter "name=.*fixturenet_geth_accounts ``` * This means that the data directory that `op-geth` is using is corrupted and needs to be reinitialized; the containers `op-geth`, `op-node` and `op-batcher` need to be started afresh: + + WARNING: This will reset the L2 chain; consequently, all the data on it will be lost + * Stop and remove the concerned containers: ```bash From 53fbc60f553d314cc20b61663a548a8c4e4ec4c9 Mon Sep 17 00:00:00 2001 From: Nabarun Gogoi Date: Wed, 19 Apr 2023 13:48:51 +0530 Subject: [PATCH 0428/1010] Use standalone mobymask-v2-watcher-ts for running watcher server (#327) * Use standalone mobymask-v2-watcher-ts to run peer test * Add watcher-ts image for running peer tests * Run separate containers for peer ids generation and tests * Wait for watcher to be up before starting peer-test-app * Resolve peer-test-app compose file and remove setup-repositories for web-apps Former-commit-id: c4002dcc5c5001d3b45cda334bcc64929a1c7dbc --- .../compose/docker-compose-peer-test-app.yml | 6 ++- .../docker-compose-watcher-mobymask-v2.yml | 42 +++++++++++++++++-- .../watcher-mobymask-v2/generate-peer-ids.sh | 20 +++++++++ .../watcher-mobymask-v2/set-tests-env.sh | 10 +++++ .../watcher-mobymask-v2/start-server.sh | 24 +---------- .../cerc-watcher-mobymask-v2/Dockerfile | 2 +- .../cerc-watcher-mobymask-v2/build.sh | 2 +- .../cerc-watcher-ts/Dockerfile | 10 +++++ .../container-build/cerc-watcher-ts/build.sh | 7 ++++ app/data/container-image-list.txt | 1 + app/data/pod-list.txt | 1 + app/data/repository-list.txt | 1 + app/data/stacks/mobymask-v2/README.md | 14 ++----- app/data/stacks/mobymask-v2/demo.md | 2 +- app/data/stacks/mobymask-v2/stack.yml | 4 +- app/data/stacks/mobymask-v2/web-apps.md | 20 --------- 16 files changed, 103 insertions(+), 63 deletions(-) create mode 100755 app/data/config/watcher-mobymask-v2/generate-peer-ids.sh create mode 100755 app/data/config/watcher-mobymask-v2/set-tests-env.sh create mode 100644 app/data/container-build/cerc-watcher-ts/Dockerfile create mode 100755 app/data/container-build/cerc-watcher-ts/build.sh diff --git a/app/data/compose/docker-compose-peer-test-app.yml b/app/data/compose/docker-compose-peer-test-app.yml index 0a8d1c65..927f92f7 100644 --- a/app/data/compose/docker-compose-peer-test-app.yml +++ b/app/data/compose/docker-compose-peer-test-app.yml @@ -10,8 +10,12 @@ services: environment: CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} CERC_RELAY_NODES: ${CERC_RELAY_NODES} - command: ["sh", "./test-app-start.sh"] + command: + - sh + - -c + - ./wait-for-it.sh -h ${CERC_WATCHER_HOST:-$${DEFAULT_CERC_WATCHER_HOST}} -p ${CERC_WATCHER_PORT:-$${DEFAULT_CERC_WATCHER_PORT}} -s -t 0 -- ./test-app-start.sh volumes: + - ../config/wait-for-it.sh:/scripts/wait-for-it.sh - ../config/watcher-mobymask-v2/test-app-start.sh:/scripts/test-app-start.sh - peers_ids:/peers ports: diff --git a/app/data/compose/docker-compose-watcher-mobymask-v2.yml b/app/data/compose/docker-compose-watcher-mobymask-v2.yml index 601d13b6..fa68d017 100644 --- a/app/data/compose/docker-compose-watcher-mobymask-v2.yml +++ b/app/data/compose/docker-compose-watcher-mobymask-v2.yml @@ -54,6 +54,18 @@ services: extra_hosts: - "host.docker.internal:host-gateway" + # Creates peer-id files if they don't exist + peer-ids-gen: + image: cerc/watcher-ts:local + restart: on-failure + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + working_dir: /app/packages/peer + command: ["sh", "generate-peer-ids.sh"] + volumes: + - ../config/watcher-mobymask-v2/generate-peer-ids.sh:/app/packages/peer/generate-peer-ids.sh + - peers_ids:/peer-ids + # Starts the mobymask-v2-watcher server mobymask-watcher-server: image: cerc/watcher-mobymask-v2:local @@ -61,6 +73,8 @@ services: depends_on: mobymask-watcher-db: condition: service_healthy + peer-ids-gen: + condition: service_completed_successfully mobymask: condition: service_completed_successfully env_file: @@ -76,9 +90,9 @@ services: CERC_DEPLOYED_CONTRACT: ${CERC_DEPLOYED_CONTRACT} command: ["sh", "start-server.sh"] volumes: - - ../config/watcher-mobymask-v2/watcher-config-template.toml:/app/packages/mobymask-v2-watcher/environments/watcher-config-template.toml - - ../config/watcher-mobymask-v2/start-server.sh:/app/packages/mobymask-v2-watcher/start-server.sh - - peers_ids:/app/packages/mobymask-v2-watcher/peers + - ../config/watcher-mobymask-v2/watcher-config-template.toml:/app/environments/watcher-config-template.toml + - ../config/watcher-mobymask-v2/start-server.sh:/app/start-server.sh + - peers_ids:/app/peers - mobymask_deployment:/server - fixturenet_geth_accounts:/geth-accounts:ro # Expose GQL, metrics and relay node ports @@ -95,6 +109,28 @@ services: extra_hosts: - "host.docker.internal:host-gateway" + # Container to run peer tests + peer-tests: + image: cerc/watcher-ts:local + restart: on-failure + depends_on: + mobymask-watcher-server: + condition: service_healthy + peer-ids-gen: + condition: service_completed_successfully + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + working_dir: /app/packages/peer + command: + - sh + - -c + - | + ./set-tests-env.sh && \ + tail -f /dev/null + volumes: + - ../config/watcher-mobymask-v2/set-tests-env.sh:/app/packages/peer/set-tests-env.sh + - peers_ids:/peer-ids + volumes: mobymask_watcher_db_data: peers_ids: diff --git a/app/data/config/watcher-mobymask-v2/generate-peer-ids.sh b/app/data/config/watcher-mobymask-v2/generate-peer-ids.sh new file mode 100755 index 00000000..5c97c45d --- /dev/null +++ b/app/data/config/watcher-mobymask-v2/generate-peer-ids.sh @@ -0,0 +1,20 @@ +#!/bin/sh +set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi + +# Check for peer ids in ./peers folder, create if not present +if [ -f /peer-ids/relay-id.json ]; then + echo "Using peer id for relay node from the mounted volume" +else + echo "Creating a new peer id for relay node" + yarn create-peer -f /peer-ids/relay-id.json +fi + +if [ -f /peer-ids/peer-id.json ]; then + echo "Using peer id for peer node from the mounted volume" +else + echo "Creating a new peer id for peer node" + yarn create-peer -f /peer-ids/peer-id.json +fi diff --git a/app/data/config/watcher-mobymask-v2/set-tests-env.sh b/app/data/config/watcher-mobymask-v2/set-tests-env.sh new file mode 100755 index 00000000..5e31b763 --- /dev/null +++ b/app/data/config/watcher-mobymask-v2/set-tests-env.sh @@ -0,0 +1,10 @@ +#!/bin/sh +set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi + +CERC_RELAY_MULTIADDR="/dns4/mobymask-watcher-server/tcp/9090/ws/p2p/$(jq -r '.id' /peer-ids/relay-id.json)" + +# Write the relay node's multiaddr to /app/packages/peer/.env for running tests +echo "RELAY=\"$CERC_RELAY_MULTIADDR\"" > ./.env diff --git a/app/data/config/watcher-mobymask-v2/start-server.sh b/app/data/config/watcher-mobymask-v2/start-server.sh index b5a3518e..02184842 100755 --- a/app/data/config/watcher-mobymask-v2/start-server.sh +++ b/app/data/config/watcher-mobymask-v2/start-server.sh @@ -14,26 +14,7 @@ CERC_DEPLOYED_CONTRACT="${CERC_DEPLOYED_CONTRACT:-${DEFAULT_CERC_DEPLOYED_CONTRA echo "Using L2 RPC endpoint ${CERC_L2_GETH_RPC}" -# Check for peer ids in ./peers folder, create if not present -if [ -f ./peers/relay-id.json ]; then - echo "Using peer id for relay node from the mounted volume" -else - echo "Creating a new peer id for relay node" - cd ../peer - yarn create-peer -f ../mobymask-v2-watcher/peers/relay-id.json - cd ../mobymask-v2-watcher -fi - -if [ -f ./peers/peer-id.json ]; then - echo "Using peer id for peer node from the mounted volume" -else - echo "Creating a new peer id for peer node" - cd ../peer - yarn create-peer -f ../mobymask-v2-watcher/peers/peer-id.json - cd ../mobymask-v2-watcher -fi - -CERC_RELAY_MULTIADDR="/dns4/mobymask-watcher-server/tcp/9090/ws/p2p/$(jq -r '.id' ./peers/relay-id.json)" +CERC_RELAY_MULTIADDR="/dns4/mobymask-watcher-server/tcp/9090/ws/p2p/$(jq -r '.id' /app/peers/relay-id.json)" # Use contract address from environment variable or set from config.json in mounted volume if [ -n "$CERC_DEPLOYED_CONTRACT" ]; then @@ -65,8 +46,5 @@ WATCHER_CONFIG=$(echo "$WATCHER_CONFIG_TEMPLATE" | \ # Write the modified content to a new file echo "$WATCHER_CONFIG" > environments/local.toml -# Write the relay node's multiaddr to /app/packages/peer/.env for running tests -echo "RELAY=\"$CERC_RELAY_MULTIADDR\"" > /app/packages/peer/.env - echo 'yarn server' yarn server diff --git a/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile b/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile index 18aff5cd..9d1a70b7 100644 --- a/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile +++ b/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile @@ -17,4 +17,4 @@ COPY . . RUN echo "Building watcher-ts" && \ yarn && yarn build -WORKDIR /app/packages/mobymask-v2-watcher +WORKDIR /app diff --git a/app/data/container-build/cerc-watcher-mobymask-v2/build.sh b/app/data/container-build/cerc-watcher-mobymask-v2/build.sh index f8b59224..b26ad999 100755 --- a/app/data/container-build/cerc-watcher-mobymask-v2/build.sh +++ b/app/data/container-build/cerc-watcher-mobymask-v2/build.sh @@ -6,4 +6,4 @@ source ${CERC_CONTAINER_BASE_DIR}/build-base.sh # See: https://stackoverflow.com/a/246128/1701505 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -docker build -t cerc/watcher-mobymask-v2:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/watcher-ts +docker build -t cerc/watcher-mobymask-v2:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/mobymask-v2-watcher-ts diff --git a/app/data/container-build/cerc-watcher-ts/Dockerfile b/app/data/container-build/cerc-watcher-ts/Dockerfile new file mode 100644 index 00000000..75ba2efa --- /dev/null +++ b/app/data/container-build/cerc-watcher-ts/Dockerfile @@ -0,0 +1,10 @@ +FROM node:16.17.1-alpine3.16 + +RUN apk --update --no-cache add git python3 alpine-sdk jq + +WORKDIR /app + +COPY . . + +RUN echo "Building watcher-ts" && \ + yarn && yarn build diff --git a/app/data/container-build/cerc-watcher-ts/build.sh b/app/data/container-build/cerc-watcher-ts/build.sh new file mode 100755 index 00000000..e180ec0e --- /dev/null +++ b/app/data/container-build/cerc-watcher-ts/build.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# Build cerc/watcher-erc20 + +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t cerc/watcher-ts:local -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/watcher-ts diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index 150d81ae..0635c4c8 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -14,6 +14,7 @@ cerc/laconic-registry-cli cerc/laconic-console-host cerc/fixturenet-eth-geth cerc/fixturenet-eth-lighthouse +cerc/watcher-ts cerc/watcher-mobymask cerc/watcher-erc20 cerc/watcher-erc721 diff --git a/app/data/pod-list.txt b/app/data/pod-list.txt index f24c9ed0..ef42ad9e 100644 --- a/app/data/pod-list.txt +++ b/app/data/pod-list.txt @@ -10,6 +10,7 @@ laconicd fixturenet-laconicd fixturenet-eth fixturenet-eth-metrics +watcher-ts watcher-mobymask watcher-erc20 watcher-erc721 diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index 3f8c84bf..bfb6085c 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -12,6 +12,7 @@ cerc-io/laconic-registry-cli cerc-io/laconic-console cerc-io/mobymask-watcher cerc-io/watcher-ts +cerc-io/mobymask-v2-watcher-ts cerc-io/react-peer cerc-io/mobymask-ui cerc-io/MobyMask diff --git a/app/data/stacks/mobymask-v2/README.md b/app/data/stacks/mobymask-v2/README.md index aaa4ac7f..fb4aebcd 100644 --- a/app/data/stacks/mobymask-v2/README.md +++ b/app/data/stacks/mobymask-v2/README.md @@ -23,15 +23,7 @@ Checkout to the required versions and branches in repos ```bash # watcher-ts cd ~/cerc/watcher-ts -git checkout v0.2.35 - -# react-peer -cd ~/cerc/react-peer -git checkout v0.2.32 - -# mobymask-ui -cd ~/cerc/mobymask-ui -git checkout v0.1.2 +git checkout v0.2.39 # MobyMask cd ~/cerc/MobyMask @@ -73,13 +65,13 @@ Deploy the stack: Find the watcher container's id and export it for later use: ```bash -export CONTAINER_ID=$(docker ps -q --filter "name=mobymask-watcher-server") +export CONTAINER_ID=$(docker ps -q --filter "name=peer-tests") ``` Run the peer tests: ```bash -docker exec -w /app/packages/peer $CONTAINER_ID yarn test +docker exec $CONTAINER_ID yarn test ``` ## Web Apps diff --git a/app/data/stacks/mobymask-v2/demo.md b/app/data/stacks/mobymask-v2/demo.md index 329b554d..953390cf 100644 --- a/app/data/stacks/mobymask-v2/demo.md +++ b/app/data/stacks/mobymask-v2/demo.md @@ -66,7 +66,7 @@ * Get the deployed contract address: ```bash - docker exec -it $(docker ps -aq --filter name="mobymask-app") cat src/config.json + docker exec -it $(docker ps -aq --filter name="mobymask-app") cat /config/config.yml ``` The value of `address` field is the deployed contract address diff --git a/app/data/stacks/mobymask-v2/stack.yml b/app/data/stacks/mobymask-v2/stack.yml index 248351b1..b91e4461 100644 --- a/app/data/stacks/mobymask-v2/stack.yml +++ b/app/data/stacks/mobymask-v2/stack.yml @@ -6,8 +6,7 @@ repos: - ethereum-optimism/optimism - ethereum-optimism/op-geth - cerc-io/watcher-ts - - cerc-io/react-peer - - cerc-io/mobymask-ui + - cerc-io/mobymask-v2-watcher-ts - cerc-io/MobyMask containers: - cerc/go-ethereum @@ -19,6 +18,7 @@ containers: - cerc/optimism-l2geth - cerc/optimism-op-batcher - cerc/optimism-op-node + - cerc/watcher-ts - cerc/watcher-mobymask-v2 - cerc/react-peer - cerc/mobymask-ui diff --git a/app/data/stacks/mobymask-v2/web-apps.md b/app/data/stacks/mobymask-v2/web-apps.md index 866f22f0..76293f1f 100644 --- a/app/data/stacks/mobymask-v2/web-apps.md +++ b/app/data/stacks/mobymask-v2/web-apps.md @@ -6,26 +6,6 @@ Instructions to setup and deploy MobyMask and Peer Test web apps Prerequisite: Watcher with GQL and relay node endpoints -Clone required repositories: - -```bash -laconic-so --stack mobymask-v2 setup-repositories --include cerc-io/react-peer,cerc-io/mobymask-ui - -# If this throws an error as a result of being already checked out to a branch/tag in a repo, remove the repositories mentioned below and re-run the command -``` - -Checkout to the required versions and branches in repos: - -```bash -# react-peer -cd ~/cerc/react-peer -git checkout v0.2.32 - -# mobymask-ui -cd ~/cerc/mobymask-ui -git checkout v0.1.2 -``` - Build the container images: ```bash From a3b3ac18b194d615a6219eaf34b5fcde41c8b66c Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 19 Apr 2023 14:55:36 -0600 Subject: [PATCH 0429/1010] Fix build script (#351) Former-commit-id: c07113320bbbcc47a82d385ff78108b8bbd6c38e --- .gitignore | 3 ++- scripts/build_shiv_package.sh | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 4b30a1d3..8ae2b229 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ laconic-so laconic_stack_orchestrator.egg-info __pycache__ *~ -build +package +app/data/build_tag.txt diff --git a/scripts/build_shiv_package.sh b/scripts/build_shiv_package.sh index 3d0c12ff..c1841415 100755 --- a/scripts/build_shiv_package.sh +++ b/scripts/build_shiv_package.sh @@ -1,4 +1,4 @@ # Builds the shiv "package" for distribution mkdir -p ./package -version_string=$( ./app/data/version.txt ) +version_string=$( ./scripts/create_build_tag_file.sh ) shiv -c laconic-so -o package/laconic-so-${version_string} . From 55b2d3bd25b49be93d141d51514b71df3499b1ee Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 19 Apr 2023 15:16:34 -0600 Subject: [PATCH 0430/1010] Update setuptools in case the version on the machine is old (#352) Former-commit-id: 5ef37894ce62aa40814ce9f97d21e87926cd3244 --- scripts/developer-mode-setup.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/developer-mode-setup.sh b/scripts/developer-mode-setup.sh index 997c6173..bd60a770 100755 --- a/scripts/developer-mode-setup.sh +++ b/scripts/developer-mode-setup.sh @@ -7,5 +7,6 @@ if [[ -n "$CERC_SCRIPT_DEBUG" ]]; then fi python3 -m venv venv source ./venv/bin/activate -pip install --editable . +python3 -m pip install --upgrade pip setuptools wheel pip install shiv +pip install --editable . From db1edd85e6fb4707289baa3899537474b6f86315 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 19 Apr 2023 15:29:41 -0600 Subject: [PATCH 0431/1010] Catch and report git errors (#353) Former-commit-id: 7c867171e4dad0d841732b3b92a64061bd66c8cf --- app/setup_repositories.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/setup_repositories.py b/app/setup_repositories.py index 6f148b87..e8c08916 100644 --- a/app/setup_repositories.py +++ b/app/setup_repositories.py @@ -175,4 +175,8 @@ def command(ctx, include, exclude, git_ssh, check_only, pull, branches_file): git_repo.git.checkout(branch_to_checkout) for repo in repos: - process_repo(repo) + try: + process_repo(repo) + except git.exc.GitCommandError as error: + print(f"\n******* git command returned error exit status:\n{error}") + sys.exit(1) From 2d5abdce45159c80b8a8012af5bb38f3812fbba4 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 19 Apr 2023 16:00:41 -0600 Subject: [PATCH 0432/1010] Set context dir to the script dir to avoid permission errors (#354) Former-commit-id: bde48b699d57ba1e7648fee7fe0935eb8ba21347 --- .../container-build/cerc-act-runner-task-executor/build.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/data/container-build/cerc-act-runner-task-executor/build.sh b/app/data/container-build/cerc-act-runner-task-executor/build.sh index 53bfd23b..25620a53 100755 --- a/app/data/container-build/cerc-act-runner-task-executor/build.sh +++ b/app/data/container-build/cerc-act-runner-task-executor/build.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash # Build a local version of the task executor for act-runner source ${CERC_CONTAINER_BASE_DIR}/build-base.sh -docker build -t cerc/act-runner-task-executor:local -f ${CERC_REPO_BASE_DIR}/hosting/gitea/Dockerfile.task-executor ${build_command_args} ${CERC_REPO_BASE_DIR}/hosting +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +docker build -t cerc/act-runner-task-executor:local -f ${CERC_REPO_BASE_DIR}/hosting/gitea/Dockerfile.task-executor ${build_command_args} ${SCRIPT_DIR} From 6ce01a79ede655f287a07164f3952da6fad1dad3 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 19 Apr 2023 16:43:59 -0600 Subject: [PATCH 0433/1010] Update base containers (#355) * Update to Node18 * Update to latest stable lighthouse Former-commit-id: a335ccde3ae921c2f445086fc9ce78511faf4a24 --- app/data/container-build/cerc-laconic-console-host/Dockerfile | 2 +- app/data/container-build/cerc-lighthouse/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/data/container-build/cerc-laconic-console-host/Dockerfile b/app/data/container-build/cerc-laconic-console-host/Dockerfile index a31aa265..7e3fc46b 100644 --- a/app/data/container-build/cerc-laconic-console-host/Dockerfile +++ b/app/data/container-build/cerc-laconic-console-host/Dockerfile @@ -1,6 +1,6 @@ # Originally from: https://github.com/devcontainers/images/blob/main/src/javascript-node/.devcontainer/Dockerfile # [Choice] Node.js version (use -bullseye variants on local arm64/Apple Silicon): 18, 16, 14, 18-bullseye, 16-bullseye, 14-bullseye, 18-buster, 16-buster, 14-buster -ARG VARIANT=16-bullseye +ARG VARIANT=18-bullseye FROM node:${VARIANT} ARG USERNAME=node diff --git a/app/data/container-build/cerc-lighthouse/Dockerfile b/app/data/container-build/cerc-lighthouse/Dockerfile index 14f0a2ae..7d4fe5d8 100644 --- a/app/data/container-build/cerc-lighthouse/Dockerfile +++ b/app/data/container-build/cerc-lighthouse/Dockerfile @@ -1,4 +1,4 @@ -FROM sigp/lighthouse:v3.2.1-modern +FROM sigp/lighthouse:v4.0.1-modern RUN apt-get update; apt-get install bash netcat curl less jq -y; From ea7c5109b891e5e309609e73b613fbed3469d8fd Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 19 Apr 2023 18:20:00 -0600 Subject: [PATCH 0434/1010] Add fixturenet-eth test Former-commit-id: db6da4b75a510b8ab3c153e53632495b29a863ae --- .gitea/fixturenet-eth-test.yml | 27 ++++++++++++++++++++++ tests/fixturenet-eth/run-test.sh | 39 ++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 .gitea/fixturenet-eth-test.yml create mode 100755 tests/fixturenet-eth/run-test.sh diff --git a/.gitea/fixturenet-eth-test.yml b/.gitea/fixturenet-eth-test.yml new file mode 100644 index 00000000..64806382 --- /dev/null +++ b/.gitea/fixturenet-eth-test.yml @@ -0,0 +1,27 @@ +name: Fixturenet-Eth-Test + +on: + push: + branches: 'test-ci' + +jobs: + test: + name: "Run an Ethereum fixturenet test" + runs-on: ubuntu-latest + steps: + - name: "Clone project repository" + uses: actions/checkout@v3 + - name: "Install Python" + uses: cerc-io/setup-python@v4 + with: + python-version: '3.8' + - name: "Print Python version" + run: python3 --version + - name: "Install shiv" + run: pip install shiv + - name: "Generate build version file" + run: ./scripts/create_build_tag_file.sh + - name: "Build local shiv package" + run: ./scripts/build_shiv_package.sh + - name: "Run fixturenet-eth tests" + run: ./tests/fixturenet-eth/run-test.sh diff --git a/tests/fixturenet-eth/run-test.sh b/tests/fixturenet-eth/run-test.sh new file mode 100755 index 00000000..3fd4cd59 --- /dev/null +++ b/tests/fixturenet-eth/run-test.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi +set -e +echo "Running stack-orchestrator Ethereum fixturenet test" +# Bit of a hack, test the most recent package +TEST_TARGET_SO=$( ls -t1 ./package/laconic-so* | head -1 ) +# Set a new unique repo dir +export CERC_REPO_BASE_DIR=$(mktemp -d stack-orchestrator-fixturenet-eth-test.XXXXXXXXXX) +echo "Testing this package: $TEST_TARGET_SO" +echo "Test version command" +reported_version_string=$( $TEST_TARGET_SO version ) +echo "Version reported is: ${reported_version_string}" +echo "Cloning repositories into: $CERC_REPO_BASE_DIR" +$TEST_TARGET_SO --stack fixturenet-eth setup-repositories +$TEST_TARGET_SO --stack fixturenet-eth build-containers +$TEST_TARGET_SO --stack fixturenet-eth deploy up +# Verify that the fixturenet is up and running +$TEST_TARGET_SO --stack fixturenet-eth deploy ps +$TEST_TARGET_SO --stack fixturenet-eth deploy exec fixturenet-eth-bootnode-lighthouse /scripts/status-internal.sh +initial_block_number=$($TEST_TARGET_SO --stack fixturenet-eth deploy exec foundry "cast block-number") +# Check that the block number increases some time later +sleep 12 +subsequent_block_number=$($TEST_TARGET_SO --stack fixturenet-eth deploy exec foundry "cast block-number") +block_number_difference=$((subsequent_block_number - initial_block_number)) +# Block height difference should be between 1 and some small number +if [[ $block_number_difference -gt 1 && $block_number_difference -lt 10 ]]; then + echo "Test passed" + test_result=0 +else + echo "Test failed: block numbers were ${initial_block_number} and ${subsequent_block_number}" + test_result=1 +fi +$TEST_TARGET_SO --stack fixturenet-eth deploy down +echo "Removing cloned repositories" +rm -rf $CERC_REPO_BASE_DIR +exit $test_result From beac97b842f028006d7fbbad01f0d730c1a400bc Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 19 Apr 2023 18:22:18 -0600 Subject: [PATCH 0435/1010] Get branch name right Former-commit-id: 8aed8ab8ae3e9263eda0e073127c9d4b7b8154b8 --- .gitea/fixturenet-eth-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/fixturenet-eth-test.yml b/.gitea/fixturenet-eth-test.yml index 64806382..6b764664 100644 --- a/.gitea/fixturenet-eth-test.yml +++ b/.gitea/fixturenet-eth-test.yml @@ -2,7 +2,7 @@ name: Fixturenet-Eth-Test on: push: - branches: 'test-ci' + branches: 'ci-test' jobs: test: From d98b02266b5a19a1f0810ca85b63ad565a47b069 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 19 Apr 2023 18:25:49 -0600 Subject: [PATCH 0436/1010] Add fixturenet-eth test (#356) * Add fixturenet-eth test Former-commit-id: d1cada5029692aec1b0f76f5bdd17468cf85909f --- .gitea/fixturenet-eth-test.yml | 27 ++++++++++++++++++++++ tests/fixturenet-eth/run-test.sh | 39 ++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 .gitea/fixturenet-eth-test.yml create mode 100755 tests/fixturenet-eth/run-test.sh diff --git a/.gitea/fixturenet-eth-test.yml b/.gitea/fixturenet-eth-test.yml new file mode 100644 index 00000000..6b764664 --- /dev/null +++ b/.gitea/fixturenet-eth-test.yml @@ -0,0 +1,27 @@ +name: Fixturenet-Eth-Test + +on: + push: + branches: 'ci-test' + +jobs: + test: + name: "Run an Ethereum fixturenet test" + runs-on: ubuntu-latest + steps: + - name: "Clone project repository" + uses: actions/checkout@v3 + - name: "Install Python" + uses: cerc-io/setup-python@v4 + with: + python-version: '3.8' + - name: "Print Python version" + run: python3 --version + - name: "Install shiv" + run: pip install shiv + - name: "Generate build version file" + run: ./scripts/create_build_tag_file.sh + - name: "Build local shiv package" + run: ./scripts/build_shiv_package.sh + - name: "Run fixturenet-eth tests" + run: ./tests/fixturenet-eth/run-test.sh diff --git a/tests/fixturenet-eth/run-test.sh b/tests/fixturenet-eth/run-test.sh new file mode 100755 index 00000000..3fd4cd59 --- /dev/null +++ b/tests/fixturenet-eth/run-test.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi +set -e +echo "Running stack-orchestrator Ethereum fixturenet test" +# Bit of a hack, test the most recent package +TEST_TARGET_SO=$( ls -t1 ./package/laconic-so* | head -1 ) +# Set a new unique repo dir +export CERC_REPO_BASE_DIR=$(mktemp -d stack-orchestrator-fixturenet-eth-test.XXXXXXXXXX) +echo "Testing this package: $TEST_TARGET_SO" +echo "Test version command" +reported_version_string=$( $TEST_TARGET_SO version ) +echo "Version reported is: ${reported_version_string}" +echo "Cloning repositories into: $CERC_REPO_BASE_DIR" +$TEST_TARGET_SO --stack fixturenet-eth setup-repositories +$TEST_TARGET_SO --stack fixturenet-eth build-containers +$TEST_TARGET_SO --stack fixturenet-eth deploy up +# Verify that the fixturenet is up and running +$TEST_TARGET_SO --stack fixturenet-eth deploy ps +$TEST_TARGET_SO --stack fixturenet-eth deploy exec fixturenet-eth-bootnode-lighthouse /scripts/status-internal.sh +initial_block_number=$($TEST_TARGET_SO --stack fixturenet-eth deploy exec foundry "cast block-number") +# Check that the block number increases some time later +sleep 12 +subsequent_block_number=$($TEST_TARGET_SO --stack fixturenet-eth deploy exec foundry "cast block-number") +block_number_difference=$((subsequent_block_number - initial_block_number)) +# Block height difference should be between 1 and some small number +if [[ $block_number_difference -gt 1 && $block_number_difference -lt 10 ]]; then + echo "Test passed" + test_result=0 +else + echo "Test failed: block numbers were ${initial_block_number} and ${subsequent_block_number}" + test_result=1 +fi +$TEST_TARGET_SO --stack fixturenet-eth deploy down +echo "Removing cloned repositories" +rm -rf $CERC_REPO_BASE_DIR +exit $test_result From fefbcf031c713e41e8a43bfb5c1df7bb07d9dd84 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 19 Apr 2023 18:27:56 -0600 Subject: [PATCH 0437/1010] Put file in the right place Former-commit-id: aadd1c15f03e18701e035204e22a652f1e30329c --- .gitea/{ => workflows}/fixturenet-eth-test.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .gitea/{ => workflows}/fixturenet-eth-test.yml (100%) diff --git a/.gitea/fixturenet-eth-test.yml b/.gitea/workflows/fixturenet-eth-test.yml similarity index 100% rename from .gitea/fixturenet-eth-test.yml rename to .gitea/workflows/fixturenet-eth-test.yml From 209d49f10501078a36929018688007db566438cd Mon Sep 17 00:00:00 2001 From: Zach Date: Wed, 19 Apr 2023 21:10:19 -0400 Subject: [PATCH 0438/1010] Update laconicd-fixturenet.md Former-commit-id: 32c0830e777ec3ca9d9b638e4c0d6071cd9d4aaa --- docs/laconicd-fixturenet.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/laconicd-fixturenet.md b/docs/laconicd-fixturenet.md index 66ae1020..eacdf33e 100644 --- a/docs/laconicd-fixturenet.md +++ b/docs/laconicd-fixturenet.md @@ -72,7 +72,7 @@ It's possible to run into an `ESOCKETTIMEDOUT` error, e.g., `error An unexpected 4. Set this environment variable to your droplet's IP address: ``` -export LACONIC_HOSTED_ENDPOINT=http://68.183.195.210 +export LACONIC_HOSTED_ENDPOINT=http:// ``` 5. Deploy the stack: From e3e48ccbf3bc6715cc0fe461a41dd9a13cd3b349 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 19 Apr 2023 20:56:19 -0600 Subject: [PATCH 0439/1010] Delete fixturenet-eth-test.yml Former-commit-id: 5c53e3bedc92846a06334a7ab9041150c031c623 --- .gitea/fixturenet-eth-test.yml | 27 --------------------------- 1 file changed, 27 deletions(-) delete mode 100644 .gitea/fixturenet-eth-test.yml diff --git a/.gitea/fixturenet-eth-test.yml b/.gitea/fixturenet-eth-test.yml deleted file mode 100644 index 6b764664..00000000 --- a/.gitea/fixturenet-eth-test.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: Fixturenet-Eth-Test - -on: - push: - branches: 'ci-test' - -jobs: - test: - name: "Run an Ethereum fixturenet test" - runs-on: ubuntu-latest - steps: - - name: "Clone project repository" - uses: actions/checkout@v3 - - name: "Install Python" - uses: cerc-io/setup-python@v4 - with: - python-version: '3.8' - - name: "Print Python version" - run: python3 --version - - name: "Install shiv" - run: pip install shiv - - name: "Generate build version file" - run: ./scripts/create_build_tag_file.sh - - name: "Build local shiv package" - run: ./scripts/build_shiv_package.sh - - name: "Run fixturenet-eth tests" - run: ./tests/fixturenet-eth/run-test.sh From b3feab0592d2809047c0beeb2bba01224f5f7a10 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Wed, 19 Apr 2023 21:32:48 -0600 Subject: [PATCH 0440/1010] Turn off CI job on push except for to main Former-commit-id: 727fa67d8e0e5ac467388d8af29a6a99c15b74de --- .gitea/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml index fd1c739c..96cfb8cd 100644 --- a/.gitea/workflows/test.yml +++ b/.gitea/workflows/test.yml @@ -4,7 +4,7 @@ on: pull_request: branches: '*' push: - branches: '*' + branches: 'main' jobs: test: From 35dd30f877fcf5fed5b8c5571a88780cfb9324f4 Mon Sep 17 00:00:00 2001 From: Nabarun Gogoi Date: Thu, 20 Apr 2023 10:49:19 +0530 Subject: [PATCH 0441/1010] Add container to mobymask-v2 stack for LXDAO mobymask-app (#347) * Add container to stack for lxdao mobymask-app * Remove shm_size * Use cerc-io scoped alias for lxdao app package * Change alias to @cerc-io/mobymask-ui-lxdao Former-commit-id: 46b36c3cb6e9b4cbbaf908052d49e498f6397f33 --- .../compose/docker-compose-mobymask-app.yml | 40 ++++++++++++++++++- .../cerc-mobymask-ui/Dockerfile | 9 +++-- .../cerc-mobymask-ui/start-serving-app.sh | 2 +- 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/app/data/compose/docker-compose-mobymask-app.yml b/app/data/compose/docker-compose-mobymask-app.yml index 6df48130..f2b30a4b 100644 --- a/app/data/compose/docker-compose-mobymask-app.yml +++ b/app/data/compose/docker-compose-mobymask-app.yml @@ -13,6 +13,7 @@ services: CERC_DEPLOYED_CONTRACT: ${CERC_DEPLOYED_CONTRACT} CERC_APP_WATCHER_URL: ${CERC_APP_WATCHER_URL} CERC_RELAY_NODES: ${CERC_RELAY_NODES} + CERC_BUILD_DIR: "@cerc-io/mobymask-ui/build" working_dir: /scripts # Waits for watcher server to be up before app build # Required when running with watcher stack to get deployed contract address @@ -28,12 +29,47 @@ services: ports: - "0.0.0.0:3002:80" healthcheck: - test: ["CMD", "nc", "-v", "localhost", "80"] + test: ["CMD", "nc", "-vz", "localhost", "80"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 10s + extra_hosts: + - "host.docker.internal:host-gateway" + + # Builds and serves the LXDAO version of MobyMask react-app + lxdao-mobymask-app: + restart: unless-stopped + image: cerc/mobymask-ui:local + env_file: + - ../config/watcher-mobymask-v2/mobymask-params.env + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_CHAIN_ID: ${CERC_CHAIN_ID} + CERC_DEPLOYED_CONTRACT: ${CERC_DEPLOYED_CONTRACT} + CERC_APP_WATCHER_URL: ${CERC_APP_WATCHER_URL} + CERC_RELAY_NODES: ${CERC_RELAY_NODES} + CERC_BUILD_DIR: "@cerc-io/mobymask-ui-lxdao/build" + working_dir: /scripts + # Waits for watcher server to be up before app build + # Required when running with watcher stack to get deployed contract address + command: + - sh + - -c + - ./wait-for-it.sh -h ${CERC_WATCHER_HOST:-$${DEFAULT_CERC_WATCHER_HOST}} -p ${CERC_WATCHER_PORT:-$${DEFAULT_CERC_WATCHER_PORT}} -s -t 0 -- ./mobymask-app-start.sh + volumes: + - ../config/wait-for-it.sh:/scripts/wait-for-it.sh + - ../config/watcher-mobymask-v2/mobymask-app-start.sh:/scripts/mobymask-app-start.sh + - peers_ids:/peers + - mobymask_deployment:/server + ports: + - "0.0.0.0:3004:80" + healthcheck: + test: ["CMD", "nc", "-vz", "localhost", "80"] interval: 20s timeout: 5s retries: 15 start_period: 10s - shm_size: '1GB' extra_hosts: - "host.docker.internal:host-gateway" diff --git a/app/data/container-build/cerc-mobymask-ui/Dockerfile b/app/data/container-build/cerc-mobymask-ui/Dockerfile index 3f04ec45..4ff202bc 100644 --- a/app/data/container-build/cerc-mobymask-ui/Dockerfile +++ b/app/data/container-build/cerc-mobymask-ui/Dockerfile @@ -31,7 +31,7 @@ RUN \ # Install additional OS packages. RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ - && apt-get -y install --no-install-recommends jq bash + && apt-get -y install --no-install-recommends jq bash netcat # We do this to get a yq binary from the published container, for the correct architecture we're building here COPY --from=docker.io/mikefarah/yq:latest /usr/bin/yq /usr/local/bin/yq @@ -48,8 +48,11 @@ RUN mkdir -p /config # Install simple web server for now (use nginx perhaps later) RUN yarn global add http-server -# Globally install the payload web app package -RUN yarn global add @cerc-io/mobymask-ui +# Globally install both versions of the payload web app package +# Install old version of MobyMask web app +RUN yarn global add @cerc-io/mobymask-ui@0.1.2 +# Install the LXDAO version of MobyMask web app +RUN yarn global add @cerc-io/mobymask-ui-lxdao@npm:@cerc-io/mobymask-ui@0.1.2-lxdao-0.1.0 # Expose port for http EXPOSE 80 diff --git a/app/data/container-build/cerc-mobymask-ui/start-serving-app.sh b/app/data/container-build/cerc-mobymask-ui/start-serving-app.sh index 4e0a976c..0e11b447 100755 --- a/app/data/container-build/cerc-mobymask-ui/start-serving-app.sh +++ b/app/data/container-build/cerc-mobymask-ui/start-serving-app.sh @@ -4,6 +4,6 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then fi # TODO: Don't hard wire this: -webapp_files_dir=/usr/local/share/.config/yarn/global/node_modules/@cerc-io/mobymask-ui/build +webapp_files_dir="/usr/local/share/.config/yarn/global/node_modules/${CERC_BUILD_DIR}" /scripts/apply-webapp-config.sh /config/config.yml ${webapp_files_dir} MOBYMASK_HOSTED_CONFIG http-server -p 80 ${webapp_files_dir} From 3d75523d736a76e4cc404049aec2be5bdedefbc2 Mon Sep 17 00:00:00 2001 From: Nabarun Gogoi Date: Thu, 20 Apr 2023 14:45:01 +0530 Subject: [PATCH 0442/1010] Upgrade web-app package versions to set custom relay node (#358) Former-commit-id: 01499a3f053e36ec9546f998e83656d94e682021 --- app/data/container-build/cerc-mobymask-ui/Dockerfile | 4 ++-- app/data/container-build/cerc-react-peer/Dockerfile | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/data/container-build/cerc-mobymask-ui/Dockerfile b/app/data/container-build/cerc-mobymask-ui/Dockerfile index 4ff202bc..e5a804b4 100644 --- a/app/data/container-build/cerc-mobymask-ui/Dockerfile +++ b/app/data/container-build/cerc-mobymask-ui/Dockerfile @@ -50,9 +50,9 @@ RUN yarn global add http-server # Globally install both versions of the payload web app package # Install old version of MobyMask web app -RUN yarn global add @cerc-io/mobymask-ui@0.1.2 +RUN yarn global add @cerc-io/mobymask-ui@0.1.3 # Install the LXDAO version of MobyMask web app -RUN yarn global add @cerc-io/mobymask-ui-lxdao@npm:@cerc-io/mobymask-ui@0.1.2-lxdao-0.1.0 +RUN yarn global add @cerc-io/mobymask-ui-lxdao@npm:@cerc-io/mobymask-ui@0.1.3-lxdao-0.1.0 # Expose port for http EXPOSE 80 diff --git a/app/data/container-build/cerc-react-peer/Dockerfile b/app/data/container-build/cerc-react-peer/Dockerfile index f60ba504..191f986b 100644 --- a/app/data/container-build/cerc-react-peer/Dockerfile +++ b/app/data/container-build/cerc-react-peer/Dockerfile @@ -21,8 +21,7 @@ RUN mkdir -p /config RUN yarn global add http-server # Globally install the payload web app package -RUN yarn global add @cerc-io/test-app - +RUN yarn global add @cerc-io/test-app@0.2.33 # Expose port for http EXPOSE 80 From 363a0b733f5da47f289d586658745a74d8acef40 Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Thu, 20 Apr 2023 15:12:59 +0530 Subject: [PATCH 0443/1010] Fetch geth accounts using an exposed endpoint (#357) * Fetch account creds served by geth service * Use fetched account creds in mobymask-v2 stack Former-commit-id: eb777b0b477c32791cfb7691814475176f923e26 --- .../compose/docker-compose-fixturenet-eth.yml | 2 -- .../docker-compose-fixturenet-optimism.yml | 3 +-- .../docker-compose-watcher-mobymask-v2.yml | 5 ++--- .../config/fixturenet-optimism/l1-params.env | 8 +++----- .../optimism-contracts/run.sh | 19 +++++++++++-------- .../deploy-and-generate-invite.sh | 16 +++++++++++----- .../watcher-mobymask-v2/optimism-params.env | 5 ++--- .../watcher-mobymask-v2/start-server.sh | 16 +++++++++++----- .../container-build/cerc-mobymask/Dockerfile | 2 +- .../cerc-optimism-contracts/Dockerfile | 2 +- .../cerc-watcher-mobymask-v2/Dockerfile | 2 +- app/data/stacks/fixturenet-eth/README.md | 4 ++-- app/data/stacks/fixturenet-optimism/README.md | 4 ++-- .../stacks/fixturenet-optimism/l2-only.md | 11 ++++++++--- app/data/stacks/mobymask-v2/README.md | 4 ++-- app/data/stacks/mobymask-v2/mobymask-only.md | 10 +++++++--- 16 files changed, 65 insertions(+), 48 deletions(-) diff --git a/app/data/compose/docker-compose-fixturenet-eth.yml b/app/data/compose/docker-compose-fixturenet-eth.yml index 2024cacb..c687b326 100644 --- a/app/data/compose/docker-compose-fixturenet-eth.yml +++ b/app/data/compose/docker-compose-fixturenet-eth.yml @@ -27,7 +27,6 @@ services: - ../config/fixturenet-eth/fixturenet-eth.env image: cerc/fixturenet-eth-geth:local volumes: - - fixturenet_geth_accounts:/opt/testnet/build/el - fixturenet_eth_geth_1_data:/root/ethdata healthcheck: test: ["CMD", "nc", "-v", "localhost", "8545"] @@ -116,7 +115,6 @@ services: condition: service_healthy volumes: - fixturenet_geth_accounts: fixturenet_eth_bootnode_geth_data: fixturenet_eth_geth_1_data: fixturenet_eth_geth_2_data: diff --git a/app/data/compose/docker-compose-fixturenet-optimism.yml b/app/data/compose/docker-compose-fixturenet-optimism.yml index cc1d64d3..c651e5a7 100644 --- a/app/data/compose/docker-compose-fixturenet-optimism.yml +++ b/app/data/compose/docker-compose-fixturenet-optimism.yml @@ -13,6 +13,7 @@ services: CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} CERC_L1_CHAIN_ID: ${CERC_L1_CHAIN_ID} CERC_L1_RPC: ${CERC_L1_RPC} + CERC_L1_ACCOUNTS_CSV_URL: ${CERC_L1_ACCOUNTS_CSV_URL} CERC_L1_ADDRESS: ${CERC_L1_ADDRESS} CERC_L1_PRIV_KEY: ${CERC_L1_PRIV_KEY} CERC_L1_ADDRESS_2: ${CERC_L1_ADDRESS_2} @@ -27,7 +28,6 @@ services: - ../container-build/cerc-optimism-contracts/hardhat-tasks/send-balance.ts:/app/packages/contracts-bedrock/tasks/send-balance.ts - ../config/fixturenet-optimism/optimism-contracts/update-config.js:/app/packages/contracts-bedrock/update-config.js - ../config/fixturenet-optimism/optimism-contracts/run.sh:/app/packages/contracts-bedrock/run.sh - - fixturenet_geth_accounts:/geth-accounts:ro - l2_accounts:/l2-accounts - l1_deployment:/app/packages/contracts-bedrock extra_hosts: @@ -126,7 +126,6 @@ services: - "host.docker.internal:host-gateway" volumes: - fixturenet_geth_accounts: l1_deployment: l2_accounts: l2_config: diff --git a/app/data/compose/docker-compose-watcher-mobymask-v2.yml b/app/data/compose/docker-compose-watcher-mobymask-v2.yml index fa68d017..58015fe1 100644 --- a/app/data/compose/docker-compose-watcher-mobymask-v2.yml +++ b/app/data/compose/docker-compose-watcher-mobymask-v2.yml @@ -34,6 +34,7 @@ services: CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} ENV: "PROD" CERC_L2_GETH_RPC: ${CERC_L2_GETH_RPC} + CERC_L1_ACCOUNTS_CSV_URL: ${CERC_L1_ACCOUNTS_CSV_URL} CERC_PRIVATE_KEY_DEPLOYER: ${CERC_PRIVATE_KEY_DEPLOYER} CERC_MOBYMASK_APP_BASE_URI: ${CERC_MOBYMASK_APP_BASE_URI} CERC_DEPLOYED_CONTRACT: ${CERC_DEPLOYED_CONTRACT} @@ -50,7 +51,6 @@ services: - ../config/watcher-mobymask-v2/secrets-template.json:/app/packages/server/secrets-template.json - ../config/watcher-mobymask-v2/deploy-and-generate-invite.sh:/app/packages/server/deploy-and-generate-invite.sh - mobymask_deployment:/app/packages/server - - fixturenet_geth_accounts:/geth-accounts:ro extra_hosts: - "host.docker.internal:host-gateway" @@ -83,6 +83,7 @@ services: environment: CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} CERC_L2_GETH_RPC: ${CERC_L2_GETH_RPC} + CERC_L1_ACCOUNTS_CSV_URL: ${CERC_L1_ACCOUNTS_CSV_URL} CERC_PRIVATE_KEY_PEER: ${CERC_PRIVATE_KEY_PEER} CERC_RELAY_PEERS: ${CERC_RELAY_PEERS} CERC_RELAY_ANNOUNCE_DOMAIN: ${CERC_RELAY_ANNOUNCE_DOMAIN} @@ -94,7 +95,6 @@ services: - ../config/watcher-mobymask-v2/start-server.sh:/app/start-server.sh - peers_ids:/app/peers - mobymask_deployment:/server - - fixturenet_geth_accounts:/geth-accounts:ro # Expose GQL, metrics and relay node ports ports: - "0.0.0.0:3001:3001" @@ -135,4 +135,3 @@ volumes: mobymask_watcher_db_data: peers_ids: mobymask_deployment: - fixturenet_geth_accounts: diff --git a/app/data/config/fixturenet-optimism/l1-params.env b/app/data/config/fixturenet-optimism/l1-params.env index 6b23c872..5353e62f 100644 --- a/app/data/config/fixturenet-optimism/l1-params.env +++ b/app/data/config/fixturenet-optimism/l1-params.env @@ -6,9 +6,7 @@ DEFAULT_CERC_L1_RPC="http://fixturenet-eth-geth-1:8545" DEFAULT_CERC_L1_HOST="fixturenet-eth-geth-1" DEFAULT_CERC_L1_PORT=8545 -# Credentials for accounts on L1 to send balance to Optimism Proxy contract from +# URL to get CSV with credentials for accounts on L1 +# that are used to send balance to Optimism Proxy contract # (enables them to do transactions on L2) -DEFAULT_CERC_L1_ADDRESS= -DEFAULT_CERC_L1_PRIV_KEY= -DEFAULT_CERC_L1_ADDRESS_2= -DEFAULT_CERC_L1_PRIV_KEY_2= +DEFAULT_CERC_L1_ACCOUNTS_CSV_URL="http://fixturenet-eth-bootnode-geth:9898/accounts.csv" diff --git a/app/data/config/fixturenet-optimism/optimism-contracts/run.sh b/app/data/config/fixturenet-optimism/optimism-contracts/run.sh index a256ea64..eb55e1fd 100755 --- a/app/data/config/fixturenet-optimism/optimism-contracts/run.sh +++ b/app/data/config/fixturenet-optimism/optimism-contracts/run.sh @@ -7,10 +7,7 @@ fi CERC_L1_CHAIN_ID="${CERC_L1_CHAIN_ID:-${DEFAULT_CERC_L1_CHAIN_ID}}" CERC_L1_RPC="${CERC_L1_RPC:-${DEFAULT_CERC_L1_RPC}}" -CERC_L1_ADDRESS="${CERC_L1_ADDRESS:-${DEFAULT_CERC_L1_ADDRESS}}" -CERC_L1_PRIV_KEY="${CERC_L1_PRIV_KEY:-${DEFAULT_CERC_L1_PRIV_KEY}}" -CERC_L1_ADDRESS_2="${CERC_L1_ADDRESS_2:-${DEFAULT_CERC_L1_ADDRESS_2}}" -CERC_L1_PRIV_KEY_2="${CERC_L1_PRIV_KEY_2:-${DEFAULT_CERC_L1_PRIV_KEY_2}}" +CERC_L1_ACCOUNTS_CSV_URL="${CERC_L1_ACCOUNTS_CSV_URL:-${DEFAULT_CERC_L1_ACCOUNTS_CSV_URL}}" echo "Using L1 RPC endpoint ${CERC_L1_RPC}" @@ -62,15 +59,21 @@ PROPOSER_ADDRESS=$(echo "$KEYS_JSON" | jq -r '.Proposer.address') BATCHER_ADDRESS=$(echo "$KEYS_JSON" | jq -r '.Batcher.address') SEQUENCER_ADDRESS=$(echo "$KEYS_JSON" | jq -r '.Sequencer.address') -# Read the private key of L1 accounts -if [ -f /geth-accounts/accounts.csv ]; then - echo "Using L1 account credentials from the mounted volume" +# Get the private keys of L1 accounts +if [ -n "$CERC_L1_ACCOUNTS_CSV_URL" ] && \ + l1_accounts_response=$(curl -L --write-out '%{http_code}' --silent --output /dev/null "$CERC_L1_ACCOUNTS_CSV_URL") && \ + [ "$l1_accounts_response" -eq 200 ]; +then + echo "Fetching L1 account credentials using provided URL" + mkdir -p /geth-accounts + wget -O /geth-accounts/accounts.csv "$CERC_L1_ACCOUNTS_CSV_URL" + CERC_L1_ADDRESS=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 2) CERC_L1_PRIV_KEY=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 3) CERC_L1_ADDRESS_2=$(awk -F, 'NR==2{print $(NF-1)}' /geth-accounts/accounts.csv) CERC_L1_PRIV_KEY_2=$(awk -F, 'NR==2{print $NF}' /geth-accounts/accounts.csv) else - echo "Using L1 account credentials from env" + echo "Couldn't fetch L1 account credentials, using them from env" fi # Select a finalized L1 block as the starting point for roll ups diff --git a/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh b/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh index 2e6ffcf7..30dab354 100755 --- a/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh +++ b/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh @@ -5,19 +5,25 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then fi CERC_L2_GETH_RPC="${CERC_L2_GETH_RPC:-${DEFAULT_CERC_L2_GETH_RPC}}" -CERC_PRIVATE_KEY_DEPLOYER="${CERC_PRIVATE_KEY_DEPLOYER:-${DEFAULT_CERC_PRIVATE_KEY_DEPLOYER}}" +CERC_L1_ACCOUNTS_CSV_URL="${CERC_L1_ACCOUNTS_CSV_URL:-${DEFAULT_CERC_L1_ACCOUNTS_CSV_URL}}" CERC_MOBYMASK_APP_BASE_URI="${CERC_MOBYMASK_APP_BASE_URI:-${DEFAULT_CERC_MOBYMASK_APP_BASE_URI}}" CERC_DEPLOYED_CONTRACT="${CERC_DEPLOYED_CONTRACT:-${DEFAULT_CERC_DEPLOYED_CONTRACT}}" echo "Using L2 RPC endpoint ${CERC_L2_GETH_RPC}" -if [ -f /geth-accounts/accounts.csv ]; then - echo "Using L1 private key from the mounted volume" - # Read the private key of L1 account to deploy contract +if [ -n "$CERC_L1_ACCOUNTS_CSV_URL" ] && \ + l1_accounts_response=$(curl -L --write-out '%{http_code}' --silent --output /dev/null "$CERC_L1_ACCOUNTS_CSV_URL") && \ + [ "$l1_accounts_response" -eq 200 ]; +then + echo "Fetching L1 account credentials using provided URL" + mkdir -p /geth-accounts + wget -O /geth-accounts/accounts.csv "$CERC_L1_ACCOUNTS_CSV_URL" + + # Read the private key of an L1 account to deploy contract CERC_PRIVATE_KEY_DEPLOYER=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 3) else - echo "Using CERC_PRIVATE_KEY_DEPLOYER from env" + echo "Couldn't fetch L1 account credentials, using CERC_PRIVATE_KEY_DEPLOYER from env" fi # Set the private key diff --git a/app/data/config/watcher-mobymask-v2/optimism-params.env b/app/data/config/watcher-mobymask-v2/optimism-params.env index 6bdc7ea3..67eb3314 100644 --- a/app/data/config/watcher-mobymask-v2/optimism-params.env +++ b/app/data/config/watcher-mobymask-v2/optimism-params.env @@ -8,6 +8,5 @@ DEFAULT_CERC_L2_GETH_PORT=8545 DEFAULT_CERC_L2_NODE_HOST="op-node" DEFAULT_CERC_L2_NODE_PORT=8547 -# Credentials for accounts to perform txs on L2 -DEFAULT_CERC_PRIVATE_KEY_DEPLOYER= -DEFAULT_CERC_PRIVATE_KEY_PEER= +# URL to get CSV with credentials for accounts on L1 to perform txs on L2 +DEFAULT_CERC_L1_ACCOUNTS_CSV_URL="http://fixturenet-eth-bootnode-geth:9898/accounts.csv" diff --git a/app/data/config/watcher-mobymask-v2/start-server.sh b/app/data/config/watcher-mobymask-v2/start-server.sh index 02184842..b46a7c14 100755 --- a/app/data/config/watcher-mobymask-v2/start-server.sh +++ b/app/data/config/watcher-mobymask-v2/start-server.sh @@ -5,7 +5,7 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then fi CERC_L2_GETH_RPC="${CERC_L2_GETH_RPC:-${DEFAULT_CERC_L2_GETH_RPC}}" -CERC_PRIVATE_KEY_PEER="${CERC_PRIVATE_KEY_PEER:-${DEFAULT_CERC_PRIVATE_KEY_PEER}}" +CERC_L1_ACCOUNTS_CSV_URL="${CERC_L1_ACCOUNTS_CSV_URL:-${DEFAULT_CERC_L1_ACCOUNTS_CSV_URL}}" CERC_RELAY_PEERS="${CERC_RELAY_PEERS:-${DEFAULT_CERC_RELAY_PEERS}}" CERC_RELAY_ANNOUNCE_DOMAIN="${CERC_RELAY_ANNOUNCE_DOMAIN:-${DEFAULT_CERC_RELAY_ANNOUNCE_DOMAIN}}" @@ -24,12 +24,18 @@ else CONTRACT_ADDRESS=$(jq -r '.address' /server/config.json | tr -d '"') fi -if [ -f /geth-accounts/accounts.csv ]; then - echo "Using L1 private key from the mounted volume" - # Read the private key of L1 account for sending txs from peer +if [ -n "$CERC_L1_ACCOUNTS_CSV_URL" ] && \ + l1_accounts_response=$(curl -L --write-out '%{http_code}' --silent --output /dev/null "$CERC_L1_ACCOUNTS_CSV_URL") && \ + [ "$l1_accounts_response" -eq 200 ]; +then + echo "Fetching L1 account credentials using provided URL" + mkdir -p /geth-accounts + wget -O /geth-accounts/accounts.csv "$CERC_L1_ACCOUNTS_CSV_URL" + + # Read the private key of an L1 account for sending txs from peer CERC_PRIVATE_KEY_PEER=$(awk -F, 'NR==2{print $NF}' /geth-accounts/accounts.csv) else - echo "Using CERC_PRIVATE_KEY_PEER from env" + echo "Couldn't fetch L1 account credentials, using CERC_PRIVATE_KEY_PEER from env" fi # Read in the config template TOML file and modify it diff --git a/app/data/container-build/cerc-mobymask/Dockerfile b/app/data/container-build/cerc-mobymask/Dockerfile index caa3e6b5..3bcebced 100644 --- a/app/data/container-build/cerc-mobymask/Dockerfile +++ b/app/data/container-build/cerc-mobymask/Dockerfile @@ -1,6 +1,6 @@ FROM node:16.17.1-alpine3.16 -RUN apk --update --no-cache add python3 alpine-sdk jq bash +RUN apk --update --no-cache add python3 alpine-sdk jq bash curl wget WORKDIR /app diff --git a/app/data/container-build/cerc-optimism-contracts/Dockerfile b/app/data/container-build/cerc-optimism-contracts/Dockerfile index cdc98b08..ed9c4b22 100644 --- a/app/data/container-build/cerc-optimism-contracts/Dockerfile +++ b/app/data/container-build/cerc-optimism-contracts/Dockerfile @@ -2,7 +2,7 @@ FROM cerc/foundry:local # Install node (local foundry is a debian based image) RUN apt-get update \ - && apt-get install -y curl \ + && apt-get install -y curl wget \ && curl --silent --location https://deb.nodesource.com/setup_16.x | bash - \ && apt-get update \ && apt-get install -y nodejs git busybox jq \ diff --git a/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile b/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile index 9d1a70b7..c572658d 100644 --- a/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile +++ b/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile @@ -1,7 +1,7 @@ FROM ubuntu:22.04 RUN apt-get update \ - && apt-get install -y curl gnupg build-essential \ + && apt-get install -y curl wget gnupg build-essential \ && curl --silent --location https://deb.nodesource.com/setup_18.x | bash - \ && apt-get update \ && apt-get install -y nodejs git busybox jq \ diff --git a/app/data/stacks/fixturenet-eth/README.md b/app/data/stacks/fixturenet-eth/README.md index 86404af0..c54237aa 100644 --- a/app/data/stacks/fixturenet-eth/README.md +++ b/app/data/stacks/fixturenet-eth/README.md @@ -117,8 +117,8 @@ Clear volumes created by this stack: ```bash # List all relevant volumes -$ docker volume ls -q --filter "name=.*fixturenet_eth_bootnode_geth_data|.*fixturenet_eth_bootnode_lighthouse_data|.*fixturenet_eth_geth_1_data|.*fixturenet_eth_geth_2_data|.*fixturenet_eth_lighthouse_1_data|.*fixturenet_eth_lighthouse_2_data|.*fixturenet_geth_accounts" +$ docker volume ls -q --filter "name=.*fixturenet_eth_bootnode_geth_data|.*fixturenet_eth_bootnode_lighthouse_data|.*fixturenet_eth_geth_1_data|.*fixturenet_eth_geth_2_data|.*fixturenet_eth_lighthouse_1_data|.*fixturenet_eth_lighthouse_2_data" # Remove all the listed volumes -$ docker volume rm $(docker volume ls -q --filter "name=.*fixturenet_eth_bootnode_geth_data|.*fixturenet_eth_bootnode_lighthouse_data|.*fixturenet_eth_geth_1_data|.*fixturenet_eth_geth_2_data|.*fixturenet_eth_lighthouse_1_data|.*fixturenet_eth_lighthouse_2_data|.*fixturenet_geth_accounts") +$ docker volume rm $(docker volume ls -q --filter "name=.*fixturenet_eth_bootnode_geth_data|.*fixturenet_eth_bootnode_lighthouse_data|.*fixturenet_eth_geth_1_data|.*fixturenet_eth_geth_2_data|.*fixturenet_eth_lighthouse_1_data|.*fixturenet_eth_lighthouse_2_data") ``` diff --git a/app/data/stacks/fixturenet-optimism/README.md b/app/data/stacks/fixturenet-optimism/README.md index 5099cdd3..345e9a8d 100644 --- a/app/data/stacks/fixturenet-optimism/README.md +++ b/app/data/stacks/fixturenet-optimism/README.md @@ -76,10 +76,10 @@ Clear volumes created by this stack: ```bash # List all relevant volumes -docker volume ls -q --filter "name=.*fixturenet_geth_accounts|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data" +docker volume ls -q --filter "name=.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data" # Remove all the listed volumes -docker volume rm $(docker volume ls -q --filter "name=.*fixturenet_geth_accounts|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data") +docker volume rm $(docker volume ls -q --filter "name=.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data") ``` ## Troubleshooting diff --git a/app/data/stacks/fixturenet-optimism/l2-only.md b/app/data/stacks/fixturenet-optimism/l2-only.md index 821d16a8..957627d3 100644 --- a/app/data/stacks/fixturenet-optimism/l2-only.md +++ b/app/data/stacks/fixturenet-optimism/l2-only.md @@ -46,8 +46,13 @@ Create and update an env file to be used in the next step ([defaults](../../conf CERC_L1_HOST= CERC_L1_PORT= - # Credentials for accounts on L1 to send balance to Optimism Proxy contract from + # URL to get CSV with credentials for accounts on L1 + # that are used to send balance to Optimism Proxy contract # (enables them to do transactions on L2) + CERC_L1_ACCOUNTS_CSV_URL= + + # OR + # Specify the required account credentials CERC_L1_ADDRESS= CERC_L1_PRIV_KEY= CERC_L1_ADDRESS_2= @@ -91,10 +96,10 @@ Clear volumes created by this stack: ```bash # List all relevant volumes -docker volume ls -q --filter "name=.*fixturenet_geth_accounts|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data" +docker volume ls -q --filter "name=.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data" # Remove all the listed volumes -docker volume rm $(docker volume ls -q --filter "name=.*fixturenet_geth_accounts|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data") +docker volume rm $(docker volume ls -q --filter "name=.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data") ``` ## Troubleshooting diff --git a/app/data/stacks/mobymask-v2/README.md b/app/data/stacks/mobymask-v2/README.md index fb4aebcd..25b8f3ea 100644 --- a/app/data/stacks/mobymask-v2/README.md +++ b/app/data/stacks/mobymask-v2/README.md @@ -114,8 +114,8 @@ Clear volumes created by this stack: ```bash # List all relevant volumes -docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*peers_ids|.*mobymask_deployment|.*fixturenet_geth_accounts|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data" +docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*peers_ids|.*mobymask_deployment|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data" # Remove all the listed volumes -docker volume rm $(docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*peers_ids|.*mobymask_deployment|.*fixturenet_geth_accounts|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data") +docker volume rm $(docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*peers_ids|.*mobymask_deployment|.*l1_deployment|.*l2_accounts|.*l2_config|.*l2_geth_data") ``` diff --git a/app/data/stacks/mobymask-v2/mobymask-only.md b/app/data/stacks/mobymask-v2/mobymask-only.md index f4d25702..5ae5dbaa 100644 --- a/app/data/stacks/mobymask-v2/mobymask-only.md +++ b/app/data/stacks/mobymask-v2/mobymask-only.md @@ -49,7 +49,11 @@ Create and update an env file to be used in the next step ([defaults](../../conf CERC_L2_NODE_HOST= CERC_L2_NODE_PORT= - # Credentials for accounts to perform txs on L2 + # URL to get CSV with credentials for accounts on L1 to perform txs on L2 + CERC_L1_ACCOUNTS_CSV_URL= + + # OR + # Specify the required account credentials CERC_PRIVATE_KEY_DEPLOYER= CERC_PRIVATE_KEY_PEER= @@ -118,8 +122,8 @@ Clear volumes created by this stack: ```bash # List all relevant volumes -docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*peers_ids|.*mobymask_deployment|.*fixturenet_geth_accounts" +docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*peers_ids|.*mobymask_deployment" # Remove all the listed volumes -docker volume rm $(docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*peers_ids|.*mobymask_deployment|.*fixturenet_geth_accounts") +docker volume rm $(docker volume ls -q --filter "name=.*mobymask_watcher_db_data|.*peers_ids|.*mobymask_deployment") ``` From d6f829ee65ebb3578fddc72f71f572913742cdde Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Thu, 20 Apr 2023 15:30:19 +0530 Subject: [PATCH 0444/1010] Add instructions to join MobyMask watcher p2p network (#346) * Refactor L2 enpoint check to contract deployment script * Add instructions to join to an existing watcher network * Include mobymask-v2-watcher-ts in repositories setup * Add a clean up section and expected outputs * Add a troubleshooting section * Use lxdao frontend * Update instructions for updated UI Former-commit-id: f78176a27fe7b180e5d4197e8b29dbaed323874e --- .../docker-compose-watcher-mobymask-v2.yml | 13 +- .../deploy-and-generate-invite.sh | 22 +- .../watcher-mobymask-v2/optimism-params.env | 2 + app/data/stacks/mobymask-v2/README.md | 4 + app/data/stacks/mobymask-v2/demo.md | 2 +- app/data/stacks/mobymask-v2/mobymask-only.md | 12 +- .../stacks/mobymask-v2/watcher-p2p-network.md | 306 ++++++++++++++++++ 7 files changed, 342 insertions(+), 19 deletions(-) create mode 100644 app/data/stacks/mobymask-v2/watcher-p2p-network.md diff --git a/app/data/compose/docker-compose-watcher-mobymask-v2.yml b/app/data/compose/docker-compose-watcher-mobymask-v2.yml index 58015fe1..36c5f3f9 100644 --- a/app/data/compose/docker-compose-watcher-mobymask-v2.yml +++ b/app/data/compose/docker-compose-watcher-mobymask-v2.yml @@ -38,14 +38,11 @@ services: CERC_PRIVATE_KEY_DEPLOYER: ${CERC_PRIVATE_KEY_DEPLOYER} CERC_MOBYMASK_APP_BASE_URI: ${CERC_MOBYMASK_APP_BASE_URI} CERC_DEPLOYED_CONTRACT: ${CERC_DEPLOYED_CONTRACT} - # Waits for L2 Optimism Geth and Node servers to be up before deploying contract - command: - - sh - - -c - - | - ./wait-for-it.sh -h ${CERC_L2_GETH_HOST:-$${DEFAULT_CERC_L2_GETH_HOST}} -p ${CERC_L2_GETH_PORT:-$${DEFAULT_CERC_L2_GETH_PORT}} -s -t 0 && \ - ./wait-for-it.sh -h ${CERC_L2_NODE_HOST:-$${DEFAULT_CERC_L2_NODE_HOST}} -p ${CERC_L2_NODE_PORT:-$${DEFAULT_CERC_L2_NODE_PORT}} -s -t 0 && \ - ./deploy-and-generate-invite.sh + CERC_L2_GETH_HOST: ${CERC_L2_GETH_HOST} + CERC_L2_GETH_PORT: ${CERC_L2_GETH_PORT} + CERC_L2_NODE_HOST: ${CERC_L2_NODE_HOST} + CERC_L2_NODE_PORT: ${CERC_L2_NODE_PORT} + command: ["sh", "deploy-and-generate-invite.sh"] volumes: - ../config/wait-for-it.sh:/app/packages/server/wait-for-it.sh - ../config/watcher-mobymask-v2/secrets-template.json:/app/packages/server/secrets-template.json diff --git a/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh b/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh index 30dab354..c7fc1c70 100755 --- a/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh +++ b/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh @@ -10,6 +10,13 @@ CERC_L1_ACCOUNTS_CSV_URL="${CERC_L1_ACCOUNTS_CSV_URL:-${DEFAULT_CERC_L1_ACCOUNTS CERC_MOBYMASK_APP_BASE_URI="${CERC_MOBYMASK_APP_BASE_URI:-${DEFAULT_CERC_MOBYMASK_APP_BASE_URI}}" CERC_DEPLOYED_CONTRACT="${CERC_DEPLOYED_CONTRACT:-${DEFAULT_CERC_DEPLOYED_CONTRACT}}" +# Check if CERC_DEPLOYED_CONTRACT environment variable set to skip contract deployment +if [ -n "$CERC_DEPLOYED_CONTRACT" ]; then + echo "CERC_DEPLOYED_CONTRACT is set to '$CERC_DEPLOYED_CONTRACT'" + echo "Skipping contract deployment" + exit 0 +fi + echo "Using L2 RPC endpoint ${CERC_L2_GETH_RPC}" if [ -n "$CERC_L1_ACCOUNTS_CSV_URL" ] && \ @@ -35,14 +42,15 @@ jq --arg rpcUrl "$CERC_L2_GETH_RPC" '.rpcUrl = $rpcUrl' secrets.json > secrets_u # Set the MobyMask app base URI jq --arg baseURI "$CERC_MOBYMASK_APP_BASE_URI" '.baseURI = $baseURI' secrets.json > secrets_updated.json && mv secrets_updated.json secrets.json -export RPC_URL="${CERC_L2_GETH_RPC}" +# Wait for L2 Optimism Geth and Node servers to be up before deploying contract +CERC_L2_GETH_HOST="${CERC_L2_GETH_HOST:-${DEFAULT_CERC_L2_GETH_HOST}}" +CERC_L2_GETH_PORT="${CERC_L2_GETH_PORT:-${DEFAULT_CERC_L2_GETH_PORT}}" +CERC_L2_NODE_HOST="${CERC_L2_NODE_HOST:-${DEFAULT_CERC_L2_NODE_HOST}}" +CERC_L2_NODE_PORT="${CERC_L2_NODE_PORT:-${DEFAULT_CERC_L2_NODE_PORT}}" +./wait-for-it.sh -h "${CERC_L2_GETH_HOST}" -p "${CERC_L2_GETH_PORT}" -s -t 0 +./wait-for-it.sh -h "${CERC_L2_GETH_PORT}" -p "${CERC_L2_NODE_PORT}" -s -t 0 -# Check if CERC_DEPLOYED_CONTRACT environment variable set to skip contract deployment -if [ -n "$CERC_DEPLOYED_CONTRACT" ]; then - echo "CERC_DEPLOYED_CONTRACT is set to '$CERC_DEPLOYED_CONTRACT'" - echo "Exiting without deploying contract" - exit 0 -fi +export RPC_URL="${CERC_L2_GETH_RPC}" # Check and exit if a deployment already exists (on restarts) if [ -f ./config.json ]; then diff --git a/app/data/config/watcher-mobymask-v2/optimism-params.env b/app/data/config/watcher-mobymask-v2/optimism-params.env index 67eb3314..e0d2cd75 100644 --- a/app/data/config/watcher-mobymask-v2/optimism-params.env +++ b/app/data/config/watcher-mobymask-v2/optimism-params.env @@ -2,6 +2,8 @@ # L2 endpoints DEFAULT_CERC_L2_GETH_RPC="http://op-geth:8545" + +# Endpoints waited on before contract deployment DEFAULT_CERC_L2_GETH_HOST="op-geth" DEFAULT_CERC_L2_GETH_PORT=8545 diff --git a/app/data/stacks/mobymask-v2/README.md b/app/data/stacks/mobymask-v2/README.md index 25b8f3ea..ff67b55c 100644 --- a/app/data/stacks/mobymask-v2/README.md +++ b/app/data/stacks/mobymask-v2/README.md @@ -25,6 +25,10 @@ Checkout to the required versions and branches in repos cd ~/cerc/watcher-ts git checkout v0.2.39 +# mobymask-v2-watcher-ts +cd ~/cerc/mobymask-v2-watcher-ts +git checkout v0.1.0 + # MobyMask cd ~/cerc/MobyMask git checkout v0.1.2 diff --git a/app/data/stacks/mobymask-v2/demo.md b/app/data/stacks/mobymask-v2/demo.md index 953390cf..1e1d6f01 100644 --- a/app/data/stacks/mobymask-v2/demo.md +++ b/app/data/stacks/mobymask-v2/demo.md @@ -25,7 +25,7 @@ * Open the invite link in a new browser with different profile (to simulate remote browser) * Check that it is connected to any other peer in the network. -* In `Report a phishing attempt` section, report multiple phishers using the `submit` button. Click on the `Submit batch to p2p network` button. This broadcasts signed invocations to the connected peers. +* In `Report a phishing attempt` section, report multiple phishers using the `Submit` button. Click on the `Submit batch to p2p network` button. This broadcasts signed invocations to the connected peers. * In the `MESSAGES` tab of other browsers, a message can be seen with the signed invocations. diff --git a/app/data/stacks/mobymask-v2/mobymask-only.md b/app/data/stacks/mobymask-v2/mobymask-only.md index 5ae5dbaa..4cfb4ecf 100644 --- a/app/data/stacks/mobymask-v2/mobymask-only.md +++ b/app/data/stacks/mobymask-v2/mobymask-only.md @@ -9,7 +9,7 @@ Prerequisite: L2 Optimism Geth and Node RPC endpoints Clone required repositories: ```bash -laconic-so --stack mobymask-v2 setup-repositories --include cerc-io/MobyMask,cerc-io/watcher-ts +laconic-so --stack mobymask-v2 setup-repositories --include cerc-io/MobyMask,cerc-io/watcher-ts,cerc-io/mobymask-v2-watcher-ts # If this throws an error as a result of being already checked out to a branch/tag in a repo, remove the repositories mentioned below and re-run the command ``` @@ -19,7 +19,11 @@ Checkout to the required versions and branches in repos: ```bash # watcher-ts cd ~/cerc/watcher-ts -git checkout v0.2.35 +git checkout v0.2.39 + +# mobymask-v2-watcher-ts +cd ~/cerc/mobymask-v2-watcher-ts +git checkout v0.1.0 # MobyMask cd ~/cerc/MobyMask @@ -29,7 +33,7 @@ git checkout v0.1.2 Build the container images: ```bash -laconic-so --stack mobymask-v2 build-containers --include cerc/watcher-mobymask-v2,cerc/mobymask +laconic-so --stack mobymask-v2 build-containers --include cerc/watcher-ts,cerc/watcher-mobymask-v2,cerc/mobymask ``` This should create the required docker images in the local image registry @@ -43,6 +47,8 @@ Create and update an env file to be used in the next step ([defaults](../../conf ```bash # External L2 endpoints CERC_L2_GETH_RPC= + + # Endpoints waited on before contract deployment CERC_L2_GETH_HOST= CERC_L2_GETH_PORT= diff --git a/app/data/stacks/mobymask-v2/watcher-p2p-network.md b/app/data/stacks/mobymask-v2/watcher-p2p-network.md new file mode 100644 index 00000000..563012e8 --- /dev/null +++ b/app/data/stacks/mobymask-v2/watcher-p2p-network.md @@ -0,0 +1,306 @@ +# MobyMask Watcher P2P Network + +Instructions to setup and deploy a watcher that connects to the existing watcher p2p network + +## Prerequisites + +* Laconic Stack Orchestrator ([installation](/README.md#install)) +* A publicly reachable domain name with SSL setup + +This demo has been tested on a `Ubuntu 22.04 LTS` machine with `8GB` of RAM + +## Setup + +Clone required repositories: + + ```bash + laconic-so --stack mobymask-v2 setup-repositories --include cerc-io/MobyMask,cerc-io/watcher-ts,cerc-io/mobymask-v2-watcher-ts + + # This will clone the required repositories at ~/cerc + # If this throws an error as a result of being already checked out to a branch/tag in a repo, remove the repositories mentioned in the next step and re-run the command + + # Expected output: + + # Dev Root is: /home/xyz/cerc + # Checking: /home/xyz/cerc/watcher-ts: Needs to be fetched + # 100%|#############################################################################################################################################| 9.96k/9.96k [00:05<00:00, 1.70kB/s] + # Checking: /home/xyz/cerc/mobymask-v2-watcher-ts: Needs to be fetched + # 100%|################################################################################################################################################| 19.0/19.0 [00:01<00:00, 13.6B/s] + # Checking: /home/xyz/cerc/MobyMask: Needs to be fetched + # 100%|##############################################################################################################################################| 1.41k/1.41k [00:18<00:00, 76.4B/s] + ``` + +Checkout to the required versions and branches in repos: + + ```bash + # watcher-ts + cd ~/cerc/watcher-ts + git checkout v0.2.39 + + # mobymask-v2-watcher-ts + cd ~/cerc/mobymask-v2-watcher-ts + git checkout v0.1.0 + + # MobyMask + cd ~/cerc/MobyMask + git checkout v0.1.2 + ``` + +Build the container images: + + ```bash + laconic-so --stack mobymask-v2 build-containers --include cerc/watcher-ts,cerc/watcher-mobymask-v2,cerc/mobymask + ``` + +Check that the required images are created in the local image registry: + + ```bash + docker image ls + + # Expected output: + + # REPOSITORY TAG IMAGE ID CREATED SIZE + # cerc/watcher-mobymask-v2 local c4dba5dc8d48 24 seconds ago 1.02GB + # cerc/watcher-ts local 9ef61478c243 9 minutes ago 1.84GB + # cerc/mobymask local 9db3f1a69966 2 weeks ago 3.82GB + # . + # . + ``` + +## Deploy + +### Configuration + +Create an env file `mobymask-watcher.env`: + + ```bash + touch mobymask-watcher.env + ``` + +Add the following contents to `mobymask-watcher.env`: + + ```bash + # Domain to be used in the relay node's announce address + CERC_RELAY_ANNOUNCE_DOMAIN="example.com" + + + # DO NOT CHANGE THESE VALUES + CERC_DEPLOYED_CONTRACT="0x2B6AFbd4F479cE4101Df722cF4E05F941523EaD9" + CERC_ENABLE_PEER_L2_TXS=false + CERC_RELAY_PEERS=["/dns4/relay1.dev.vdb.to/tcp/443/wss/p2p/12D3KooWAx83SM9GWVPc9v9fNzLzftRX6EaAFMjhYiFxRYqctcW1", "/dns4/relay2.dev.vdb.to/tcp/443/wss/p2p/12D3KooWBycy6vHVEfUwwYRbPLBdb5gx9gtFSEMpErYPUjUkDNkm", "/dns4/relay3.dev.vdb.to/tcp/443/wss/p2p/12D3KooWARcUJsiGCgiygiRVVK94U8BNSy8DFBbzAF3B6orrabwn"] + ``` + +Replace `CERC_RELAY_ANNOUNCE_DOMAIN` with your public domain name + +### Deploy the stack + +```bash +laconic-so --stack mobymask-v2 deploy --cluster mobymask_v2 --include watcher-mobymask-v2 --env-file mobymask-watcher.env up + +# Expected output (ignore the "The X variable is not set. Defaulting to a blank string." warnings): + +# [+] Running 10/10 +# ✔ Network mobymask_v2_default Created 0.1s +# ✔ Volume "mobymask_v2_fixturenet_geth_accounts" Created 0.0s +# ✔ Volume "mobymask_v2_peers_ids" Created 0.0s +# ✔ Volume "mobymask_v2_mobymask_watcher_db_data" Created 0.0s +# ✔ Volume "mobymask_v2_mobymask_deployment" Created 0.0s +# ✔ Container mobymask_v2-mobymask-watcher-db-1 Healthy 22.2s +# ✔ Container mobymask_v2-mobymask-1 Exited 2.2s +# ✔ Container mobymask_v2-peer-ids-gen-1 Exited 23.9s +# ✔ Container mobymask_v2-mobymask-watcher-server-1 Healthy 43.6s +# ✔ Container mobymask_v2-peer-tests-1 Started 44.5s +``` + +This will run the `mobymask-v2-watcher` including: +* A relay node which is in a federated setup with relay nodes set in the env file +* A peer node which connects to the watcher relay node as an entrypoint to the MobyMask watcher p2p network. This peer listens for messages from other peers on the network and logs them out to the console + +The watcher endpoint is exposed on host port `3001` and the relay node endpoint is exposed on host port `9090` + +To list down and monitor the running containers: + + ```bash + laconic-so --stack mobymask-v2 deploy --cluster mobymask_v2 --include watcher-mobymask-v2 ps + + # Expected output: + + # Running containers: + # id: 25cc3a1cbda27fcd9c2ad4c772bd753ccef1e178f901a70e6ff4191d4a8684e9, name: mobymask_v2-mobymask-watcher-db-1, ports: 0.0.0.0:15432->5432/tcp + # id: c9806f78680d68292ffe942222af2003aa3ed5d5c69d7121b573f5028444391d, name: mobymask_v2-mobymask-watcher-server-1, ports: 0.0.0.0:3001->3001/tcp, 0.0.0.0:9001->9001/tcp, 0.0.0.0:9090->9090/tcp + # id: 6b30a1d313a88fb86f8a3b37a1b1a3bc053f238664e4b2d196c3ec74e04faf13, name: mobymask_v2-peer-tests-1, ports: + + + # With status + docker ps + + # Expected output: + + # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + # 6b30a1d313a8 cerc/watcher-ts:local "docker-entrypoint.s…" 5 minutes ago Up 4 minutes mobymask_v2-peer-tests-1 + # c9806f78680d cerc/watcher-mobymask-v2:local "sh start-server.sh" 5 minutes ago Up 5 minutes (healthy) 0.0.0.0:3001->3001/tcp, 0.0.0.0:9001->9001/tcp, 0.0.0.0:9090->9090/tcp mobymask_v2-mobymask-watcher-server-1 + # 25cc3a1cbda2 postgres:14-alpine "docker-entrypoint.s…" 5 minutes ago Up 5 minutes (healthy) 0.0.0.0:15432->5432/tcp mobymask_v2-mobymask-watcher-db-1 + + + # Check logs for a container + docker logs -f + ``` + +Check watcher container logs to get multiaddr advertised by the watcher's relay node and note it down for further usage: + + ```bash + laconic-so --stack mobymask-v2 deploy --cluster mobymask_v2 --include watcher-mobymask-v2 logs mobymask-watcher-server | grep -A 2 "Relay node started" + + # The multiaddr will be of form /dns4//tcp/443/wss/p2p/ + # Expected output: + + # mobymask_v2-mobymask-watcher-server-1 | 2023-04-20T04:22:57.069Z laconic:relay Relay node started with id 12D3KooWKef84LAcBNb9wZNs6jC5kQFXjddo47hK6AGHD2dSvGai (characteristic-black-pamella) + # mobymask_v2-mobymask-watcher-server-1 | 2023-04-20T04:22:57.069Z laconic:relay Listening on: + # mobymask_v2-mobymask-watcher-server-1 | 2023-04-20T04:22:57.070Z laconic:relay /dns4/example.com/tcp/443/wss/p2p/12D3KooWKef84LAcBNb9wZNs6jC5kQFXjddo47hK6AGHD2dSvGai + ``` + +## Web App + +To be able to connect to the relay node from remote peers, it needs to be publicly reachable. Configure your website with SSL and the `https` traffic forwarded to port `9090`. + +For example, a Nginx configuration for domain `example.com` would look something like: + + ```bash + server { + server_name example.com; + + # https://nginx.org/en/docs/http/websocket.html + location / { + proxy_pass http://127.0.0.1:9090; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + + # set a large timeout to avoid websocket disconnects + proxy_read_timeout 86400; + } + + listen [::]:443 ssl ipv6only=on; # managed by Certbot + listen 443 ssl; # managed by Certbot + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot + include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot + } + + server { + if ($host = example.com) { + return 301 https://$host$request_uri; + } # managed by Certbot + + listen 80; + listen [::]:80; + + server_name example.com; + return 404; # managed by Certbot + } + ``` + +To connect a browser peer to the watcher's relay node: +* Visit https://mobymask-lxdao-app.dev.vdb.to/ +* Click on debug panel on bottom right of the homepage +* Select `` in `Primary Relay` dropdown on the right and enter the watcher relay node's multiaddr +* Click on `UPDATE` to refresh the page and connect to the watcher's relay node; you should see the relay node's multiaddr in `Self Node Info` on the debug panel +* Switch to the `GRAPH (PEERS)` tab to see peers connected to this browser node and the `GRAPH (NETWORK)` tab to see the whole MobyMask p2p network + +Perform transactions (invite required): +* Open the invite link in a browser and open the debug panel +* Confirm that the browser peer is connected to at least one other peer, then close the debug panel +* Check the status for a phisher to be reported in the `Check Phisher Status` section on homepage +* Select `Report Phisher` option in the `Pending reports` section, enter multiple phisher records and click on the `Submit batch to p2p network` button; this broadcasts signed invocations to peers on the network, including the watcher peer +* Check the watcher container logs to see the message received: + ```bash + docker logs $(docker ps -aq --filter name="mobymask-watcher-server") + + # Expected output: + + # . + # . + # 2023-04-20T04:42:01.072Z vulcanize:libp2p-utils [4:42:1] Received a message on mobymask P2P network from peer: 12D3KooWDKCke8hrjm4evwc9HzUzPZXeVTEQqmfLCkdNaXQ7efAZ + # 2023-04-20T04:42:01.072Z vulcanize:libp2p-utils Signed invocations: + # 2023-04-20T04:42:01.073Z vulcanize:libp2p-utils [ + # { + # "signature": "0x18dc2f4092473cbcc4636eb922f6abf17675368363675779e67d2c14bb0a135f6029da12671a3367463d41720938c84bb3ceed727721c3bbc50d8739859412801c", + # "invocations": { + # "batch": [ + # { + # "transaction": { + # "to": "0x2B6AFbd4F479cE4101Df722cF4E05F941523EaD9", + # "data": "0x6b6dc9de00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000c5457543a70686973686572310000000000000000000000000000000000000000", + # "gasLimit": 500000 + # }, + # "authority": [ + # { + # "signature": "0x0f91c765faaf851550ddd4345d1bc11eebbf29fde0306a8051f9d3c679c6d6856f66753cad8fcff25203a3e0528b3d7673371343f66a39424f6281c474eada431c", + # "delegation": { + # "delegate": "0x1B85a1485582C3389F62EB9F2C88f0C89bb1C1F4", + # "authority": "0x0000000000000000000000000000000000000000000000000000000000000000", + # "caveats": [ + # { + # "enforcer": "0x2B6AFbd4F479cE4101Df722cF4E05F941523EaD9", + # "terms": "0x0000000000000000000000000000000000000000000000000000000000000000" + # } + # ] + # } + # } + # ] + # } + # ], + # "replayProtection": { + # "nonce": 1, + # "queue": 64298938 + # } + # } + # } + # ] + # 2023-04-20T04:42:01.087Z vulcanize:libp2p-utils method: claimIfPhisher, value: TWT:phisher1 + # 2023-04-20T04:42:01.087Z vulcanize:libp2p-utils ------------------------------------------ + # . + # . + ``` +* Now, check the status for reported phishers again and confirm that they have been registered + +## Clean up + +Stop all services running in the background: + + ```bash + laconic-so --stack mobymask-v2 deploy --cluster mobymask_v2 --include watcher-mobymask-v2 down + + # Expected output: + + # [+] Running 6/6 + # ✔ Container mobymask_v2-peer-tests-1 Removed 10.5s + # ✔ Container mobymask_v2-mobymask-watcher-server-1 Removed 10.8s + # ✔ Container mobymask_v2-peer-ids-gen-1 Removed 0.0s + # ✔ Container mobymask_v2-mobymask-1 Removed 0.0s + # ✔ Container mobymask_v2-mobymask-watcher-db-1 Removed 0.6s + # ✔ Network mobymask_v2_default Removed 0.5s + ``` + +Clear volumes created by this stack: + + ```bash + # List all relevant volumes + docker volume ls -q --filter "name=mobymask_v2*" + + # Expected output: + + # mobymask_v2_fixturenet_geth_accounts + # mobymask_v2_mobymask_deployment + # mobymask_v2_mobymask_watcher_db_data + # mobymask_v2_peers_ids + + + # Remove all the listed volumes + docker volume rm $(docker volume ls -q --filter "name=mobymask_v2*") + ``` + +## Troubleshooting + +* If you don't see any peer connections being formed in the debug panel on https://mobymask-lxdao-app.dev.vdb.to/, try clearing out the website's local storage and refreshing the page From d2dfcc813f08b01b50c950c06e734a4d2f0d23e4 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 20 Apr 2023 16:21:26 -0600 Subject: [PATCH 0445/1010] Enable in-container docker Former-commit-id: 074a3fe20eae5aab40c59a4c379d348efe38fdef --- .gitea/workflows/test.yml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml index 96cfb8cd..beaf71d1 100644 --- a/.gitea/workflows/test.yml +++ b/.gitea/workflows/test.yml @@ -1,10 +1,16 @@ -name: Test +name: Integration Test on: pull_request: branches: '*' push: - branches: 'main' + branches: + - main + - ci-test + +# Needed until we can incorporate docker startup into the executor container +env: + DOCKER_HOST: unix:///var/run/dind.sock jobs: test: @@ -25,5 +31,9 @@ jobs: run: ./scripts/create_build_tag_file.sh - name: "Build local shiv package" run: ./scripts/build_shiv_package.sh + - name: Start dockerd # Also needed until we can incorporate into the executor + run: | + dockerd -H $DOCKER_HOST --userland-proxy=false & + sleep 5 - name: "Run smoke tests" run: ./tests/smoke-test/run-smoke-test.sh From f87f3d4765ae43460764f9a542e567c59a7e8c4c Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 20 Apr 2023 16:26:19 -0600 Subject: [PATCH 0446/1010] Stop on error Former-commit-id: 7c6b2543af53cbf0cb79af1d9aadc262a4052e80 --- tests/smoke-test/run-smoke-test.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/smoke-test/run-smoke-test.sh b/tests/smoke-test/run-smoke-test.sh index 777c608e..5bd82ffc 100755 --- a/tests/smoke-test/run-smoke-test.sh +++ b/tests/smoke-test/run-smoke-test.sh @@ -1,3 +1,8 @@ +#!/usr/bin/env bash +set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi # Basic simple test of stack-orchestrator functionality echo "Running stack-orchestrator smoke test" # Bit of a hack, test the most recent package From f5acbd1db0f0b9ac5681a089a0615a4ef5c04fab Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 20 Apr 2023 16:47:40 -0600 Subject: [PATCH 0447/1010] Dump image list for debugging Former-commit-id: 0a08a7ecba982774b175fbf287716639f914040d --- tests/smoke-test/run-smoke-test.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/smoke-test/run-smoke-test.sh b/tests/smoke-test/run-smoke-test.sh index 5bd82ffc..d6226b29 100755 --- a/tests/smoke-test/run-smoke-test.sh +++ b/tests/smoke-test/run-smoke-test.sh @@ -24,6 +24,8 @@ $TEST_TARGET_SO --stack test setup-repositories $TEST_TARGET_SO --stack test build-containers # Build one example containers $TEST_TARGET_SO build-containers --include cerc/builder-js +echo "Images in the local registry:" +docker image ls # Deploy the test container $TEST_TARGET_SO --stack test deploy-system up # TODO: test that we can use the deployed container somehow From 2b8eccf1672725c6edf61dbd571e9f75a894550b Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 20 Apr 2023 16:58:13 -0600 Subject: [PATCH 0448/1010] Add more debugging Former-commit-id: e8ec090f1d76f5a2b829a26bb78fb43a45a3dba2 --- tests/smoke-test/run-smoke-test.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/smoke-test/run-smoke-test.sh b/tests/smoke-test/run-smoke-test.sh index d6226b29..0ee258ce 100755 --- a/tests/smoke-test/run-smoke-test.sh +++ b/tests/smoke-test/run-smoke-test.sh @@ -3,6 +3,9 @@ set -e if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi +# Dump environment variables for debugging +echo "Environment variables:" +env # Basic simple test of stack-orchestrator functionality echo "Running stack-orchestrator smoke test" # Bit of a hack, test the most recent package @@ -25,7 +28,7 @@ $TEST_TARGET_SO --stack test build-containers # Build one example containers $TEST_TARGET_SO build-containers --include cerc/builder-js echo "Images in the local registry:" -docker image ls +docker image ls -a # Deploy the test container $TEST_TARGET_SO --stack test deploy-system up # TODO: test that we can use the deployed container somehow From 4beb889e9f5ea09a67ee602de5ac224e1e55200f Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 20 Apr 2023 17:30:54 -0600 Subject: [PATCH 0449/1010] Add DOCKER_HOST inheriting from the caller, to build environment (#360) * Add DOCKER_HOST inheriting from the caller, to build environment * Fix for env var not set Former-commit-id: 9feff35f536a02b4c3986899c988aa620055ea50 --- app/build_containers.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/build_containers.py b/app/build_containers.py index 5e8495cb..6cd8f2b8 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -95,6 +95,9 @@ def command(ctx, include, exclude, force_rebuild, extra_build_args): container_build_env.update({"CERC_SCRIPT_DEBUG": "true"} if debug else {}) container_build_env.update({"CERC_FORCE_REBUILD": "true"} if force_rebuild else {}) container_build_env.update({"CERC_CONTAINER_EXTRA_BUILD_ARGS": extra_build_args} if extra_build_args else {}) + docker_host_env = os.getenv("DOCKER_HOST") + if docker_host_env: + container_build_env.update({"DOCKER_HOST": docker_host_env}) def process_container(container): if not quiet: From 7a1ec3f196749db24e54010c4791bd6d44aae8a0 Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Fri, 21 Apr 2023 17:27:53 +0530 Subject: [PATCH 0450/1010] Fix mobymask contract deployment script (#362) Former-commit-id: 0bc54b30e0512bcf5f261b379a88fca3c004c44f --- app/data/compose/docker-compose-fixturenet-optimism.yml | 6 +++--- .../watcher-mobymask-v2/deploy-and-generate-invite.sh | 2 +- .../container-build/cerc-watcher-mobymask-v2/Dockerfile | 2 +- app/data/stacks/mobymask-v2/watcher-p2p-network.md | 4 +--- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/data/compose/docker-compose-fixturenet-optimism.yml b/app/data/compose/docker-compose-fixturenet-optimism.yml index c651e5a7..02b0cbc3 100644 --- a/app/data/compose/docker-compose-fixturenet-optimism.yml +++ b/app/data/compose/docker-compose-fixturenet-optimism.yml @@ -31,7 +31,7 @@ services: - l2_accounts:/l2-accounts - l1_deployment:/app/packages/contracts-bedrock extra_hosts: - - "host.docker.internal:host-gateway" + - "host.docker.internal:host-gateway" # Generates the config files required for L2 (outputs to volume l2_config) op-node-l2-config-gen: @@ -50,7 +50,7 @@ services: - l2_config:/app command: ["sh", "/app/generate-l2-config.sh"] extra_hosts: - - "host.docker.internal:host-gateway" + - "host.docker.internal:host-gateway" # Initializes and runs the L2 execution client (outputs to volume l2_geth_data) op-geth: @@ -123,7 +123,7 @@ services: command: | "/wait-for-it.sh -h ${CERC_L1_HOST:-$${DEFAULT_CERC_L1_HOST}} -p ${CERC_L1_PORT:-$${DEFAULT_CERC_L1_PORT}} -s -t 60 -- /run-op-batcher.sh" extra_hosts: - - "host.docker.internal:host-gateway" + - "host.docker.internal:host-gateway" volumes: l1_deployment: diff --git a/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh b/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh index c7fc1c70..e574c56b 100755 --- a/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh +++ b/app/data/config/watcher-mobymask-v2/deploy-and-generate-invite.sh @@ -48,7 +48,7 @@ CERC_L2_GETH_PORT="${CERC_L2_GETH_PORT:-${DEFAULT_CERC_L2_GETH_PORT}}" CERC_L2_NODE_HOST="${CERC_L2_NODE_HOST:-${DEFAULT_CERC_L2_NODE_HOST}}" CERC_L2_NODE_PORT="${CERC_L2_NODE_PORT:-${DEFAULT_CERC_L2_NODE_PORT}}" ./wait-for-it.sh -h "${CERC_L2_GETH_HOST}" -p "${CERC_L2_GETH_PORT}" -s -t 0 -./wait-for-it.sh -h "${CERC_L2_GETH_PORT}" -p "${CERC_L2_NODE_PORT}" -s -t 0 +./wait-for-it.sh -h "${CERC_L2_NODE_HOST}" -p "${CERC_L2_NODE_PORT}" -s -t 0 export RPC_URL="${CERC_L2_GETH_RPC}" diff --git a/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile b/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile index c572658d..6c100091 100644 --- a/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile +++ b/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile @@ -14,7 +14,7 @@ WORKDIR /app COPY . . -RUN echo "Building watcher-ts" && \ +RUN echo "Building mobymask-v2-watcher-ts" && \ yarn && yarn build WORKDIR /app diff --git a/app/data/stacks/mobymask-v2/watcher-p2p-network.md b/app/data/stacks/mobymask-v2/watcher-p2p-network.md index 563012e8..5fbaf79e 100644 --- a/app/data/stacks/mobymask-v2/watcher-p2p-network.md +++ b/app/data/stacks/mobymask-v2/watcher-p2p-network.md @@ -99,9 +99,8 @@ laconic-so --stack mobymask-v2 deploy --cluster mobymask_v2 --include watcher-mo # Expected output (ignore the "The X variable is not set. Defaulting to a blank string." warnings): -# [+] Running 10/10 +# [+] Running 9/9 # ✔ Network mobymask_v2_default Created 0.1s -# ✔ Volume "mobymask_v2_fixturenet_geth_accounts" Created 0.0s # ✔ Volume "mobymask_v2_peers_ids" Created 0.0s # ✔ Volume "mobymask_v2_mobymask_watcher_db_data" Created 0.0s # ✔ Volume "mobymask_v2_mobymask_deployment" Created 0.0s @@ -291,7 +290,6 @@ Clear volumes created by this stack: # Expected output: - # mobymask_v2_fixturenet_geth_accounts # mobymask_v2_mobymask_deployment # mobymask_v2_mobymask_watcher_db_data # mobymask_v2_peers_ids From 10337e77f6bc6cc27bf7b24650ebc903e6f6a758 Mon Sep 17 00:00:00 2001 From: Nabarun Gogoi Date: Mon, 24 Apr 2023 17:55:17 +0530 Subject: [PATCH 0451/1010] Upgrade mobymkas-ui package version for endorse member UI (#365) Former-commit-id: d7ea87426885f85a78efbc67d310b9abde3f21b8 --- app/data/container-build/cerc-mobymask-ui/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/container-build/cerc-mobymask-ui/Dockerfile b/app/data/container-build/cerc-mobymask-ui/Dockerfile index e5a804b4..651d718f 100644 --- a/app/data/container-build/cerc-mobymask-ui/Dockerfile +++ b/app/data/container-build/cerc-mobymask-ui/Dockerfile @@ -52,7 +52,7 @@ RUN yarn global add http-server # Install old version of MobyMask web app RUN yarn global add @cerc-io/mobymask-ui@0.1.3 # Install the LXDAO version of MobyMask web app -RUN yarn global add @cerc-io/mobymask-ui-lxdao@npm:@cerc-io/mobymask-ui@0.1.3-lxdao-0.1.0 +RUN yarn global add @cerc-io/mobymask-ui-lxdao@npm:@cerc-io/mobymask-ui@0.1.3-lxdao-0.1.1 # Expose port for http EXPOSE 80 From 7f3a33564a703f8efb12f55300c01f2923857441 Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Tue, 25 Apr 2023 10:41:47 +0530 Subject: [PATCH 0452/1010] Upgrade Optimism and add op-proposer (#364) * Use the latest stable optimism release * Remove unnecessary repos from repo-list * Add op-proposer service to fixturenet-optimism stack * Add jq and bash to op-proposer image * Update instructions * Update op-batcher and op-geth commands Former-commit-id: 988be0ef9ab6c4f3b74431ca0bd31c41fa0584b0 --- .../docker-compose-fixturenet-optimism.yml | 23 ++++++++++++ .../optimism-contracts/run.sh | 16 ++++----- .../fixturenet-optimism/run-op-batcher.sh | 4 +-- .../config/fixturenet-optimism/run-op-geth.sh | 4 +-- .../config/fixturenet-optimism/run-op-node.sh | 3 +- .../fixturenet-optimism/run-op-proposer.sh | 36 +++++++++++++++++++ .../cerc-optimism-l2geth/build.sh | 3 ++ .../cerc-optimism-op-batcher/build.sh | 3 ++ .../cerc-optimism-op-node/build.sh | 3 ++ .../cerc-optimism-op-proposer/Dockerfile | 31 ++++++++++++++++ .../cerc-optimism-op-proposer/build.sh | 8 +++++ app/data/container-image-list.txt | 1 + app/data/pod-list.txt | 1 - app/data/repository-list.txt | 2 -- app/data/stacks/fixturenet-optimism/README.md | 5 +-- .../stacks/fixturenet-optimism/l2-only.md | 7 ++-- app/data/stacks/fixturenet-optimism/stack.yml | 1 + app/data/stacks/mobymask-v2/README.md | 2 +- 18 files changed, 131 insertions(+), 22 deletions(-) create mode 100755 app/data/config/fixturenet-optimism/run-op-proposer.sh create mode 100644 app/data/container-build/cerc-optimism-op-proposer/Dockerfile create mode 100755 app/data/container-build/cerc-optimism-op-proposer/build.sh diff --git a/app/data/compose/docker-compose-fixturenet-optimism.yml b/app/data/compose/docker-compose-fixturenet-optimism.yml index 02b0cbc3..c9e17b03 100644 --- a/app/data/compose/docker-compose-fixturenet-optimism.yml +++ b/app/data/compose/docker-compose-fixturenet-optimism.yml @@ -125,6 +125,29 @@ services: extra_hosts: - "host.docker.internal:host-gateway" + # Runs the proposer (periodically submits new state roots to L1) + op-proposer: + image: cerc/optimism-op-proposer:local + depends_on: + op-node: + condition: service_healthy + env_file: + - ../config/fixturenet-optimism/l1-params.env + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_L1_RPC: ${CERC_L1_RPC} + volumes: + - ../config/wait-for-it.sh:/wait-for-it.sh + - ../config/fixturenet-optimism/run-op-proposer.sh:/run-op-proposer.sh + - l1_deployment:/contracts-bedrock:ro + - l2_accounts:/l2-accounts:ro + entrypoint: ["sh", "-c"] + # Waits for L1 endpoint to be up before running the proposer + command: | + "/wait-for-it.sh -h ${CERC_L1_HOST:-$${DEFAULT_CERC_L1_HOST}} -p ${CERC_L1_PORT:-$${DEFAULT_CERC_L1_PORT}} -s -t 60 -- /run-op-proposer.sh" + extra_hosts: + - "host.docker.internal:host-gateway" + volumes: l1_deployment: l2_accounts: diff --git a/app/data/config/fixturenet-optimism/optimism-contracts/run.sh b/app/data/config/fixturenet-optimism/optimism-contracts/run.sh index eb55e1fd..d878c03f 100755 --- a/app/data/config/fixturenet-optimism/optimism-contracts/run.sh +++ b/app/data/config/fixturenet-optimism/optimism-contracts/run.sh @@ -76,6 +76,13 @@ else echo "Couldn't fetch L1 account credentials, using them from env" fi +# Send balances to the above L2 addresses +yarn hardhat send-balance --to "${ADMIN_ADDRESS}" --amount 2 --private-key "${CERC_L1_PRIV_KEY}" --network getting-started +yarn hardhat send-balance --to "${PROPOSER_ADDRESS}" --amount 5 --private-key "${CERC_L1_PRIV_KEY}" --network getting-started +yarn hardhat send-balance --to "${BATCHER_ADDRESS}" --amount 1000 --private-key "${CERC_L1_PRIV_KEY}" --network getting-started + +echo "Balances sent to L2 accounts" + # Select a finalized L1 block as the starting point for roll ups until FINALIZED_BLOCK=$(cast block finalized --rpc-url "$CERC_L1_RPC"); do echo "Waiting for a finalized L1 block to exist, retrying after 10s" @@ -88,13 +95,6 @@ L1_BLOCKTIMESTAMP=$(echo "$FINALIZED_BLOCK" | awk '/timestamp/{print $2}') echo "Selected L1 block ${L1_BLOCKNUMBER} as the starting block for roll ups" -# Send balances to the above L2 addresses -yarn hardhat send-balance --to "${ADMIN_ADDRESS}" --amount 2 --private-key "${CERC_L1_PRIV_KEY}" --network getting-started -yarn hardhat send-balance --to "${PROPOSER_ADDRESS}" --amount 5 --private-key "${CERC_L1_PRIV_KEY}" --network getting-started -yarn hardhat send-balance --to "${BATCHER_ADDRESS}" --amount 1000 --private-key "${CERC_L1_PRIV_KEY}" --network getting-started - -echo "Balances sent to L2 accounts" - # Update the deployment config sed -i 's/"l2OutputOracleStartingTimestamp": TIMESTAMP/"l2OutputOracleStartingTimestamp": '"$L1_BLOCKTIMESTAMP"'/g' deploy-config/getting-started.json jq --arg chainid "$CERC_L1_CHAIN_ID" '.l1ChainID = ($chainid | tonumber)' deploy-config/getting-started.json > tmp.json && mv tmp.json deploy-config/getting-started.json @@ -110,7 +110,7 @@ echo "PRIVATE_KEY_DEPLOYER=$ADMIN_PRIV_KEY" >> .env echo "Deploying the L1 smart contracts, this will take a while..." # Deploy the L1 smart contracts -yarn hardhat deploy --network getting-started +yarn hardhat deploy --network getting-started --tags l1 echo "Deployed the L1 smart contracts" diff --git a/app/data/config/fixturenet-optimism/run-op-batcher.sh b/app/data/config/fixturenet-optimism/run-op-batcher.sh index 4bee6036..18955545 100755 --- a/app/data/config/fixturenet-optimism/run-op-batcher.sh +++ b/app/data/config/fixturenet-optimism/run-op-batcher.sh @@ -6,7 +6,7 @@ fi CERC_L1_RPC="${CERC_L1_RPC:-${DEFAULT_CERC_L1_RPC}}" -# Get BACTHER_KEY from keys.json +# Get Batcher key from keys.json BATCHER_KEY=$(jq -r '.Batcher.privateKey' /l2-accounts/keys.json | tr -d '"') cleanup() { @@ -18,6 +18,7 @@ cleanup() { } trap 'cleanup' INT TERM +# Run op-batcher op-batcher \ --l2-eth-rpc=http://op-geth:8545 \ --rollup-rpc=http://op-node:8547 \ @@ -30,7 +31,6 @@ op-batcher \ --rpc.port=8548 \ --rpc.enable-admin \ --max-channel-duration=1 \ - --target-l1-tx-size-bytes=2048 \ --l1-eth-rpc=$CERC_L1_RPC \ --private-key=$BATCHER_KEY \ & diff --git a/app/data/config/fixturenet-optimism/run-op-geth.sh b/app/data/config/fixturenet-optimism/run-op-geth.sh index 48391d73..8b521f85 100755 --- a/app/data/config/fixturenet-optimism/run-op-geth.sh +++ b/app/data/config/fixturenet-optimism/run-op-geth.sh @@ -8,7 +8,7 @@ fi echo "Installing jq" apk update && apk add jq -# Get SEQUENCER key from keys.json +# Get Sequencer key from keys.json SEQUENCER_KEY=$(jq -r '.Sequencer.privateKey' /l2-accounts/keys.json | tr -d '"') # Initialize op-geth if datadir/geth not found @@ -70,7 +70,7 @@ geth \ --ws.origins="*" \ --ws.api=debug,eth,txpool,net,engine \ --syncmode=full \ - --gcmode=full \ + --gcmode=archive \ --nodiscover \ --maxpeers=0 \ --networkid=42069 \ diff --git a/app/data/config/fixturenet-optimism/run-op-node.sh b/app/data/config/fixturenet-optimism/run-op-node.sh index b7cc8680..516cf0a5 100755 --- a/app/data/config/fixturenet-optimism/run-op-node.sh +++ b/app/data/config/fixturenet-optimism/run-op-node.sh @@ -6,9 +6,10 @@ fi CERC_L1_RPC="${CERC_L1_RPC:-${DEFAULT_CERC_L1_RPC}}" -# Get SEQUENCER KEY from keys.json +# Get Sequencer key from keys.json SEQUENCER_KEY=$(jq -r '.Sequencer.privateKey' /l2-accounts/keys.json | tr -d '"') +# Run op-node op-node \ --l2=http://op-geth:8551 \ --l2.jwt-secret=/op-node-data/jwt.txt \ diff --git a/app/data/config/fixturenet-optimism/run-op-proposer.sh b/app/data/config/fixturenet-optimism/run-op-proposer.sh new file mode 100755 index 00000000..09746760 --- /dev/null +++ b/app/data/config/fixturenet-optimism/run-op-proposer.sh @@ -0,0 +1,36 @@ +#!/bin/sh +set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi + +CERC_L1_RPC="${CERC_L1_RPC:-${DEFAULT_CERC_L1_RPC}}" + +# Read the L2OutputOracle contract address from the deployment +L2OO_DEPLOYMENT=$(cat /contracts-bedrock/deployments/getting-started/L2OutputOracle.json) +L2OO_ADDR=$(echo "$L2OO_DEPLOYMENT" | jq -r '.address') + +# Get Proposer key from keys.json +PROPOSER_KEY=$(jq -r '.Proposer.privateKey' /l2-accounts/keys.json | tr -d '"') + +cleanup() { + echo "Signal received, cleaning up..." + kill ${proposer_pid} + + wait + echo "Done" +} +trap 'cleanup' INT TERM + +# Run op-proposer +op-proposer \ + --poll-interval 12s \ + --rpc.port 8560 \ + --rollup-rpc http://op-node:8547 \ + --l2oo-address $L2OO_ADDR \ + --private-key $PROPOSER_KEY \ + --l1-eth-rpc $CERC_L1_RPC \ + & + +proposer_pid=$! +wait $proposer_pid diff --git a/app/data/container-build/cerc-optimism-l2geth/build.sh b/app/data/container-build/cerc-optimism-l2geth/build.sh index 5e125703..86c84a74 100755 --- a/app/data/container-build/cerc-optimism-l2geth/build.sh +++ b/app/data/container-build/cerc-optimism-l2geth/build.sh @@ -1,4 +1,7 @@ #!/usr/bin/env bash + # Build cerc/optimism-l2geth + source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + docker build -t cerc/optimism-l2geth:local ${build_command_args} ${CERC_REPO_BASE_DIR}/op-geth diff --git a/app/data/container-build/cerc-optimism-op-batcher/build.sh b/app/data/container-build/cerc-optimism-op-batcher/build.sh index 08b209d0..a91c0063 100755 --- a/app/data/container-build/cerc-optimism-op-batcher/build.sh +++ b/app/data/container-build/cerc-optimism-op-batcher/build.sh @@ -1,6 +1,9 @@ #!/usr/bin/env bash + # Build cerc/optimism-op-batcher # TODO: use upstream Dockerfile once its buildx-specific content has been removed + source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) docker build -t cerc/optimism-op-batcher:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/optimism diff --git a/app/data/container-build/cerc-optimism-op-node/build.sh b/app/data/container-build/cerc-optimism-op-node/build.sh index 9c33529a..be68cbbd 100755 --- a/app/data/container-build/cerc-optimism-op-node/build.sh +++ b/app/data/container-build/cerc-optimism-op-node/build.sh @@ -1,6 +1,9 @@ #!/usr/bin/env bash + # Build cerc/optimism-op-node # TODO: use upstream Dockerfile once its buildx-specific content has been removed + source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) docker build -t cerc/optimism-op-node:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/optimism diff --git a/app/data/container-build/cerc-optimism-op-proposer/Dockerfile b/app/data/container-build/cerc-optimism-op-proposer/Dockerfile new file mode 100644 index 00000000..e91aa4bb --- /dev/null +++ b/app/data/container-build/cerc-optimism-op-proposer/Dockerfile @@ -0,0 +1,31 @@ +FROM golang:1.19.0-alpine3.15 as builder + +ARG VERSION=v0.0.0 + +RUN apk add --no-cache make gcc musl-dev linux-headers git jq bash + +# build op-proposer with the shared go.mod & go.sum files +COPY ./op-proposer /app/op-proposer +COPY ./op-bindings /app/op-bindings +COPY ./op-node /app/op-node +COPY ./op-service /app/op-service +COPY ./op-signer /app/op-signer +COPY ./go.mod /app/go.mod +COPY ./go.sum /app/go.sum +COPY ./.git /app/.git + +WORKDIR /app/op-proposer + +RUN go mod download + +ARG TARGETOS TARGETARCH + +RUN make op-proposer VERSION="$VERSION" GOOS=$TARGETOS GOARCH=$TARGETARCH + +FROM alpine:3.15 + +RUN apk add --no-cache jq bash + +COPY --from=builder /app/op-proposer/bin/op-proposer /usr/local/bin + +CMD ["op-proposer"] diff --git a/app/data/container-build/cerc-optimism-op-proposer/build.sh b/app/data/container-build/cerc-optimism-op-proposer/build.sh new file mode 100755 index 00000000..f3c975dc --- /dev/null +++ b/app/data/container-build/cerc-optimism-op-proposer/build.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +# Build cerc/optimism-op-proposer + +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +docker build -t cerc/optimism-op-proposer:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/optimism diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index 0635c4c8..0caea48a 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -35,3 +35,4 @@ cerc/act-runner-task-executor cerc/optimism-l2geth cerc/optimism-op-batcher cerc/optimism-op-node +cerc/optimism-op-proposer diff --git a/app/data/pod-list.txt b/app/data/pod-list.txt index ef42ad9e..f24c9ed0 100644 --- a/app/data/pod-list.txt +++ b/app/data/pod-list.txt @@ -10,7 +10,6 @@ laconicd fixturenet-laconicd fixturenet-eth fixturenet-eth-metrics -watcher-ts watcher-mobymask watcher-erc20 watcher-erc721 diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index bfb6085c..0d808d68 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -13,8 +13,6 @@ cerc-io/laconic-console cerc-io/mobymask-watcher cerc-io/watcher-ts cerc-io/mobymask-v2-watcher-ts -cerc-io/react-peer -cerc-io/mobymask-ui cerc-io/MobyMask vulcanize/uniswap-watcher-ts vulcanize/uniswap-v3-info diff --git a/app/data/stacks/fixturenet-optimism/README.md b/app/data/stacks/fixturenet-optimism/README.md index 345e9a8d..bbe41c6a 100644 --- a/app/data/stacks/fixturenet-optimism/README.md +++ b/app/data/stacks/fixturenet-optimism/README.md @@ -19,7 +19,7 @@ Checkout to the required versions and branches in repos: ```bash # Optimism cd ~/cerc/optimism -git checkout @eth-optimism/sdk@0.0.0-20230329025055 +git checkout v1.0.3 ``` Build the container images: @@ -36,8 +36,9 @@ This should create the required docker images in the local image registry: * `cerc/foundry` * `cerc/optimism-contracts` * `cerc/optimism-l2geth` -* `cerc/optimism-op-batcher` * `cerc/optimism-op-node` +* `cerc/optimism-op-batcher` +* `cerc/optimism-op-proposer` ## Deploy diff --git a/app/data/stacks/fixturenet-optimism/l2-only.md b/app/data/stacks/fixturenet-optimism/l2-only.md index 957627d3..72bf93cb 100644 --- a/app/data/stacks/fixturenet-optimism/l2-only.md +++ b/app/data/stacks/fixturenet-optimism/l2-only.md @@ -19,21 +19,22 @@ Checkout to the required versions and branches in repos: ```bash # Optimism cd ~/cerc/optimism -git checkout @eth-optimism/sdk@0.0.0-20230329025055 +git checkout v1.0.3 ``` Build the container images: ```bash -laconic-so --stack fixturenet-optimism build-containers --include cerc/foundry,cerc/optimism-contracts,cerc/optimism-op-node,cerc/optimism-l2geth,cerc/optimism-op-batcher +laconic-so --stack fixturenet-optimism build-containers --include cerc/foundry,cerc/optimism-contracts,cerc/optimism-op-node,cerc/optimism-l2geth,cerc/optimism-op-batcher,cerc/optimism-op-proposer ``` This should create the required docker images in the local image registry: * `cerc/foundry` * `cerc/optimism-contracts` * `cerc/optimism-l2geth` -* `cerc/optimism-op-batcher` * `cerc/optimism-op-node` +* `cerc/optimism-op-batcher` +* `cerc/optimism-op-proposer` ## Deploy diff --git a/app/data/stacks/fixturenet-optimism/stack.yml b/app/data/stacks/fixturenet-optimism/stack.yml index e53623ca..45bb1709 100644 --- a/app/data/stacks/fixturenet-optimism/stack.yml +++ b/app/data/stacks/fixturenet-optimism/stack.yml @@ -16,6 +16,7 @@ containers: - cerc/optimism-op-node - cerc/optimism-l2geth - cerc/optimism-op-batcher + - cerc/optimism-op-proposer pods: - fixturenet-eth - fixturenet-optimism diff --git a/app/data/stacks/mobymask-v2/README.md b/app/data/stacks/mobymask-v2/README.md index ff67b55c..e781af79 100644 --- a/app/data/stacks/mobymask-v2/README.md +++ b/app/data/stacks/mobymask-v2/README.md @@ -35,7 +35,7 @@ git checkout v0.1.2 # Optimism cd ~/cerc/optimism -git checkout @eth-optimism/sdk@0.0.0-20230329025055 +git checkout v1.0.3 ``` Build the container images: From cf0e0c5d94cdaabac10b83ca4e3ae631a1104384 Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Tue, 25 Apr 2023 11:51:49 +0530 Subject: [PATCH 0453/1010] Add an arg for shutdown timeout in deploy down command (#366) Former-commit-id: 44cf57df9b627fb2ad992e56d14b7f7caef52779 --- app/data/stacks/fixturenet-optimism/README.md | 2 +- app/data/stacks/fixturenet-optimism/l2-only.md | 2 +- app/data/stacks/mobymask-v2/README.md | 2 +- app/deploy_system.py | 8 +++++++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/app/data/stacks/fixturenet-optimism/README.md b/app/data/stacks/fixturenet-optimism/README.md index bbe41c6a..d8a7966f 100644 --- a/app/data/stacks/fixturenet-optimism/README.md +++ b/app/data/stacks/fixturenet-optimism/README.md @@ -70,7 +70,7 @@ docker logs -f Stop all services running in the background: ```bash -laconic-so --stack fixturenet-optimism deploy down +laconic-so --stack fixturenet-optimism deploy down 30 ``` Clear volumes created by this stack: diff --git a/app/data/stacks/fixturenet-optimism/l2-only.md b/app/data/stacks/fixturenet-optimism/l2-only.md index 72bf93cb..0396bf6a 100644 --- a/app/data/stacks/fixturenet-optimism/l2-only.md +++ b/app/data/stacks/fixturenet-optimism/l2-only.md @@ -90,7 +90,7 @@ docker logs -f Stop all services running in the background: ```bash -laconic-so --stack fixturenet-optimism deploy --include fixturenet-optimism down +laconic-so --stack fixturenet-optimism deploy --include fixturenet-optimism down 30 ``` Clear volumes created by this stack: diff --git a/app/data/stacks/mobymask-v2/README.md b/app/data/stacks/mobymask-v2/README.md index e781af79..a123c203 100644 --- a/app/data/stacks/mobymask-v2/README.md +++ b/app/data/stacks/mobymask-v2/README.md @@ -111,7 +111,7 @@ Follow the [demo](./demo.md) to try out the MobyMask app with L2 chain Stop all the services running in background run: ```bash -laconic-so --stack mobymask-v2 deploy-system down +laconic-so --stack mobymask-v2 deploy-system down 30 ``` Clear volumes created by this stack: diff --git a/app/deploy_system.py b/app/deploy_system.py index 3c347fdf..35912518 100644 --- a/app/deploy_system.py +++ b/app/deploy_system.py @@ -74,7 +74,13 @@ def command(ctx, include, exclude, env_file, cluster, command, extra_args): elif command == "down": if verbose: print("Running compose down") - docker.compose.down() + + timeout_arg = None + if extra_args_list: + timeout_arg=extra_args_list[0] + + # Specify shutdown timeout (default 10s) to give services enough time to shutdown gracefully + docker.compose.down(timeout=timeout_arg) elif command == "exec": if extra_args_list is None or len(extra_args_list) < 2: print("Usage: exec ") From 8f6703940a43988175314e34a42417a4b80f0afd Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Tue, 25 Apr 2023 15:52:38 +0530 Subject: [PATCH 0454/1010] Upgrade Optimism (#367) Former-commit-id: 8a054a979ca45debcfe4af04fb858a123cce3a96 --- app/data/stacks/fixturenet-optimism/README.md | 2 +- app/data/stacks/fixturenet-optimism/l2-only.md | 2 +- app/data/stacks/mobymask-v2/README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/data/stacks/fixturenet-optimism/README.md b/app/data/stacks/fixturenet-optimism/README.md index d8a7966f..7664a7c3 100644 --- a/app/data/stacks/fixturenet-optimism/README.md +++ b/app/data/stacks/fixturenet-optimism/README.md @@ -19,7 +19,7 @@ Checkout to the required versions and branches in repos: ```bash # Optimism cd ~/cerc/optimism -git checkout v1.0.3 +git checkout v1.0.4 ``` Build the container images: diff --git a/app/data/stacks/fixturenet-optimism/l2-only.md b/app/data/stacks/fixturenet-optimism/l2-only.md index 0396bf6a..8cac9ce1 100644 --- a/app/data/stacks/fixturenet-optimism/l2-only.md +++ b/app/data/stacks/fixturenet-optimism/l2-only.md @@ -19,7 +19,7 @@ Checkout to the required versions and branches in repos: ```bash # Optimism cd ~/cerc/optimism -git checkout v1.0.3 +git checkout v1.0.4 ``` Build the container images: diff --git a/app/data/stacks/mobymask-v2/README.md b/app/data/stacks/mobymask-v2/README.md index a123c203..32fdbf60 100644 --- a/app/data/stacks/mobymask-v2/README.md +++ b/app/data/stacks/mobymask-v2/README.md @@ -35,7 +35,7 @@ git checkout v0.1.2 # Optimism cd ~/cerc/optimism -git checkout v1.0.3 +git checkout v1.0.4 ``` Build the container images: From e004d938917fef281ff478c54ee1147e43884ed8 Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Tue, 25 Apr 2023 18:32:38 +0530 Subject: [PATCH 0455/1010] Add instructions to run MobyMask app with a watcher on network (#368) * Remove unnecessary check on watcher endpoint * Add instructions to run MobyMask app with a watcher on network * Move watcher on network docs to a separate folder * Add nginx config for watcher endpoint * Add expected output logs * Add sample nginx config for hosting the app * Update instructions Former-commit-id: 018950858b1607e08185d65588047718039db959 --- .../compose/docker-compose-mobymask-app.yml | 14 +- .../compose/docker-compose-peer-test-app.yml | 5 +- .../watcher-mobymask-v2/mobymask-app-start.sh | 8 +- .../watcher-mobymask-v2/mobymask-params.env | 2 - .../watcher.md} | 49 ++++-- .../watcher-p2p-network/web-app.md | 162 ++++++++++++++++++ app/data/stacks/mobymask-v2/web-apps.md | 6 +- 7 files changed, 204 insertions(+), 42 deletions(-) rename app/data/stacks/mobymask-v2/{watcher-p2p-network.md => watcher-p2p-network/watcher.md} (87%) create mode 100644 app/data/stacks/mobymask-v2/watcher-p2p-network/web-app.md diff --git a/app/data/compose/docker-compose-mobymask-app.yml b/app/data/compose/docker-compose-mobymask-app.yml index f2b30a4b..d43e6b44 100644 --- a/app/data/compose/docker-compose-mobymask-app.yml +++ b/app/data/compose/docker-compose-mobymask-app.yml @@ -15,12 +15,7 @@ services: CERC_RELAY_NODES: ${CERC_RELAY_NODES} CERC_BUILD_DIR: "@cerc-io/mobymask-ui/build" working_dir: /scripts - # Waits for watcher server to be up before app build - # Required when running with watcher stack to get deployed contract address - command: - - sh - - -c - - ./wait-for-it.sh -h ${CERC_WATCHER_HOST:-$${DEFAULT_CERC_WATCHER_HOST}} -p ${CERC_WATCHER_PORT:-$${DEFAULT_CERC_WATCHER_PORT}} -s -t 0 -- ./mobymask-app-start.sh + command: ["sh", "mobymask-app-start.sh"] volumes: - ../config/wait-for-it.sh:/scripts/wait-for-it.sh - ../config/watcher-mobymask-v2/mobymask-app-start.sh:/scripts/mobymask-app-start.sh @@ -51,12 +46,7 @@ services: CERC_RELAY_NODES: ${CERC_RELAY_NODES} CERC_BUILD_DIR: "@cerc-io/mobymask-ui-lxdao/build" working_dir: /scripts - # Waits for watcher server to be up before app build - # Required when running with watcher stack to get deployed contract address - command: - - sh - - -c - - ./wait-for-it.sh -h ${CERC_WATCHER_HOST:-$${DEFAULT_CERC_WATCHER_HOST}} -p ${CERC_WATCHER_PORT:-$${DEFAULT_CERC_WATCHER_PORT}} -s -t 0 -- ./mobymask-app-start.sh + command: ["sh", "mobymask-app-start.sh"] volumes: - ../config/wait-for-it.sh:/scripts/wait-for-it.sh - ../config/watcher-mobymask-v2/mobymask-app-start.sh:/scripts/mobymask-app-start.sh diff --git a/app/data/compose/docker-compose-peer-test-app.yml b/app/data/compose/docker-compose-peer-test-app.yml index 927f92f7..f2a22675 100644 --- a/app/data/compose/docker-compose-peer-test-app.yml +++ b/app/data/compose/docker-compose-peer-test-app.yml @@ -10,10 +10,7 @@ services: environment: CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} CERC_RELAY_NODES: ${CERC_RELAY_NODES} - command: - - sh - - -c - - ./wait-for-it.sh -h ${CERC_WATCHER_HOST:-$${DEFAULT_CERC_WATCHER_HOST}} -p ${CERC_WATCHER_PORT:-$${DEFAULT_CERC_WATCHER_PORT}} -s -t 0 -- ./test-app-start.sh + command: ["sh", "test-app-start.sh"] volumes: - ../config/wait-for-it.sh:/scripts/wait-for-it.sh - ../config/watcher-mobymask-v2/test-app-start.sh:/scripts/test-app-start.sh diff --git a/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh b/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh index 0437d22d..9f343340 100755 --- a/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh +++ b/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh @@ -17,9 +17,13 @@ fi echo "Using CERC_RELAY_NODES $CERC_RELAY_NODES" -# Use config from mounted volume if available (when running web-app along with watcher stack) -if [ -f /server/config.json ]; then +if [ -z "$CERC_DEPLOYED_CONTRACT" ]; then + # Use config from mounted volume (when running web-app along with watcher stack) echo "Taking config for deployed contract from mounted volume" + while [ ! -f /server/config.json ]; do + echo "Config not found, retrying after 5 seconds" + sleep 5 + done # Get deployed contract address and chain id CERC_DEPLOYED_CONTRACT=$(jq -r '.address' /server/config.json | tr -d '"') diff --git a/app/data/config/watcher-mobymask-v2/mobymask-params.env b/app/data/config/watcher-mobymask-v2/mobymask-params.env index 22681036..6d1bf063 100644 --- a/app/data/config/watcher-mobymask-v2/mobymask-params.env +++ b/app/data/config/watcher-mobymask-v2/mobymask-params.env @@ -1,8 +1,6 @@ # Defaults # Watcher endpoint -DEFAULT_CERC_WATCHER_HOST="mobymask-watcher-server" -DEFAULT_CERC_WATCHER_PORT=3001 DEFAULT_CERC_APP_WATCHER_URL="http://localhost:3001" # Set of relay peers to connect to from the relay node diff --git a/app/data/stacks/mobymask-v2/watcher-p2p-network.md b/app/data/stacks/mobymask-v2/watcher-p2p-network/watcher.md similarity index 87% rename from app/data/stacks/mobymask-v2/watcher-p2p-network.md rename to app/data/stacks/mobymask-v2/watcher-p2p-network/watcher.md index 5fbaf79e..74d95b92 100644 --- a/app/data/stacks/mobymask-v2/watcher-p2p-network.md +++ b/app/data/stacks/mobymask-v2/watcher-p2p-network/watcher.md @@ -81,10 +81,11 @@ Add the following contents to `mobymask-watcher.env`: ```bash # Domain to be used in the relay node's announce address - CERC_RELAY_ANNOUNCE_DOMAIN="example.com" + CERC_RELAY_ANNOUNCE_DOMAIN="mobymask.example.com" # DO NOT CHANGE THESE VALUES + CERC_L2_GETH_RPC="https://mobymask-l2.dev.vdb.to" CERC_DEPLOYED_CONTRACT="0x2B6AFbd4F479cE4101Df722cF4E05F941523EaD9" CERC_ENABLE_PEER_L2_TXS=false CERC_RELAY_PEERS=["/dns4/relay1.dev.vdb.to/tcp/443/wss/p2p/12D3KooWAx83SM9GWVPc9v9fNzLzftRX6EaAFMjhYiFxRYqctcW1", "/dns4/relay2.dev.vdb.to/tcp/443/wss/p2p/12D3KooWBycy6vHVEfUwwYRbPLBdb5gx9gtFSEMpErYPUjUkDNkm", "/dns4/relay3.dev.vdb.to/tcp/443/wss/p2p/12D3KooWARcUJsiGCgiygiRVVK94U8BNSy8DFBbzAF3B6orrabwn"] @@ -115,7 +116,7 @@ This will run the `mobymask-v2-watcher` including: * A relay node which is in a federated setup with relay nodes set in the env file * A peer node which connects to the watcher relay node as an entrypoint to the MobyMask watcher p2p network. This peer listens for messages from other peers on the network and logs them out to the console -The watcher endpoint is exposed on host port `3001` and the relay node endpoint is exposed on host port `9090` +The watcher GraphQL endpoint is exposed on host port `3001` and the relay node endpoint is exposed on host port `9090` To list down and monitor the running containers: @@ -155,18 +156,30 @@ Check watcher container logs to get multiaddr advertised by the watcher's relay # mobymask_v2-mobymask-watcher-server-1 | 2023-04-20T04:22:57.069Z laconic:relay Relay node started with id 12D3KooWKef84LAcBNb9wZNs6jC5kQFXjddo47hK6AGHD2dSvGai (characteristic-black-pamella) # mobymask_v2-mobymask-watcher-server-1 | 2023-04-20T04:22:57.069Z laconic:relay Listening on: - # mobymask_v2-mobymask-watcher-server-1 | 2023-04-20T04:22:57.070Z laconic:relay /dns4/example.com/tcp/443/wss/p2p/12D3KooWKef84LAcBNb9wZNs6jC5kQFXjddo47hK6AGHD2dSvGai + # mobymask_v2-mobymask-watcher-server-1 | 2023-04-20T04:22:57.070Z laconic:relay /dns4/mobymask.example.com/tcp/443/wss/p2p/12D3KooWKef84LAcBNb9wZNs6jC5kQFXjddo47hK6AGHD2dSvGai ``` ## Web App -To be able to connect to the relay node from remote peers, it needs to be publicly reachable. Configure your website with SSL and the `https` traffic forwarded to port `9090`. +To be able to connect to the relay node from remote peers, it needs to be publicly reachable. +Configure your website with SSL and the `https` traffic reverse proxied as: +* `/graphql` to port `3001` (watcher GQL endpoint) +* `/` to port `9090` (relay node) -For example, a Nginx configuration for domain `example.com` would look something like: +For example, a Nginx configuration for domain `mobymask.example.com` would look something like: ```bash server { - server_name example.com; + server_name mobymask.example.com; + + location /graphql { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://127.0.0.1:3001; + proxy_read_timeout 90; + } # https://nginx.org/en/docs/http/websocket.html location / { @@ -181,35 +194,37 @@ For example, a Nginx configuration for domain `example.com` would look something listen [::]:443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot - ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot - ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot + ssl_certificate /etc/letsencrypt/live/mobymask.example.com/fullchain.pem; # managed by Certbot + ssl_certificate_key /etc/letsencrypt/live/mobymask.example.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { - if ($host = example.com) { + if ($host = mobymask.example.com) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; listen [::]:80; - server_name example.com; + server_name mobymask.example.com; return 404; # managed by Certbot } ``` -To connect a browser peer to the watcher's relay node: -* Visit https://mobymask-lxdao-app.dev.vdb.to/ +To test the web-app, either visit https://mobymask-lxdao-app.dev.vdb.to/ or follow [web-app.md](./web-app.md) to deploy the app locally that hits your watcher's GQL endpoint + +Connect a browser peer to the watcher's relay node: * Click on debug panel on bottom right of the homepage * Select `` in `Primary Relay` dropdown on the right and enter the watcher relay node's multiaddr * Click on `UPDATE` to refresh the page and connect to the watcher's relay node; you should see the relay node's multiaddr in `Self Node Info` on the debug panel * Switch to the `GRAPH (PEERS)` tab to see peers connected to this browser node and the `GRAPH (NETWORK)` tab to see the whole MobyMask p2p network -Perform transactions (invite required): -* Open the invite link in a browser and open the debug panel -* Confirm that the browser peer is connected to at least one other peer, then close the debug panel +Perform transactions: +* An invitation is required to be able to perform transactions; ask an existing user of the app for an invite +* In a browser, close the app if it's already open and then open the invite link +* From the debug panel, confirm that the browser peer is connected to at least one other peer * Check the status for a phisher to be reported in the `Check Phisher Status` section on homepage * Select `Report Phisher` option in the `Pending reports` section, enter multiple phisher records and click on the `Submit batch to p2p network` button; this broadcasts signed invocations to peers on the network, including the watcher peer * Check the watcher container logs to see the message received: @@ -286,7 +301,7 @@ Clear volumes created by this stack: ```bash # List all relevant volumes - docker volume ls -q --filter "name=mobymask_v2*" + docker volume ls -q --filter "name=mobymask_v2" # Expected output: @@ -296,7 +311,7 @@ Clear volumes created by this stack: # Remove all the listed volumes - docker volume rm $(docker volume ls -q --filter "name=mobymask_v2*") + docker volume rm $(docker volume ls -q --filter "name=mobymask_v2") ``` ## Troubleshooting diff --git a/app/data/stacks/mobymask-v2/watcher-p2p-network/web-app.md b/app/data/stacks/mobymask-v2/watcher-p2p-network/web-app.md new file mode 100644 index 00000000..d20dc405 --- /dev/null +++ b/app/data/stacks/mobymask-v2/watcher-p2p-network/web-app.md @@ -0,0 +1,162 @@ +# MobyMask Watcher P2P Network - Web App + +Instructions to setup and deploy the MobyMask app locally, pointed to a watcher on the p2p network + +## Prerequisites + +* Laconic Stack Orchestrator ([installation](/README.md#install)) +* Watcher GQL endpoint + +## Setup + +Build the container images: + + ```bash + laconic-so --stack mobymask-v2 build-containers --include cerc/react-peer,cerc/mobymask-ui + ``` + +Check that the required images are created in the local image registry: + + ```bash + docker image ls + + # Expected output: + + # REPOSITORY TAG IMAGE ID CREATED SIZE + # cerc/react-peer local d66b144dbb53 4 days ago 868MB + # cerc/mobymask-ui local e456bf9937ec 4 days ago 1.67GB + # . + # . + ``` + +## Deploy + +### Configuration + +Create an env file `mobymask-app.env`: + + ```bash + touch mobymask-app.env + ``` + +Add the following contents to `mobymask-app.env`: + + ```bash + # Watcher endpoint used by the app for GQL queries + CERC_APP_WATCHER_URL="http://127.0.0.1:3001" + + + # DO NOT CHANGE THESE VALUES + CERC_DEPLOYED_CONTRACT="0x2B6AFbd4F479cE4101Df722cF4E05F941523EaD9" + CERC_RELAY_NODES=["/dns4/relay1.dev.vdb.to/tcp/443/wss/p2p/12D3KooWAx83SM9GWVPc9v9fNzLzftRX6EaAFMjhYiFxRYqctcW1", "/dns4/relay2.dev.vdb.to/tcp/443/wss/p2p/12D3KooWBycy6vHVEfUwwYRbPLBdb5gx9gtFSEMpErYPUjUkDNkm", "/dns4/relay3.dev.vdb.to/tcp/443/wss/p2p/12D3KooWARcUJsiGCgiygiRVVK94U8BNSy8DFBbzAF3B6orrabwn"] + ``` + +Replace `CERC_APP_WATCHER_URL` with the watcher's endpoint (eg. `https://mobymask.example.com`) + +### Deploy the stack + +```bash +laconic-so --stack mobymask-v2 deploy --cluster mm_v2 --include mobymask-app --env-file mobymask-app.env up lxdao-mobymask-app + +# Expected output (ignore the "The X variable is not set. Defaulting to a blank string." warnings): + +# [+] Running 4/4 +# ✔ Network mm_v2_default Created 0.1s +# ✔ Volume "mm_v2_peers_ids" Created 0.0s +# ✔ Volume "mm_v2_mobymask_deployment" Created 0.0s +# ✔ Container mm_v2-lxdao-mobymask-app-1 Started 1.1s +``` + +This will run the `lxdao-mobymask-app` (at `http://localhost:3004`) pointed to `CERC_APP_WATCHER_URL` for GQL queries + +To monitor the running container: + + ```bash + # With status + docker ps + + # Expected output: + + # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + # f1369dbae1c9 cerc/mobymask-ui:local "docker-entrypoint.s…" 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:3004->80/tcp mm_v2-lxdao-mobymask-app-1 + + # Check logs for a container + docker logs -f mm_v2-lxdao-mobymask-app-1 + + # Expected output: + + # . + # . + # . + # Available on: + # http://127.0.0.1:80 + # http://192.168.0.2:80 + # Hit CTRL-C to stop the server + ``` + +Note: For opening an invite link on this deployed app, replace the URL part before `/#` with `http://localhost:3004` +For example: `http://localhost:3004/#/members?invitation=XYZ` + +In order to host the app using a public domain, configure your website with SSL and `https` traffic reverse proxied to port `3004`. + +For example, a Nginx configuration for domain `my-mobymask-app.example.com` would look something like: + + ```bash + server { + server_name my-mobymask-app.example.com; + + location / { + proxy_pass http://localhost:3004; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + listen [::]:443 ssl; + listen 443 ssl; + ssl_certificate /etc/letsencrypt/live/my-mobymask-app.example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/my-mobymask-app.example.com/privkey.pem; + include /etc/letsencrypt/options-ssl-nginx.conf; + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + } + + server { + if ($host = my-mobymask-app.example.com) { + return 301 https://$host$request_uri; + } # managed by Certbot + + server_name my-mobymask-app.example.com; + listen 80; + return 404; # managed by Certbot + } + ``` + +## Clean up + +Stop all services running in the background: + + ```bash + laconic-so --stack mobymask-v2 deploy --cluster mm_v2 --include mobymask-app down + + # Expected output: + + # [+] Running 2/2 + # ✔ Container mm_v2-lxdao-mobymask-app-1 Removed 10.6s + # ✔ Network mm_v2_default Removed 0.5s + ``` + +Clear volumes created by this stack: + + ```bash + # List all relevant volumes + docker volume ls -q --filter "name=mm_v2" + + # Expected output: + + # mm_v2_mobymask_deployment + # mm_v2_peers_ids + + # Remove all the listed volumes + docker volume rm $(docker volume ls -q --filter "name=mm_v2") + ``` diff --git a/app/data/stacks/mobymask-v2/web-apps.md b/app/data/stacks/mobymask-v2/web-apps.md index 76293f1f..42f05095 100644 --- a/app/data/stacks/mobymask-v2/web-apps.md +++ b/app/data/stacks/mobymask-v2/web-apps.md @@ -28,10 +28,6 @@ Create and update an env file to be used in the next step ([defaults](../../conf # Also add if running MobyMask app: - # External watcher endpoint (to check if watcher is up) - CERC_WATCHER_HOST= - CERC_WATCHER_PORT= - # Watcher endpoint used by the app for GQL queries CERC_APP_WATCHER_URL="http://127.0.0.1:3001" @@ -50,7 +46,7 @@ For running mobymask-app ```bash laconic-so --stack mobymask-v2 deploy --include mobymask-app --env-file up -# Runs on host port 3002 +# Runs mobymask-app on host port 3002 and lxdao-mobymask-app on host port 3004 ``` For running peer-test-app From 4ca185c7537af40a572a612394630a0f3cbc9cfc Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Tue, 25 Apr 2023 19:38:13 +0530 Subject: [PATCH 0456/1010] Fix sample env in MobyMask app instructions (#369) Former-commit-id: 6a11046ea5e107bfdba32767532f472e4f72d00b --- app/data/stacks/mobymask-v2/watcher-p2p-network/web-app.md | 2 +- app/data/stacks/mobymask-v2/web-apps.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/data/stacks/mobymask-v2/watcher-p2p-network/web-app.md b/app/data/stacks/mobymask-v2/watcher-p2p-network/web-app.md index d20dc405..cf1821b5 100644 --- a/app/data/stacks/mobymask-v2/watcher-p2p-network/web-app.md +++ b/app/data/stacks/mobymask-v2/watcher-p2p-network/web-app.md @@ -48,7 +48,7 @@ Add the following contents to `mobymask-app.env`: # DO NOT CHANGE THESE VALUES CERC_DEPLOYED_CONTRACT="0x2B6AFbd4F479cE4101Df722cF4E05F941523EaD9" - CERC_RELAY_NODES=["/dns4/relay1.dev.vdb.to/tcp/443/wss/p2p/12D3KooWAx83SM9GWVPc9v9fNzLzftRX6EaAFMjhYiFxRYqctcW1", "/dns4/relay2.dev.vdb.to/tcp/443/wss/p2p/12D3KooWBycy6vHVEfUwwYRbPLBdb5gx9gtFSEMpErYPUjUkDNkm", "/dns4/relay3.dev.vdb.to/tcp/443/wss/p2p/12D3KooWARcUJsiGCgiygiRVVK94U8BNSy8DFBbzAF3B6orrabwn"] + CERC_RELAY_NODES=["/dns4/relay1.dev.vdb.to/tcp/443/wss/p2p/12D3KooWAx83SM9GWVPc9v9fNzLzftRX6EaAFMjhYiFxRYqctcW1","/dns4/relay2.dev.vdb.to/tcp/443/wss/p2p/12D3KooWBycy6vHVEfUwwYRbPLBdb5gx9gtFSEMpErYPUjUkDNkm","/dns4/relay3.dev.vdb.to/tcp/443/wss/p2p/12D3KooWARcUJsiGCgiygiRVVK94U8BNSy8DFBbzAF3B6orrabwn"] ``` Replace `CERC_APP_WATCHER_URL` with the watcher's endpoint (eg. `https://mobymask.example.com`) diff --git a/app/data/stacks/mobymask-v2/web-apps.md b/app/data/stacks/mobymask-v2/web-apps.md index 42f05095..2eb037f6 100644 --- a/app/data/stacks/mobymask-v2/web-apps.md +++ b/app/data/stacks/mobymask-v2/web-apps.md @@ -22,7 +22,7 @@ Create and update an env file to be used in the next step ([defaults](../../conf ```bash # Set of relay nodes to be used by the web-app - # (use double quotes " for strings) + # (use double quotes " for strings, avoid space after commas) # Eg. CERC_RELAY_NODES=["/dns4/example.com/tcp/443/wss/p2p/12D3KooWGHmDDCc93XUWL16FMcTPCGu2zFaMkf67k8HZ4gdQbRDr"] CERC_RELAY_NODES=[] From d8522211f4875ab5a2338a7d4ce2916f5851365f Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Wed, 26 Apr 2023 00:13:35 -0500 Subject: [PATCH 0457/1010] Add script for exporting ethdb from fixturenet. (#370) * Add script for exporting ethdb from fixturenet. * Update README * Script Former-commit-id: 7a607c299441126d3c9126dc4efa70b18b63ea48 --- .../compose/docker-compose-fixturenet-eth.yml | 2 + .../cerc-fixturenet-eth-geth/run-el.sh | 6 +++ .../scripts/export-ethdb.sh | 38 +++++++++++++++++++ .../scripts/status.sh | 26 +++++++++++-- app/data/stacks/fixturenet-eth-tx/README.md | 37 ++++++++++++++++++ app/data/stacks/fixturenet-eth-tx/stack.yml | 15 ++++++++ 6 files changed, 121 insertions(+), 3 deletions(-) create mode 100755 app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/export-ethdb.sh create mode 100644 app/data/stacks/fixturenet-eth-tx/README.md create mode 100644 app/data/stacks/fixturenet-eth-tx/stack.yml diff --git a/app/data/compose/docker-compose-fixturenet-eth.yml b/app/data/compose/docker-compose-fixturenet-eth.yml index c687b326..59f729b9 100644 --- a/app/data/compose/docker-compose-fixturenet-eth.yml +++ b/app/data/compose/docker-compose-fixturenet-eth.yml @@ -49,6 +49,8 @@ services: timeout: 10s retries: 10 start_period: 3s + environment: + CERC_KEEP_RUNNING_AFTER_GETH_EXIT: "true" env_file: - ../config/fixturenet-eth/fixturenet-eth.env image: cerc/fixturenet-eth-geth:local diff --git a/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh b/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh index 526c76d7..edde1ba2 100755 --- a/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh +++ b/app/data/container-build/cerc-fixturenet-eth-geth/run-el.sh @@ -127,3 +127,9 @@ else fi wait $geth_pid + +if [ "true" == "$CERC_KEEP_RUNNING_AFTER_GETH_EXIT" ]; then + while [ 1 -eq 1 ]; do + sleep 60 + done +fi diff --git a/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/export-ethdb.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/export-ethdb.sh new file mode 100755 index 00000000..77198c61 --- /dev/null +++ b/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/export-ethdb.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +MY_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +GETH_EXPORT_MIN_BLOCK=${1:-${GETH_EXPORT_MIN_BLOCK:-1000}} + +# Wait for block. +${MY_DIR}/status.sh $GETH_EXPORT_MIN_BLOCK +if [ $? -ne 0 ]; then + echo "Unable to export ethdb." 1>&2 + exit 1 +fi + +# Stop geth. +echo -n "Exporting ethdb.... " +GETH_CONTAINER=`docker ps -q -f "name=${CERC_SO_COMPOSE_PROJECT}-fixturenet-eth-geth-2-1"` +if [ -z "$GETH_CONTAINER" ]; then + echo "not found" + exit 1 +fi + +docker exec $GETH_CONTAINER sh -c 'rm -rf /root/tmp && mkdir -p /root/tmp/export' +docker exec $GETH_CONTAINER sh -c 'ln -s /opt/testnet/build/el/geth.json /root/tmp/export/genesis.json && ln -s /root/ethdata /root/tmp/export/' +docker exec $GETH_CONTAINER sh -c 'cat /root/tmp/export/genesis.json | jq ".config" > /root/tmp/export/genesis.config.json' + +# Stop geth and zip up ethdb. +docker exec $GETH_CONTAINER sh -c 'curl -s --location "localhost:8545" --header "Content-Type: application/json" --data "{\"jsonrpc\": \"2.0\", \"id\": 1, \"method\": \"eth_getBlockByNumber\", \"params\": [\"0x0\", false]}" > /root/tmp/export/eth_getBlockByNumber_0x0.json' +docker exec $GETH_CONTAINER sh -c 'curl -s --location "localhost:8545" --header "Content-Type: application/json" --data "{\"jsonrpc\": \"2.0\", \"id\": 1, \"method\": \"eth_blockNumber\", \"params\": []}" > /root/tmp/export/eth_blockNumber.json' +docker exec $GETH_CONTAINER sh -c "killall geth && sleep 2 && tar chzf /root/tmp/ethdb.tgz -C /root/tmp/export ." + +# Copy ethdb to host. +GETH_EXPORT_FILE=${2:-${GETH_EXPORT_FILE:-./ethdb.tgz}} +docker cp $GETH_CONTAINER:/root/tmp/ethdb.tgz $GETH_EXPORT_FILE +echo "$GETH_EXPORT_FILE" +docker exec $GETH_CONTAINER sh -c "rm -rf /root/tmp" + +# Restart the container to get geth back up and running. +docker restart $GETH_CONTAINER >/dev/null diff --git a/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh index c6e65a68..f6d9d27b 100755 --- a/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh +++ b/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/status.sh @@ -2,9 +2,10 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then set -x fi -STATUSES=("geth to generate DAG" "beacon phase0" "beacon altair" "beacon bellatrix pre-merge" "beacon bellatrix merge") -STATUS=0 +MIN_BLOCK_NUM=${1:-${MIN_BLOCK_NUM:-3}} +STATUSES=("geth to generate DAG" "beacon phase0" "beacon altair" "beacon bellatrix pre-merge" "beacon bellatrix merge" "block number $MIN_BLOCK_NUM") +STATUS=0 LIGHTHOUSE_BASE_URL=${LIGHTHOUSE_BASE_URL} GETH_BASE_URL=${GETH_BASE_URL} @@ -13,18 +14,29 @@ GETH_BASE_URL=${GETH_BASE_URL} # or some execution environment-neutral mechanism. if [ -z "$LIGHTHOUSE_BASE_URL" ]; then LIGHTHOUSE_CONTAINER=`docker ps -q -f "name=fixturenet-eth-lighthouse-1-1"` + if [ -z "$LIGHTHOUSE_CONTAINER" ]; then + echo "Lighthouse container not found." 1>&2 + exit 1 + fi LIGHTHOUSE_PORT=`docker port $LIGHTHOUSE_CONTAINER 8001 | cut -d':' -f2` LIGHTHOUSE_BASE_URL="http://localhost:${LIGHTHOUSE_PORT}" fi if [ -z "$GETH_BASE_URL" ]; then GETH_CONTAINER=`docker ps -q -f "name=fixturenet-eth-geth-1-1"` + if [ -z "$GETH_CONTAINER" ]; then + echo "Lighthouse container not found." 1>&2 + exit 1 + fi GETH_PORT=`docker port $GETH_CONTAINER 8545 | cut -d':' -f2` GETH_BASE_URL="http://localhost:${GETH_PORT}" fi +MARKER="." + function inc_status() { echo " done" + MARKEr="." STATUS=$((STATUS + 1)) if [ $STATUS -lt ${#STATUSES[@]} ]; then echo -n "Waiting for ${STATUSES[$STATUS]}..." @@ -34,7 +46,7 @@ function inc_status() { echo -n "Waiting for ${STATUSES[$STATUS]}..." while [ $STATUS -lt ${#STATUSES[@]} ]; do sleep 1 - echo -n "." + echo -n "$MARKER" case $STATUS in 0) result=`wget --no-check-certificate --quiet -O - --method POST --header 'Content-Type: application/json' \ @@ -67,5 +79,13 @@ while [ $STATUS -lt ${#STATUSES[@]} ]; do inc_status fi ;; + 5) + result=`wget --no-check-certificate --quiet -O - "$LIGHTHOUSE_BASE_URL/eth/v2/beacon/blocks/head" | jq -r '.data.message.body.execution_payload.block_number'` + if [ ! -z "$result" ] && [ $result -gt $MIN_BLOCK_NUM ]; then + inc_status + else + MARKER="$result " + fi + ;; esac done diff --git a/app/data/stacks/fixturenet-eth-tx/README.md b/app/data/stacks/fixturenet-eth-tx/README.md new file mode 100644 index 00000000..9af9ee3d --- /dev/null +++ b/app/data/stacks/fixturenet-eth-tx/README.md @@ -0,0 +1,37 @@ +# fixturenet-eth-tx + +A variation of `fixturenet-eth` that automatically generates transactions using `tx-spammer`. + +See `stacks/fixturenet-eth/README.md` for more information. + +## Containers + +* cerc/go-ethereum +* cerc/lighthouse +* cerc/fixturenet-eth-geth +* cerc/fixturenet-eth-lighthouse +* cerc/tx-spammer + +## Deploy the stack +``` +$ laconic-so --stack fixturenet-eth-tx setup-repositories +$ laconic-so --stack fixturenet-eth-tx build-containers +$ laconic-so --stack fixturenet-eth-tx deploy up +``` + +## Export the ethdb (optional) + +It is easy to export data from the fixturenet for offline processing of the raw ethdb files (eg, by eth-statediff-service) using the `export-ethdb.sh` script. + +For example: + +``` +❯ app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/export-ethdb.sh 500 +Waiting for geth to generate DAG.... done +Waiting for beacon phase0.... done +Waiting for beacon altair.... done +Waiting for beacon bellatrix pre-merge.... done +Waiting for beacon bellatrix merge.... done +Waiting for block number 500.... done +Exporting ethdb.... ./ethdb.tgz +``` diff --git a/app/data/stacks/fixturenet-eth-tx/stack.yml b/app/data/stacks/fixturenet-eth-tx/stack.yml new file mode 100644 index 00000000..0c3b45a3 --- /dev/null +++ b/app/data/stacks/fixturenet-eth-tx/stack.yml @@ -0,0 +1,15 @@ +version: "1.1" +name: fixturenet-eth-tx +decription: "Ethereum Fixturenet w/ tx-spammer" +repos: + - cerc-io/go-ethereum + - cerc-io/tx-spammer +containers: + - cerc/go-ethereum + - cerc/lighthouse + - cerc/fixturenet-eth-geth + - cerc/fixturenet-eth-lighthouse + - cerc/tx-spammer +pods: + - fixturenet-eth + - tx-spammer From 617228d0dcf184a24638a0517eb5651d02137949 Mon Sep 17 00:00:00 2001 From: Zach Date: Wed, 26 Apr 2023 14:43:32 -0400 Subject: [PATCH 0458/1010] optimism: on error, wait, then re-run 'deploy up' Former-commit-id: a4ff8f3dcb8ff2b45fc89b9d99d8f354bb14b545 --- app/data/stacks/fixturenet-optimism/README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/data/stacks/fixturenet-optimism/README.md b/app/data/stacks/fixturenet-optimism/README.md index 7664a7c3..02e06a44 100644 --- a/app/data/stacks/fixturenet-optimism/README.md +++ b/app/data/stacks/fixturenet-optimism/README.md @@ -2,7 +2,7 @@ Instructions to setup and deploy an end-to-end L1+L2 stack with [fixturenet-eth](../fixturenet-eth/) (L1) and [Optimism](https://stack.optimism.io) (L2) -We support running just the L2 part of stack, given an external L1 endpoint. Follow [l2-only](./l2-only.md) for the same. +We support running just the L2 part of stack, given an external L1 endpoint. Follow the [L2 only doc](./l2-only.md) for the same. ## Setup @@ -28,6 +28,8 @@ Build the container images: laconic-so --stack fixturenet-optimism build-containers ``` +Note: this will take >10 mins depending on the specs of your machine, and **requires** 16GB of memory or greater. + This should create the required docker images in the local image registry: * `cerc/go-ethereum` * `cerc/lighthouse` @@ -48,12 +50,14 @@ Deploy the stack: laconic-so --stack fixturenet-optimism deploy up ``` -The `fixturenet-optimism-contracts` service may take a while (`~15 mins`) to complete running as it: +If you get the error `service "fixturenet-optimism-contracts" didn't complete successfully: exit 1` with ~25 lines of Traceback, wait 15-20 mins then re-run the command. + +The `fixturenet-optimism-contracts` service takes a while to complete running as it: 1. waits for the 'Merge' to happen on L1 2. waits for a finalized block to exist on L1 (so that it can be taken as a starting block for roll ups) 3. deploys the L1 contracts -To list down and monitor the running containers: +To list and monitor the running containers: ```bash laconic-so --stack fixturenet-optimism deploy ps From 03f6d027f97a5b6d0b2dc61979b579ea5d847583 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Wed, 26 Apr 2023 23:26:50 -0500 Subject: [PATCH 0459/1010] Minor script cleanup. (#372) Former-commit-id: 323ca3b2387e0ac656b901405362298895b8a3e8 --- .../scripts/export-ethdb.sh | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/export-ethdb.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/export-ethdb.sh index 77198c61..dd93b219 100755 --- a/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/export-ethdb.sh +++ b/app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/export-ethdb.sh @@ -1,12 +1,21 @@ #!/bin/bash -MY_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +# Exports the complete fixturenet-eth ethdb data to a tarball (default, ./ethdb.tgz), waiting for a minimum +# block height (default 1000) to be reached before exporting. + +# Usage: export-ethdb.sh [min_block_number=1000] [output_file=./ethdb.tgz] + +if [[ -n "$CERC_SCRIPT_DEBUG" ]]; then + set -x +fi + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) GETH_EXPORT_MIN_BLOCK=${1:-${GETH_EXPORT_MIN_BLOCK:-1000}} # Wait for block. -${MY_DIR}/status.sh $GETH_EXPORT_MIN_BLOCK -if [ $? -ne 0 ]; then +${SCRIPT_DIR}/status.sh $GETH_EXPORT_MIN_BLOCK +if [[ $? -ne 0 ]]; then echo "Unable to export ethdb." 1>&2 exit 1 fi @@ -14,7 +23,7 @@ fi # Stop geth. echo -n "Exporting ethdb.... " GETH_CONTAINER=`docker ps -q -f "name=${CERC_SO_COMPOSE_PROJECT}-fixturenet-eth-geth-2-1"` -if [ -z "$GETH_CONTAINER" ]; then +if [[ -z "$GETH_CONTAINER" ]]; then echo "not found" exit 1 fi From 4aecfcd780993e35fe2d352da5d7b4a0cf360bd6 Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Thu, 27 Apr 2023 18:26:58 +0530 Subject: [PATCH 0460/1010] Map op-batcher and op-proposer ports to host (#373) Former-commit-id: f04b266a24351d89fe60c2f87a0cbcd7e81dc6bf --- app/data/compose/docker-compose-fixturenet-optimism.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/data/compose/docker-compose-fixturenet-optimism.yml b/app/data/compose/docker-compose-fixturenet-optimism.yml index c9e17b03..a20fd118 100644 --- a/app/data/compose/docker-compose-fixturenet-optimism.yml +++ b/app/data/compose/docker-compose-fixturenet-optimism.yml @@ -122,6 +122,8 @@ services: # Waits for L1 endpoint to be up before running the batcher command: | "/wait-for-it.sh -h ${CERC_L1_HOST:-$${DEFAULT_CERC_L1_HOST}} -p ${CERC_L1_PORT:-$${DEFAULT_CERC_L1_PORT}} -s -t 60 -- /run-op-batcher.sh" + ports: + - "127.0.0.1:8548:8548" extra_hosts: - "host.docker.internal:host-gateway" @@ -145,6 +147,8 @@ services: # Waits for L1 endpoint to be up before running the proposer command: | "/wait-for-it.sh -h ${CERC_L1_HOST:-$${DEFAULT_CERC_L1_HOST}} -p ${CERC_L1_PORT:-$${DEFAULT_CERC_L1_PORT}} -s -t 60 -- /run-op-proposer.sh" + ports: + - "127.0.0.1:8560:8560" extra_hosts: - "host.docker.internal:host-gateway" From b0770d73790c877e36b986d4244a6b9f85538543 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 27 Apr 2023 10:22:21 -0600 Subject: [PATCH 0461/1010] Remove > Former-commit-id: 73419c341a427133161264e9bee5e6082bc918ce --- app/data/stacks/fixturenet-eth-tx/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/stacks/fixturenet-eth-tx/README.md b/app/data/stacks/fixturenet-eth-tx/README.md index 9af9ee3d..f6ae483a 100644 --- a/app/data/stacks/fixturenet-eth-tx/README.md +++ b/app/data/stacks/fixturenet-eth-tx/README.md @@ -26,7 +26,7 @@ It is easy to export data from the fixturenet for offline processing of the raw For example: ``` -❯ app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/export-ethdb.sh 500 +$ app/data/container-build/cerc-fixturenet-eth-lighthouse/scripts/export-ethdb.sh 500 Waiting for geth to generate DAG.... done Waiting for beacon phase0.... done Waiting for beacon altair.... done From f8306e6685e7ea2f23ac016f670d15cdac55b7da Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 27 Apr 2023 09:52:37 -0700 Subject: [PATCH 0462/1010] Add foundry to the fixturenet-eth-tx stack (#374) Former-commit-id: af93743974a5ea35f13a65261b53a2581eb36016 --- app/data/stacks/fixturenet-eth-tx/stack.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/data/stacks/fixturenet-eth-tx/stack.yml b/app/data/stacks/fixturenet-eth-tx/stack.yml index 0c3b45a3..0a0a6bd6 100644 --- a/app/data/stacks/fixturenet-eth-tx/stack.yml +++ b/app/data/stacks/fixturenet-eth-tx/stack.yml @@ -1,15 +1,18 @@ -version: "1.1" +version: "1.2" name: fixturenet-eth-tx decription: "Ethereum Fixturenet w/ tx-spammer" repos: - cerc-io/go-ethereum - cerc-io/tx-spammer + - dboreham/foundry containers: - cerc/go-ethereum - cerc/lighthouse - cerc/fixturenet-eth-geth - cerc/fixturenet-eth-lighthouse - cerc/tx-spammer + - cerc/foundry pods: - fixturenet-eth + - foundry - tx-spammer From 8cdb9cee35bd26a3eecb7fb466257d766a1f1c95 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Thu, 27 Apr 2023 09:54:11 -0700 Subject: [PATCH 0463/1010] Remove gerbil builder container from build-support stack (#375) Former-commit-id: 19e38d2a942af03e80e81138b3f079dfbf4de7fa --- app/data/stacks/build-support/stack.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/data/stacks/build-support/stack.yml b/app/data/stacks/build-support/stack.yml index e4efb457..e0962515 100644 --- a/app/data/stacks/build-support/stack.yml +++ b/app/data/stacks/build-support/stack.yml @@ -1,6 +1,5 @@ -version: "1.1" +version: "1.2" name: build-support decription: "Build Support Components" containers: - cerc/builder-js - - cerc/builder-gerbil From 6bb1acc04f432e31438971fa1b99d677df5627c1 Mon Sep 17 00:00:00 2001 From: zramsay Date: Thu, 27 Apr 2023 13:15:39 -0400 Subject: [PATCH 0464/1010] better direction to stacks Former-commit-id: 993118deb4e4ee668ad0c746fde40317cc37c2f0 --- README.md | 46 ++++++++-------------------------------------- 1 file changed, 8 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index 0f2ca38e..4f490d8c 100644 --- a/README.md +++ b/README.md @@ -35,58 +35,28 @@ curl -L -o ~/bin/laconic-so https://github.com/cerc-io/stack-orchestrator/releas ``` Give it execute permissions: + ```bash chmod +x ~/bin/laconic-so ``` Ensure `laconic-so` is on the [`PATH`](https://unix.stackexchange.com/a/26059) -Verify operation (your version will probably be different, just check here that you see some version outut and not an error): +Verify operation (your version will probably be different, just check here that you see some version output and not an error): ``` laconic-so version -Version: v1.0.27-7831078 +Version: 1.1.0-7a607c2-202304260513 ``` ## Usage -Three sub-commands: `setup-repositories`, `build-containers` and `deploy-system` are generally run in order. The following is a slim example for standing up the `erc20-watcher`. Go further with the [erc20 watcher demo](/app/data/stacks/erc20) and other pieces of the stack, within the [`stacks` directory](/app/data/stacks). +The various [stacks](/app/data/stacks) each contain instructions for running different stacks based on your use case. For example: -### Setup Repositories - -Clone the set of git repositories necessary to build a system: - -```bash -laconic-so --stack erc20 setup-repositories -``` - -This will default to cloning git reposiories into: `~/cerc` or - if set - the environment variable `CERC_REPO_BASE_DIR` - -### Build Containers - -Build the set of docker container images required to run a system. It takes around 10 minutes to build all the containers from scratch. - -```bash -laconic-so --stack erc20 build-containers -``` - -### Deploy System - -Uses `docker compose` to deploy a system (with most recently built container images). - -```bash -laconic-so --stack erc20 deploy-system up -``` - -Check out he GraphQL playground here: [http://localhost:3002/graphql](http://localhost:3002/graphql) - -See the [erc20 watcher demo](/app/data/stacks/erc20) to continue further. - -### Cleanup - -```bash -laconic-so --stack erc20 deploy-system down -``` +- [self-hosted Gitea](/app/data/stacks/build-support) +- [an Optimism Fixturenet](/app/data/stacks/fixturenet-optimism) +- [laconicd with console and CLI](app/data/stacks/fixturenet-laconic-loaded) +- [kubo (IPFS)](app/data/stacks/kubo) ## Contributing From 3751db80463073ba9d1b33cc7c8b5cdb32074ad3 Mon Sep 17 00:00:00 2001 From: Zach Date: Sat, 29 Apr 2023 14:55:10 -0400 Subject: [PATCH 0465/1010] rm gerbil from doc Former-commit-id: 97433a7bb562c94e09b0a311324318c65c0c0b84 --- app/data/stacks/build-support/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/stacks/build-support/README.md b/app/data/stacks/build-support/README.md index b4090d76..fd85927f 100644 --- a/app/data/stacks/build-support/README.md +++ b/app/data/stacks/build-support/README.md @@ -16,7 +16,7 @@ Leave `CERC_NPM_REGISTRY_URL` un-set to use the local gitea registry. Note: the scheme/gerbil container is excluded as it isn't currently required for the package registry. ``` -$ laconic-so --stack build-support build-containers --exclude cerc/builder-gerbil +$ laconic-so --stack build-support build-containers ``` ### 2. Deploy Gitea Package Registry From 3634a3547948152968f7e1a7eef06d77319b9fff Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Tue, 2 May 2023 12:14:48 +0530 Subject: [PATCH 0466/1010] Avoid persisting lighthouse bootnode ENR between restarts (#377) Former-commit-id: cba2345af3485d22a9d315d3cffe618caae470b6 --- .../compose/docker-compose-fixturenet-eth.yml | 3 --- .../genesis/cl/bootnode.sh | 16 ++++------------ app/data/stacks/fixturenet-eth/README.md | 4 ++-- 3 files changed, 6 insertions(+), 17 deletions(-) diff --git a/app/data/compose/docker-compose-fixturenet-eth.yml b/app/data/compose/docker-compose-fixturenet-eth.yml index 59f729b9..42737f5b 100644 --- a/app/data/compose/docker-compose-fixturenet-eth.yml +++ b/app/data/compose/docker-compose-fixturenet-eth.yml @@ -64,8 +64,6 @@ services: environment: RUN_BOOTNODE: "true" image: cerc/fixturenet-eth-lighthouse:local - volumes: - - fixturenet_eth_bootnode_lighthouse_data:/opt/testnet/build/cl fixturenet-eth-lighthouse-1: hostname: fixturenet-eth-lighthouse-1 @@ -120,6 +118,5 @@ volumes: fixturenet_eth_bootnode_geth_data: fixturenet_eth_geth_1_data: fixturenet_eth_geth_2_data: - fixturenet_eth_bootnode_lighthouse_data: fixturenet_eth_lighthouse_1_data: fixturenet_eth_lighthouse_2_data: diff --git a/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/bootnode.sh b/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/bootnode.sh index a395f41a..70ecb47c 100755 --- a/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/bootnode.sh +++ b/app/data/container-build/cerc-fixturenet-eth-lighthouse/genesis/cl/bootnode.sh @@ -21,22 +21,14 @@ if [ ! -f "$DATADIR/bootnode/enr.dat" ]; then --udp-port $BOOTNODE_PORT \ --tcp-port $BOOTNODE_PORT \ --genesis-fork-version $GENESIS_FORK_VERSION \ - --output-dir $DATADIR/bootnode-temp + --output-dir $DATADIR/bootnode - # Output ENR to a temp dir and mv as "lcli generate-bootnode-enr" will not overwrite an empty dir (mounted volume) - mkdir -p $DATADIR/bootnode - mv $DATADIR/bootnode-temp/* $DATADIR/bootnode - rm -r $DATADIR/bootnode-temp + bootnode_enr=`cat $DATADIR/bootnode/enr.dat` + echo "- $bootnode_enr" > $TESTNET_DIR/boot_enr.yaml - echo "Generated bootnode enr" -else - echo "Found existing bootnode enr" + echo "Generated bootnode enr and written to $TESTNET_DIR/boot_enr.yaml" fi -bootnode_enr=`cat $DATADIR/bootnode/enr.dat` -echo "- $bootnode_enr" > $TESTNET_DIR/boot_enr.yaml -echo "Written bootnode enr to $TESTNET_DIR/boot_enr.yaml" - exec lighthouse boot_node \ --testnet-dir $TESTNET_DIR \ --port $BOOTNODE_PORT \ diff --git a/app/data/stacks/fixturenet-eth/README.md b/app/data/stacks/fixturenet-eth/README.md index c54237aa..7bd96506 100644 --- a/app/data/stacks/fixturenet-eth/README.md +++ b/app/data/stacks/fixturenet-eth/README.md @@ -117,8 +117,8 @@ Clear volumes created by this stack: ```bash # List all relevant volumes -$ docker volume ls -q --filter "name=.*fixturenet_eth_bootnode_geth_data|.*fixturenet_eth_bootnode_lighthouse_data|.*fixturenet_eth_geth_1_data|.*fixturenet_eth_geth_2_data|.*fixturenet_eth_lighthouse_1_data|.*fixturenet_eth_lighthouse_2_data" +$ docker volume ls -q --filter "name=.*fixturenet_eth_bootnode_geth_data|.*fixturenet_eth_geth_1_data|.*fixturenet_eth_geth_2_data|.*fixturenet_eth_lighthouse_1_data|.*fixturenet_eth_lighthouse_2_data" # Remove all the listed volumes -$ docker volume rm $(docker volume ls -q --filter "name=.*fixturenet_eth_bootnode_geth_data|.*fixturenet_eth_bootnode_lighthouse_data|.*fixturenet_eth_geth_1_data|.*fixturenet_eth_geth_2_data|.*fixturenet_eth_lighthouse_1_data|.*fixturenet_eth_lighthouse_2_data") +$ docker volume rm $(docker volume ls -q --filter "name=.*fixturenet_eth_bootnode_geth_data|.*fixturenet_eth_geth_1_data|.*fixturenet_eth_geth_2_data|.*fixturenet_eth_lighthouse_1_data|.*fixturenet_eth_lighthouse_2_data") ``` From 55e7d22e579bd55a736f35609475e8c1cf5b1ece Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Tue, 2 May 2023 13:18:29 +0530 Subject: [PATCH 0467/1010] Upgrade to use latest lighthouse release (#378) Former-commit-id: ed4f40118fdf14f145c25b1a4d954a87ce1c9143 --- .../container-build/cerc-fixturenet-eth-lighthouse/Dockerfile | 2 +- app/data/container-build/cerc-lighthouse/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/data/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile b/app/data/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile index 2295262d..958d2b39 100644 --- a/app/data/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile +++ b/app/data/container-build/cerc-fixturenet-eth-lighthouse/Dockerfile @@ -1,4 +1,4 @@ -FROM sigp/lcli:v3.2.1 AS lcli +FROM sigp/lcli:v4.1.0 AS lcli FROM skylenet/ethereum-genesis-generator@sha256:210353ce7c898686bc5092f16c61220a76d357f51eff9c451e9ad1b9ad03d4d3 AS ethgen FROM cerc/fixturenet-eth-geth:local AS fnetgeth diff --git a/app/data/container-build/cerc-lighthouse/Dockerfile b/app/data/container-build/cerc-lighthouse/Dockerfile index 7d4fe5d8..cab3af06 100644 --- a/app/data/container-build/cerc-lighthouse/Dockerfile +++ b/app/data/container-build/cerc-lighthouse/Dockerfile @@ -1,4 +1,4 @@ -FROM sigp/lighthouse:v4.0.1-modern +FROM sigp/lighthouse:v4.1.0-modern RUN apt-get update; apt-get install bash netcat curl less jq -y; From c1e3f5674d44695ae7b56e77df0a11d6cc57c755 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 2 May 2023 14:13:48 -0700 Subject: [PATCH 0468/1010] Fixturenet pocket (#350) * add fixturenet-gaia stack * add fixturenet-pocket * integrate with eth fixturenet * separate out fixturenet-gaia * use pocket-deployments Dockerfile --------- Co-authored-by: iskay Co-authored-by: Ian Former-commit-id: b23b5ae3bfab43b8d9bfefa2ac388da1ad78bff7 --- .../docker-compose-fixturenet-pocket.yml | 18 ++ app/data/config/fixturenet-pocket/chains.json | 18 ++ .../fixturenet-pocket/create-fixturenet.sh | 65 +++++ .../config/fixturenet-pocket/genesis.json | 272 ++++++++++++++++++ app/data/container-build/cerc-pocket/build.sh | 3 + app/data/container-image-list.txt | 1 + app/data/pod-list.txt | 1 + app/data/repository-list.txt | 2 + app/data/stacks/fixturenet-pocket/README.md | 59 ++++ app/data/stacks/fixturenet-pocket/stack.yml | 16 ++ 10 files changed, 455 insertions(+) create mode 100644 app/data/compose/docker-compose-fixturenet-pocket.yml create mode 100755 app/data/config/fixturenet-pocket/chains.json create mode 100644 app/data/config/fixturenet-pocket/create-fixturenet.sh create mode 100644 app/data/config/fixturenet-pocket/genesis.json create mode 100755 app/data/container-build/cerc-pocket/build.sh create mode 100644 app/data/stacks/fixturenet-pocket/README.md create mode 100644 app/data/stacks/fixturenet-pocket/stack.yml diff --git a/app/data/compose/docker-compose-fixturenet-pocket.yml b/app/data/compose/docker-compose-fixturenet-pocket.yml new file mode 100644 index 00000000..88d34f91 --- /dev/null +++ b/app/data/compose/docker-compose-fixturenet-pocket.yml @@ -0,0 +1,18 @@ +version: "3.2" +services: + pocket: + restart: unless-stopped + image: cerc/pocket:local + # command: ["sh", "/docker-entrypoint-scripts.d/create-fixturenet.sh"] + entrypoint: ["sh", "/docker-entrypoint-scripts.d/create-fixturenet.sh"] + volumes: + # TODO: look at folding these scripts into the container + - ../config/fixturenet-pocket/create-fixturenet.sh:/docker-entrypoint-scripts.d/create-fixturenet.sh + - ../config/fixturenet-pocket/chains.json:/home/app/pocket-configs/chains.json + - ../config/fixturenet-pocket/genesis.json:/home/app/pocket-configs/genesis.json + ports: + - "8081:8081" # pocket relay rpc +networks: + net1: + name: fixturenet-eth_default + external: true diff --git a/app/data/config/fixturenet-pocket/chains.json b/app/data/config/fixturenet-pocket/chains.json new file mode 100755 index 00000000..3045620a --- /dev/null +++ b/app/data/config/fixturenet-pocket/chains.json @@ -0,0 +1,18 @@ +[ + { + "id": "0001", + "url": "http://127.0.0.1:8081/", + "basic_auth": { + "username": "", + "password": "" + } + }, + { + "id": "0021", + "url": "http://fixturenet-eth-geth-1:8545/", + "basic_auth": { + "username": "", + "password": "" + } + } +] diff --git a/app/data/config/fixturenet-pocket/create-fixturenet.sh b/app/data/config/fixturenet-pocket/create-fixturenet.sh new file mode 100644 index 00000000..4696749f --- /dev/null +++ b/app/data/config/fixturenet-pocket/create-fixturenet.sh @@ -0,0 +1,65 @@ +#!/bin/bash + +# TODO: we should have a mechanism to bundle it inside the container rather than link from here +# at deploy time. + +CHAINID="pocketlocal-1" +MONIKER="localtestnet" +SERVICE_URL="http://127.0.0.1:8081" +PASSWORD="mypassword" # wallet password, required by cli + +# check if jq is installed; install if necessary +# command -v jq > /dev/null 2>&1 || { echo >&2 "jq not installed. More info: https://stedolan.github.io/jq/download/"; exit 1; } +if ! command -v jq > /dev/null 2>&1; then + echo "jq not installed, downloading..." + mkdir -p /home/app/bin + wget -O /home/app/bin/jq https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 + chmod +x /home/app/bin/jq + export PATH=$PATH:/home/app/bin +fi + +# remove existing daemon and client +rm -rf ~/.pocket* + +# create a wallet with password "mypassword" and save the address for later +address=$(pocket accounts create --pwd $PASSWORD | awk '/Address:/ {print $2}') + +# set this address as the validator address for the node +pocket accounts set-validator $address --pwd $PASSWORD + +# save the public key for later +pubkey=$(pocket accounts show $address | awk '/Public Key:/ {print $3}') + +# set node's moniker +echo $(pocket util print-configs) | jq '.tendermint_config.Moniker = "'"$MONIKER"'"' | jq . > $HOME/.pocket/config/config.json + +# pocket mainnet has block time of 15 minutes, set closer to 1 minute instead +cat $HOME/.pocket/config/config.json | jq '.tendermint_config.Consensus.TimeoutPropose = 8000000000' | jq . > $HOME/.pocket/config/tmp_config.json && mv $HOME/.pocket/config/tmp_config.json $HOME/.pocket/config/config.json +cat $HOME/.pocket/config/config.json | jq '.tendermint_config.Consensus.TimeoutProposeDelta = 600000000' | jq . > $HOME/.pocket/config/tmp_config.json && mv $HOME/.pocket/config/tmp_config.json $HOME/.pocket/config/config.json +cat $HOME/.pocket/config/config.json | jq '.tendermint_config.Consensus.TimeoutPrevote = 4000000000' | jq . > $HOME/.pocket/config/tmp_config.json && mv $HOME/.pocket/config/tmp_config.json $HOME/.pocket/config/config.json +cat $HOME/.pocket/config/config.json | jq '.tendermint_config.Consensus.TimeoutPrevoteDelta = 600000000' | jq . > $HOME/.pocket/config/tmp_config.json && mv $HOME/.pocket/config/tmp_config.json $HOME/.pocket/config/config.json +cat $HOME/.pocket/config/config.json | jq '.tendermint_config.Consensus.TimeoutPrecommit = 4000000000' | jq . > $HOME/.pocket/config/tmp_config.json && mv $HOME/.pocket/config/tmp_config.json $HOME/.pocket/config/config.json +cat $HOME/.pocket/config/config.json | jq '.tendermint_config.Consensus.TimeoutPrecommitDelta = 6000000006' | jq . > $HOME/.pocket/config/tmp_config.json && mv $HOME/.pocket/config/tmp_config.json $HOME/.pocket/config/config.json +cat $HOME/.pocket/config/config.json | jq '.tendermint_config.Consensus.TimeoutCommit = 52000000000' | jq . > $HOME/.pocket/config/tmp_config.json && mv $HOME/.pocket/config/tmp_config.json $HOME/.pocket/config/config.json +cat $HOME/.pocket/config/config.json | jq '.tendermint_config.Consensus.CreateEmptyBlocksInterval = 60000000000' | jq . > $HOME/.pocket/config/tmp_config.json && mv $HOME/.pocket/config/tmp_config.json $HOME/.pocket/config/config.json +cat $HOME/.pocket/config/config.json | jq '.tendermint_config.Consensus.PeerGossipSleepDuration = 2000000000' | jq . > $HOME/.pocket/config/tmp_config.json && mv $HOME/.pocket/config/tmp_config.json $HOME/.pocket/config/config.json +cat $HOME/.pocket/config/config.json | jq '.tendermint_config.Consensus.PeerQueryMaj23SleepDuration = 1200000000' | jq . > $HOME/.pocket/config/tmp_config.json && mv $HOME/.pocket/config/tmp_config.json $HOME/.pocket/config/config.json + +# include genesis.json and chains.json +cp $HOME/pocket-configs/genesis.json $HOME/.pocket/config/genesis.json +cp $HOME/pocket-configs/chains.json $HOME/.pocket/config/chains.json + +# set chain-id and add node to genesis.json as a validator +cat $HOME/.pocket/config/genesis.json | jq '.chain_id="'"$CHAINID"'"' > $HOME/.pocket/config/tmp_genesis.json && mv $HOME/.pocket/config/tmp_genesis.json $HOME/.pocket/config/genesis.json +cat $HOME/.pocket/config/genesis.json | jq '.app_state.auth.accounts[0].value.address="'"$address"'"' > $HOME/.pocket/config/tmp_genesis.json && mv $HOME/.pocket/config/tmp_genesis.json $HOME/.pocket/config/genesis.json +cat $HOME/.pocket/config/genesis.json | jq '.app_state.auth.accounts[0].value.public_key.value="'"$pubkey"'"' > $HOME/.pocket/config/tmp_genesis.json && mv $HOME/.pocket/config/tmp_genesis.json $HOME/.pocket/config/genesis.json +cat $HOME/.pocket/config/genesis.json | jq '.app_state.pos.validators[0].address="'"$address"'"' > $HOME/.pocket/config/tmp_genesis.json && mv $HOME/.pocket/config/tmp_genesis.json $HOME/.pocket/config/genesis.json +cat $HOME/.pocket/config/genesis.json | jq '.app_state.pos.validators[0].public_key="'"$pubkey"'"' > $HOME/.pocket/config/tmp_genesis.json && mv $HOME/.pocket/config/tmp_genesis.json $HOME/.pocket/config/genesis.json +cat $HOME/.pocket/config/genesis.json | jq '.app_state.pos.validators[0].service_url="'"$SERVICE_URL"'"' > $HOME/.pocket/config/tmp_genesis.json && mv $HOME/.pocket/config/tmp_genesis.json $HOME/.pocket/config/genesis.json + +# if [[ $1 == "pending" ]]; then +# echo "pending mode is on, please wait for the first block committed." +# fi + +# Start the node +pocket start --simulateRelay diff --git a/app/data/config/fixturenet-pocket/genesis.json b/app/data/config/fixturenet-pocket/genesis.json new file mode 100644 index 00000000..4d92d5a6 --- /dev/null +++ b/app/data/config/fixturenet-pocket/genesis.json @@ -0,0 +1,272 @@ +{ + "genesis_time": "2020-07-28T15:00:00.000000Z", + "chain_id": "testnet", + "consensus_params": { + "block": { + "max_bytes": "4000000", + "max_gas": "-1", + "time_iota_ms": "1" + }, + "evidence": { + "max_age": "120000000000" + }, + "validator": { + "pub_key_types": [ + "ed25519" + ] + } + }, + "app_hash": "", + "app_state": { + "application": { + "params": { + "unstaking_time": "1814000000000000", + "max_applications": "9223372036854775807", + "app_stake_minimum": "1000000", + "base_relays_per_pokt": "167", + "stability_adjustment": "0", + "participation_rate_on": false, + "maximum_chains": "15" + }, + "applications": [], + "exported": false + }, + "auth": { + "params": { + "max_memo_characters": "75", + "tx_sig_limit": "8", + "fee_multipliers": { + "fee_multiplier": [], + "default": "1" + } + }, + "accounts": [ + { + "type": "posmint/Account", + "value": { + "address": "!validator-address", + "coins": [ + { + "amount": "0", + "denom": "upokt" + } + ], + "public_key": { + "type": "crypto/ed25519_public_key", + "value": "!validator-pubkey" + } + } + } + ], + "supply": [] + }, + "gov": { + "params": { + "acl": [ + { + "acl_key": "application/ApplicationStakeMinimum", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "application/AppUnstakingTime", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "application/BaseRelaysPerPOKT", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "application/MaxApplications", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "application/MaximumChains", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "application/ParticipationRateOn", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "application/StabilityAdjustment", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "auth/MaxMemoCharacters", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "auth/TxSigLimit", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "gov/acl", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "gov/daoOwner", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "gov/upgrade", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pocketcore/ClaimExpiration", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "auth/FeeMultipliers", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pocketcore/ReplayAttackBurnMultiplier", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/ProposerPercentage", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pocketcore/ClaimSubmissionWindow", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pocketcore/MinimumNumberOfProofs", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pocketcore/SessionNodeCount", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pocketcore/SupportedBlockchains", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/BlocksPerSession", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/DAOAllocation", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/DowntimeJailDuration", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/MaxEvidenceAge", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/MaximumChains", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/MaxJailedBlocks", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/MaxValidators", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/MinSignedPerWindow", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/RelaysToTokensMultiplier", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/SignedBlocksWindow", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/SlashFractionDoubleSign", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/SlashFractionDowntime", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/StakeDenom", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/StakeMinimum", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + }, + { + "acl_key": "pos/UnstakingTime", + "address": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4" + } + ], + "dao_owner": "a83172b67b5ffbfcb8acb95acc0fd0466a9d4bc4", + "upgrade": { + "Height": "0", + "Version": "0" + } + }, + "DAO_Tokens": "50000000000000" + }, + "pos": { + "params": { + "relays_to_tokens_multiplier": "10000", + "unstaking_time": "1814000000000000", + "max_validators": "5000", + "stake_denom": "upokt", + "stake_minimum": "15000000000", + "session_block_frequency": "4", + "dao_allocation": "10", + "proposer_allocation": "1", + "maximum_chains": "15", + "max_jailed_blocks": "37960", + "max_evidence_age": "120000000000", + "signed_blocks_window": "10", + "min_signed_per_window": "0.60", + "downtime_jail_duration": "3600000000000", + "slash_fraction_double_sign": "0.05", + "slash_fraction_downtime": "0.000001" + }, + "prevState_total_power": "0", + "prevState_validator_powers": null, + "validators": [ + { + "address": "!validator-address", + "public_key": "!validator-pubkey", + "jailed": false, + "status": 2, + "tokens": "5000000000000", + "service_url": "!validator-url", + "chains": [ + "0001", + "0021" + ], + "unstaking_time": "2021-05-15T00:00:00Z" + } + ], + "exported": false, + "signing_infos": {}, + "missed_blocks": {}, + "previous_proposer": "" + }, + "pocketcore": { + "params": { + "session_node_count": "5", + "proof_waiting_period": "3", + "supported_blockchains": [ + "0001", + "0021" + ], + "claim_expiration": "120", + "replay_attack_burn_multiplier": "3", + "minimum_number_of_proofs": "10" + }, + "receipts": null, + "claims": null + } + } +} \ No newline at end of file diff --git a/app/data/container-build/cerc-pocket/build.sh b/app/data/container-build/cerc-pocket/build.sh new file mode 100755 index 00000000..1f59a8f0 --- /dev/null +++ b/app/data/container-build/cerc-pocket/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +# Build cerc/pocket +docker build -t cerc/pocket:local ${CERC_REPO_BASE_DIR}/pocket-core-deployments/docker diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index 0caea48a..0fe2be5c 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -36,3 +36,4 @@ cerc/optimism-l2geth cerc/optimism-op-batcher cerc/optimism-op-node cerc/optimism-op-proposer +cerc/pocket diff --git a/app/data/pod-list.txt b/app/data/pod-list.txt index f24c9ed0..a3ae8f44 100644 --- a/app/data/pod-list.txt +++ b/app/data/pod-list.txt @@ -24,3 +24,4 @@ tx-spammer kubo foundry fixturenet-optimism +fixturenet-pocket diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index 0d808d68..438b9bbb 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -27,3 +27,5 @@ lirewine/sdk telackey/act_runner ethereum-optimism/op-geth ethereum-optimism/optimism +pokt-network/pocket-core +pokt-network/pocket-core-deployments diff --git a/app/data/stacks/fixturenet-pocket/README.md b/app/data/stacks/fixturenet-pocket/README.md new file mode 100644 index 00000000..b29520c8 --- /dev/null +++ b/app/data/stacks/fixturenet-pocket/README.md @@ -0,0 +1,59 @@ +# Pocket Fixturenet + +Instructions for deploying a local single-node Pocket chain alongside a geth + lighthouse blockchain "fixturenet" for development and testing purposes using laconic-stack-orchestrator. + +## 1. Build Laconic Stack Orchestrator +Build this fork of Laconic Stack Orchestrator which includes the fixturenet-pocket stack: +``` +$ scripts/build_shiv_package.sh +$ cd package +$ mv laconic-so-{version} /usr/local/bin/laconic-so # Or move laconic-so to ~/bin or your favorite on-path directory +``` + +## 2. Clone required repositories +``` +$ laconic-so --stack fixturenet-pocket setup-repositories +``` +## 3. Build the stack's containers +``` +$ laconic-so --stack fixturenet-pocket build-containers +``` +## 4. Deploy the stack +``` +$ laconic-so --stack fixturenet-pocket deploy up +``` +It may take up to 10 minutes for the Eth Fixturenet to fully come online and start producing blocks. +## 5. Check status +**Eth Fixturenet:** +``` +$ laconic-so --stack fixturenet-pocket deploy exec fixturenet-eth-bootnode-lighthouse /scripts/status-internal.sh +Waiting for geth to generate DAG.... done +Waiting for beacon phase0.... done +Waiting for beacon altair.... done +Waiting for beacon bellatrix pre-merge.... done +Waiting for beacon bellatrix merge.... done +``` +**Pocket node:** +``` +$ laconic-so --stack fixturenet-pocket deploy exec pocket "pocket query height" +2023/04/20 08:07:46 Initializing Pocket Datadir +2023/04/20 08:07:46 datadir = /home/app/.pocket +http://localhost:8081/v1/query/height +{ + "height": 4 +} +``` +or +``` +$ laconic-so --stack fixturenet-pocket deploy logs pocket +``` +## 6. Send a relay request to Pocket node +The Pocket node serves relay requests at `http://localhost:8081/v1/client/sim` +**Example request:** +``` +$ curl -X POST --data '{"relay_network_id":"0021","payload":{"data":"{\"jsonrpc\": \"2.0\",\"id\": 1,\"method\": \"eth_blockNumber\",\"params\": []}","method":"POST","path":"","headers":{}}}' http://localhost:8081/v1/client/sim +``` +**Response:** +``` +"{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":\"0x6fe\"}\n" +``` diff --git a/app/data/stacks/fixturenet-pocket/stack.yml b/app/data/stacks/fixturenet-pocket/stack.yml new file mode 100644 index 00000000..c5491f9a --- /dev/null +++ b/app/data/stacks/fixturenet-pocket/stack.yml @@ -0,0 +1,16 @@ +version: "1.0" +name: fixturenet-pocket +description: "A single node pocket chain that can serve relays from the geth-1 node in eth-fixturenet" +repos: + - cerc-io/go-ethereum + - pokt-network/pocket-core + - pokt-network/pocket-core-deployments # contains the dockerfile +containers: + - cerc/go-ethereum + - cerc/lighthouse + - cerc/fixturenet-eth-geth + - cerc/fixturenet-eth-lighthouse + - cerc/pocket +pods: + - fixturenet-pocket + - fixturenet-eth From 960a24c96bd9ad18739971f0b28d845d1120e06d Mon Sep 17 00:00:00 2001 From: Nabarun Gogoi Date: Thu, 4 May 2023 15:35:04 +0530 Subject: [PATCH 0469/1010] Add stack for azimuth watchers with gateway-server (#379) * Setup gateway-server with watchers * Add js script to merge toml config files * Remove individual watcher configs * Add all azimuth watchers in stack * Fix toml-js install * Use env variables for ipld-eth-server endpoints * Checkout to version tag in azimuth-watcher-ts repo Former-commit-id: 5a94aed7f7e150381c0a49a3bcc5b43763333151 --- .../docker-compose-watcher-azimuth.yml | 304 ++++++++++++++++++ .../watcher-azimuth/gateway-watchers.json | 34 ++ app/data/config/watcher-azimuth/merge-toml.js | 31 ++ .../config/watcher-azimuth/start-server.sh | 27 ++ .../watcher-config-template.toml | 14 + .../config/watcher-azimuth/watcher-params.env | 5 + .../cerc-watcher-azimuth/Dockerfile | 13 + .../cerc-watcher-azimuth/build.sh | 9 + app/data/container-image-list.txt | 1 + app/data/pod-list.txt | 1 + app/data/repository-list.txt | 1 + app/data/stacks/azimuth/README.md | 72 +++++ app/data/stacks/azimuth/stack.yml | 8 + 13 files changed, 520 insertions(+) create mode 100644 app/data/compose/docker-compose-watcher-azimuth.yml create mode 100644 app/data/config/watcher-azimuth/gateway-watchers.json create mode 100644 app/data/config/watcher-azimuth/merge-toml.js create mode 100755 app/data/config/watcher-azimuth/start-server.sh create mode 100644 app/data/config/watcher-azimuth/watcher-config-template.toml create mode 100644 app/data/config/watcher-azimuth/watcher-params.env create mode 100644 app/data/container-build/cerc-watcher-azimuth/Dockerfile create mode 100755 app/data/container-build/cerc-watcher-azimuth/build.sh create mode 100644 app/data/stacks/azimuth/README.md create mode 100644 app/data/stacks/azimuth/stack.yml diff --git a/app/data/compose/docker-compose-watcher-azimuth.yml b/app/data/compose/docker-compose-watcher-azimuth.yml new file mode 100644 index 00000000..327c77fc --- /dev/null +++ b/app/data/compose/docker-compose-watcher-azimuth.yml @@ -0,0 +1,304 @@ +version: '3.2' + +services: + # Starts the PostgreSQL database for watchers + watcher-db: + restart: unless-stopped + image: postgres:14-alpine + environment: + - POSTGRES_USER=vdbm + - POSTGRES_MULTIPLE_DATABASES=azimuth-watcher,azimuth-watcher-job-queue,censures-watcher,censures-watcher-job-queue,claims-watcher,claims-watcher-job-queue,conditional-star-release-watcher,conditional-star-release-watcher-job-queue,delegated-sending-watcher,delegated-sending-watcher-job-queue,ecliptic-watcher,ecliptic-watcher-job-queue,linear-star-release-watcher,linear-star-release-watcher-job-queue,polls-watcher,polls-watcher-job-queue + - POSTGRES_EXTENSION=azimuth-watcher-job-queue:pgcrypto,censures-watcher-job-queue:pgcrypto,claims-watcher-job-queue:pgcrypto,conditional-star-release-watcher-job-queue:pgcrypto,delegated-sending-watcher-job-queue:pgcrypto,ecliptic-watcher-job-queue:pgcrypto,linear-star-release-watcher-job-queue:pgcrypto,polls-watcher-job-queue:pgcrypto, + - POSTGRES_PASSWORD=password + volumes: + - ../config/postgresql/multiple-postgressql-databases.sh:/docker-entrypoint-initdb.d/multiple-postgressql-databases.sh + - watcher_db_data:/var/lib/postgresql/data + ports: + - "0.0.0.0:15432:5432" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "5432"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 10s + + # Starts the azimuth-watcher server + azimuth-watcher-server: + image: cerc/watcher-azimuth:local + restart: unless-stopped + depends_on: + watcher-db: + condition: service_healthy + env_file: + - ../config/watcher-azimuth/watcher-params.env + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_IPLD_ETH_RPC: ${CERC_IPLD_ETH_RPC} + CERC_IPLD_ETH_GQL: ${CERC_IPLD_ETH_GQL} + working_dir: /app/packages/azimuth-watcher + command: "./start-server.sh" + volumes: + - ../config/watcher-azimuth/watcher-config-template.toml:/app/packages/azimuth-watcher/environments/watcher-config-template.toml + - ../config/watcher-azimuth/merge-toml.js:/app/packages/azimuth-watcher/merge-toml.js + - ../config/watcher-azimuth/start-server.sh:/app/packages/azimuth-watcher/start-server.sh + ports: + - "3001" + healthcheck: + test: ["CMD", "nc", "-vz", "localhost", "3001"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s + extra_hosts: + - "host.docker.internal:host-gateway" + + # Starts the censures-watcher server + censures-watcher-server: + image: cerc/watcher-azimuth:local + restart: unless-stopped + depends_on: + watcher-db: + condition: service_healthy + env_file: + - ../config/watcher-azimuth/watcher-params.env + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_IPLD_ETH_RPC: ${CERC_IPLD_ETH_RPC} + CERC_IPLD_ETH_GQL: ${CERC_IPLD_ETH_GQL} + working_dir: /app/packages/censures-watcher + command: "./start-server.sh" + volumes: + - ../config/watcher-azimuth/watcher-config-template.toml:/app/packages/censures-watcher/environments/watcher-config-template.toml + - ../config/watcher-azimuth/merge-toml.js:/app/packages/censures-watcher/merge-toml.js + - ../config/watcher-azimuth/start-server.sh:/app/packages/censures-watcher/start-server.sh + ports: + - "3002" + healthcheck: + test: ["CMD", "nc", "-vz", "localhost", "3002"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s + extra_hosts: + - "host.docker.internal:host-gateway" + + # Starts the claims-watcher server + claims-watcher-server: + image: cerc/watcher-azimuth:local + restart: unless-stopped + depends_on: + watcher-db: + condition: service_healthy + env_file: + - ../config/watcher-azimuth/watcher-params.env + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_IPLD_ETH_RPC: ${CERC_IPLD_ETH_RPC} + CERC_IPLD_ETH_GQL: ${CERC_IPLD_ETH_GQL} + working_dir: /app/packages/claims-watcher + command: "./start-server.sh" + volumes: + - ../config/watcher-azimuth/watcher-config-template.toml:/app/packages/claims-watcher/environments/watcher-config-template.toml + - ../config/watcher-azimuth/merge-toml.js:/app/packages/claims-watcher/merge-toml.js + - ../config/watcher-azimuth/start-server.sh:/app/packages/claims-watcher/start-server.sh + ports: + - "3003" + healthcheck: + test: ["CMD", "nc", "-vz", "localhost", "3003"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s + extra_hosts: + - "host.docker.internal:host-gateway" + + # Starts the conditional-star-release-watcher server + conditional-star-release-watcher-server: + image: cerc/watcher-azimuth:local + restart: unless-stopped + depends_on: + watcher-db: + condition: service_healthy + env_file: + - ../config/watcher-azimuth/watcher-params.env + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_IPLD_ETH_RPC: ${CERC_IPLD_ETH_RPC} + CERC_IPLD_ETH_GQL: ${CERC_IPLD_ETH_GQL} + working_dir: /app/packages/conditional-star-release-watcher + command: "./start-server.sh" + volumes: + - ../config/watcher-azimuth/watcher-config-template.toml:/app/packages/conditional-star-release-watcher/environments/watcher-config-template.toml + - ../config/watcher-azimuth/merge-toml.js:/app/packages/conditional-star-release-watcher/merge-toml.js + - ../config/watcher-azimuth/start-server.sh:/app/packages/conditional-star-release-watcher/start-server.sh + ports: + - "3004" + healthcheck: + test: ["CMD", "nc", "-vz", "localhost", "3004"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s + extra_hosts: + - "host.docker.internal:host-gateway" + + # Starts the delegated-sending-watcher server + delegated-sending-watcher-server: + image: cerc/watcher-azimuth:local + restart: unless-stopped + depends_on: + watcher-db: + condition: service_healthy + env_file: + - ../config/watcher-azimuth/watcher-params.env + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_IPLD_ETH_RPC: ${CERC_IPLD_ETH_RPC} + CERC_IPLD_ETH_GQL: ${CERC_IPLD_ETH_GQL} + working_dir: /app/packages/delegated-sending-watcher + command: "./start-server.sh" + volumes: + - ../config/watcher-azimuth/watcher-config-template.toml:/app/packages/delegated-sending-watcher/environments/watcher-config-template.toml + - ../config/watcher-azimuth/merge-toml.js:/app/packages/delegated-sending-watcher/merge-toml.js + - ../config/watcher-azimuth/start-server.sh:/app/packages/delegated-sending-watcher/start-server.sh + ports: + - "3005" + healthcheck: + test: ["CMD", "nc", "-vz", "localhost", "3005"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s + extra_hosts: + - "host.docker.internal:host-gateway" + + # Starts the ecliptic-watcher server + ecliptic-watcher-server: + image: cerc/watcher-azimuth:local + restart: unless-stopped + depends_on: + watcher-db: + condition: service_healthy + env_file: + - ../config/watcher-azimuth/watcher-params.env + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_IPLD_ETH_RPC: ${CERC_IPLD_ETH_RPC} + CERC_IPLD_ETH_GQL: ${CERC_IPLD_ETH_GQL} + working_dir: /app/packages/ecliptic-watcher + command: "./start-server.sh" + volumes: + - ../config/watcher-azimuth/watcher-config-template.toml:/app/packages/ecliptic-watcher/environments/watcher-config-template.toml + - ../config/watcher-azimuth/merge-toml.js:/app/packages/ecliptic-watcher/merge-toml.js + - ../config/watcher-azimuth/start-server.sh:/app/packages/ecliptic-watcher/start-server.sh + ports: + - "3006" + healthcheck: + test: ["CMD", "nc", "-vz", "localhost", "3006"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s + extra_hosts: + - "host.docker.internal:host-gateway" + + # Starts the linear-star-release-watcher server + linear-star-release-watcher-server: + image: cerc/watcher-azimuth:local + restart: unless-stopped + depends_on: + watcher-db: + condition: service_healthy + env_file: + - ../config/watcher-azimuth/watcher-params.env + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_IPLD_ETH_RPC: ${CERC_IPLD_ETH_RPC} + CERC_IPLD_ETH_GQL: ${CERC_IPLD_ETH_GQL} + working_dir: /app/packages/linear-star-release-watcher + command: "./start-server.sh" + volumes: + - ../config/watcher-azimuth/watcher-config-template.toml:/app/packages/linear-star-release-watcher/environments/watcher-config-template.toml + - ../config/watcher-azimuth/merge-toml.js:/app/packages/linear-star-release-watcher/merge-toml.js + - ../config/watcher-azimuth/start-server.sh:/app/packages/linear-star-release-watcher/start-server.sh + ports: + - "3007" + healthcheck: + test: ["CMD", "nc", "-vz", "localhost", "3007"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s + extra_hosts: + - "host.docker.internal:host-gateway" + + # Starts the polls-watcher server + polls-watcher-server: + image: cerc/watcher-azimuth:local + restart: unless-stopped + depends_on: + watcher-db: + condition: service_healthy + env_file: + - ../config/watcher-azimuth/watcher-params.env + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_IPLD_ETH_RPC: ${CERC_IPLD_ETH_RPC} + CERC_IPLD_ETH_GQL: ${CERC_IPLD_ETH_GQL} + working_dir: /app/packages/polls-watcher + command: "./start-server.sh" + volumes: + - ../config/watcher-azimuth/watcher-config-template.toml:/app/packages/polls-watcher/environments/watcher-config-template.toml + - ../config/watcher-azimuth/merge-toml.js:/app/packages/polls-watcher/merge-toml.js + - ../config/watcher-azimuth/start-server.sh:/app/packages/polls-watcher/start-server.sh + ports: + - "3008" + healthcheck: + test: ["CMD", "nc", "-vz", "localhost", "3008"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s + extra_hosts: + - "host.docker.internal:host-gateway" + + # Starts the gateway-server for proxying queries + gateway-server: + image: cerc/watcher-azimuth:local + restart: unless-stopped + depends_on: + azimuth-watcher-server: + condition: service_healthy + censures-watcher-server: + condition: service_healthy + claims-watcher-server: + condition: service_healthy + conditional-star-release-watcher-server: + condition: service_healthy + delegated-sending-watcher-server: + condition: service_healthy + ecliptic-watcher-server: + condition: service_healthy + linear-star-release-watcher-server: + condition: service_healthy + polls-watcher-server: + condition: service_healthy + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + working_dir: /app/packages/gateway-server + command: "yarn server" + volumes: + - ../config/watcher-azimuth/gateway-watchers.json:/app/packages/gateway-server/dist/watchers.json + ports: + - "0.0.0.0:4000:4000" + healthcheck: + test: ["CMD", "nc", "-vz", "localhost", "4000"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s + extra_hosts: + - "host.docker.internal:host-gateway" + +volumes: + watcher_db_data: diff --git a/app/data/config/watcher-azimuth/gateway-watchers.json b/app/data/config/watcher-azimuth/gateway-watchers.json new file mode 100644 index 00000000..40687556 --- /dev/null +++ b/app/data/config/watcher-azimuth/gateway-watchers.json @@ -0,0 +1,34 @@ +[ + { + "endpoint": "http://azimuth-watcher-server:3001/graphql", + "prefix": "azimuth" + }, + { + "endpoint": "http://censures-watcher-server:3002/graphql", + "prefix": "censures" + }, + { + "endpoint": "http://claims-watcher-server:3003/graphql", + "prefix": "claims" + }, + { + "endpoint": "http://conditional-star-release-watcher-server:3004/graphql", + "prefix": "conditionalStarRelease" + }, + { + "endpoint": "http://delegated-sending-watcher-server:3005/graphql", + "prefix": "delegatedSending" + }, + { + "endpoint": "http://ecliptic-watcher-server:3006/graphql", + "prefix": "ecliptic" + }, + { + "endpoint": "http://linear-star-release-watcher-server:3007/graphql", + "prefix": "linearStarRelease" + }, + { + "endpoint": "http://polls-watcher-server:3008/graphql", + "prefix": "polls" + } +] diff --git a/app/data/config/watcher-azimuth/merge-toml.js b/app/data/config/watcher-azimuth/merge-toml.js new file mode 100644 index 00000000..9224baec --- /dev/null +++ b/app/data/config/watcher-azimuth/merge-toml.js @@ -0,0 +1,31 @@ +const fs = require('fs'); +const tomlJS = require('toml-js'); +const toml = require('toml'); +const { merge } = require('lodash') + +const main = () => { + const overrideConfigString = fs.readFileSync('environments/watcher-config.toml', 'utf-8'); + const configString = fs.readFileSync('environments/local.toml', 'utf-8'); + const overrideConfig = toml.parse(overrideConfigString) + const config = toml.parse(configString) + + // Merge configs + const updatedConfig = merge(config, overrideConfig); + + // Form dbConnectionString for jobQueue DB + const parts = config.jobQueue.dbConnectionString.split("://"); + const credsAndDB = parts[1].split("@"); + const creds = credsAndDB[0].split(":"); + creds[0] = overrideConfig.database.username; + creds[1] = overrideConfig.database.password; + credsAndDB[0] = creds.join(":"); + const dbName = credsAndDB[1].split("/")[1] + credsAndDB[1] = [overrideConfig.database.host, dbName].join("/"); + parts[1] = credsAndDB.join("@"); + + updatedConfig.jobQueue.dbConnectionString = parts.join("://"); + + fs.writeFileSync('environments/local.toml', tomlJS.dump(updatedConfig), 'utf-8'); +} + +main(); diff --git a/app/data/config/watcher-azimuth/start-server.sh b/app/data/config/watcher-azimuth/start-server.sh new file mode 100755 index 00000000..c84c58d0 --- /dev/null +++ b/app/data/config/watcher-azimuth/start-server.sh @@ -0,0 +1,27 @@ +#!/bin/sh +set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi + +CERC_IPLD_ETH_RPC="${CERC_IPLD_ETH_RPC:-${DEFAULT_CERC_IPLD_ETH_RPC}}" +CERC_IPLD_ETH_GQL="${CERC_IPLD_ETH_GQL:-${DEFAULT_CERC_IPLD_ETH_GQL}}" + +echo "Using IPLD ETH RPC endpoint ${CERC_IPLD_ETH_RPC}" +echo "Using IPLD GQL endpoint ${CERC_IPLD_ETH_GQL}" + +# Replace env variables in template TOML file +# Read in the config template TOML file and modify it +WATCHER_CONFIG_TEMPLATE=$(cat environments/watcher-config-template.toml) +WATCHER_CONFIG=$(echo "$WATCHER_CONFIG_TEMPLATE" | \ + sed -E "s|REPLACE_WITH_CERC_IPLD_ETH_RPC|${CERC_IPLD_ETH_RPC}|g; \ + s|REPLACE_WITH_CERC_IPLD_ETH_GQL|${CERC_IPLD_ETH_GQL}| ") + +# Write the modified content to a new file +echo "$WATCHER_CONFIG" > environments/watcher-config.toml + +# Merge SO watcher config with existing config file +node merge-toml.js + +echo 'yarn server' +yarn server diff --git a/app/data/config/watcher-azimuth/watcher-config-template.toml b/app/data/config/watcher-azimuth/watcher-config-template.toml new file mode 100644 index 00000000..1a4616fc --- /dev/null +++ b/app/data/config/watcher-azimuth/watcher-config-template.toml @@ -0,0 +1,14 @@ +[server] + host = "0.0.0.0" + maxSimultaneousRequests = -1 + +[database] + host = "watcher-db" + port = 5432 + username = "vdbm" + password = "password" + +[upstream] + [upstream.ethServer] + gqlApiEndpoint = "REPLACE_WITH_CERC_IPLD_ETH_GQL" + rpcProviderEndpoint = "REPLACE_WITH_CERC_IPLD_ETH_RPC" diff --git a/app/data/config/watcher-azimuth/watcher-params.env b/app/data/config/watcher-azimuth/watcher-params.env new file mode 100644 index 00000000..8fcdc2d6 --- /dev/null +++ b/app/data/config/watcher-azimuth/watcher-params.env @@ -0,0 +1,5 @@ +# Defaults + +# ipld-eth-server endpoints +DEFAULT_CERC_IPLD_ETH_RPC= +DEFAULT_CERC_IPLD_ETH_GQL= diff --git a/app/data/container-build/cerc-watcher-azimuth/Dockerfile b/app/data/container-build/cerc-watcher-azimuth/Dockerfile new file mode 100644 index 00000000..eaf717aa --- /dev/null +++ b/app/data/container-build/cerc-watcher-azimuth/Dockerfile @@ -0,0 +1,13 @@ +FROM node:18.16.0-alpine3.16 + +RUN apk --update --no-cache add git python3 alpine-sdk + +WORKDIR /app + +COPY . . + +RUN echo "Building azimuth-watcher-ts" && \ + yarn && yarn build + +RUN echo "Install toml-js to update watcher config files" && \ + yarn add --dev --ignore-workspace-root-check toml-js diff --git a/app/data/container-build/cerc-watcher-azimuth/build.sh b/app/data/container-build/cerc-watcher-azimuth/build.sh new file mode 100755 index 00000000..522f985b --- /dev/null +++ b/app/data/container-build/cerc-watcher-azimuth/build.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +# Build cerc/watcher-azimuth + +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t cerc/watcher-azimuth:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/azimuth-watcher-ts diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index 0fe2be5c..ba0eaf23 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -37,3 +37,4 @@ cerc/optimism-op-batcher cerc/optimism-op-node cerc/optimism-op-proposer cerc/pocket +cerc/watcher-azimuth diff --git a/app/data/pod-list.txt b/app/data/pod-list.txt index a3ae8f44..34d66ba6 100644 --- a/app/data/pod-list.txt +++ b/app/data/pod-list.txt @@ -25,3 +25,4 @@ kubo foundry fixturenet-optimism fixturenet-pocket +watcher-azimuth diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index 438b9bbb..7035de2a 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -29,3 +29,4 @@ ethereum-optimism/op-geth ethereum-optimism/optimism pokt-network/pocket-core pokt-network/pocket-core-deployments +cerc-io/azimuth-watcher-ts diff --git a/app/data/stacks/azimuth/README.md b/app/data/stacks/azimuth/README.md new file mode 100644 index 00000000..d3e377da --- /dev/null +++ b/app/data/stacks/azimuth/README.md @@ -0,0 +1,72 @@ +# Azimuth Watcher + +Instructions to setup and deploy Azimuth Watcher stack + +## Setup + +Prerequisite: ipld-eth-server RPC and GQL endpoints + +Clone required repositories: + +```bash +laconic-so --stack azimuth setup-repositories +``` + +NOTE: If the repository already exists and checked out to a different version, `setup-repositories` command will throw an error. +For getting around this, the `azimuth-watcher-ts` repository can be removed and then run the command. + +Checkout to the required versions and branches in repos + +```bash +# azimuth-watcher-ts +cd ~/cerc/azimuth-watcher-ts +git checkout v0.1.0 +``` + +Build the container images: + +```bash +laconic-so --stack azimuth build-containers +``` + +This should create the required docker images in the local image registry. + +### Configuration + +* Create and update an env file to be used in the next step: + + ```bash + # External ipld-eth-server endpoints + CERC_IPLD_ETH_RPC= + CERC_IPLD_ETH_GQL= + ``` + +* NOTE: If ipld-eth-server is running on the host machine, use `host.docker.internal` as the hostname to access host ports + +### Deploy the stack + +* Deploy the containers: + + ```bash + laconic-so --stack azimuth deploy-system --env-file up + ``` + +* List and check the health status of all the containers using `docker ps` and wait for them to be `healthy` + +## Clean up + +Stop all the services running in background run: + +```bash +laconic-so --stack azimuth deploy-system down +``` + +Clear volumes created by this stack: + +```bash +# List all relevant volumes +docker volume ls -q --filter "name=.*watcher_db_data" + +# Remove all the listed volumes +docker volume rm $(docker volume ls -q --filter "name=.*watcher_db_data") +``` diff --git a/app/data/stacks/azimuth/stack.yml b/app/data/stacks/azimuth/stack.yml new file mode 100644 index 00000000..fc3c8473 --- /dev/null +++ b/app/data/stacks/azimuth/stack.yml @@ -0,0 +1,8 @@ +version: "1.0" +name: azimuth +repos: + - cerc-io/azimuth-watcher-ts +containers: + - cerc/watcher-azimuth +pods: + - watcher-azimuth From a9558aa8748a7531f9971e5d99de5a8a578ab608 Mon Sep 17 00:00:00 2001 From: Marten O'Grady <35665595+Escape613@users.noreply.github.com> Date: Thu, 4 May 2023 09:16:14 -0400 Subject: [PATCH 0470/1010] Update CONTRIBUTING.md Missing ")" in Step #1 of INSTALL Former-commit-id: f1bc8aa4e13fa4111991ed132930dba9e13562a8 --- docs/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 633fc30f..89d9a748 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -26,7 +26,7 @@ In addition to the pre-requisites listed in the [README](/README.md), the follow 1. Clone this repository: ``` - $ git clone (https://github.com/cerc-io/stack-orchestrator.git + $ git clone https://github.com/cerc-io/stack-orchestrator.git ``` 2. Enter the project directory: From b1b1464205cc665fdc949737c8fc3141bdabf057 Mon Sep 17 00:00:00 2001 From: Marten O'Grady <35665595+Escape613@users.noreply.github.com> Date: Thu, 4 May 2023 09:47:59 -0400 Subject: [PATCH 0471/1010] Update CONTRIBUTING.md (#383) Wrong output for Step 3 in Build A ZipApp. Fixed it to what I just experienced while smoke testing. Former-commit-id: bce604e4bb2823632adf809a1cadd228e5c017c3 --- docs/CONTRIBUTING.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 89d9a748..39b294fb 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -87,20 +87,27 @@ Use shiv to build a single file Python executable zip archive of laconic-so: ``` $ cp stack-orchetrator/laconic-so ~/bin $ laconic-so - Usage: python -m laconic-so [OPTIONS] COMMAND [ARGS]... + Usage: laconic-so [OPTIONS] COMMAND [ARGS]... Laconic Stack Orchestrator Options: + --stack TEXT specify a stack to build/deploy --quiet --verbose --dry-run - -h, --help Show this message and exit. + --local-stack + --debug + --continue-on-error + -h, --help Show this message and exit. Commands: build-containers build the set of containers required for a complete... + build-npms build the set of npm packages required for a... + deploy deploy a stack deploy-system deploy a stack setup-repositories git clone the set of repositories required to build... + version print tool version ``` For cutting releases, use the [shiv build script](/scripts/build_shiv_package.sh). From 8add4671c0a6b14b9c54eb096e209512283f484f Mon Sep 17 00:00:00 2001 From: Nabarun Gogoi Date: Fri, 5 May 2023 13:32:19 +0530 Subject: [PATCH 0472/1010] Add environment variables for multiaddrs blacklist (#381) * Add env variable for web apps config denyMultiaddrs * Add watcher config option for blacklisted multiaddrs * Update package versions * Use provided domain for relay multiaddr in peer config * Change delimeter while replacing deny multiaddrs list --------- Co-authored-by: prathamesh0 Former-commit-id: b678a3ecb4b318ce26a39fd42f3ed160fd55041e --- app/data/compose/docker-compose-mobymask-app.yml | 2 ++ app/data/compose/docker-compose-peer-test-app.yml | 1 + .../compose/docker-compose-watcher-mobymask-v2.yml | 1 + .../config/watcher-mobymask-v2/mobymask-app-start.sh | 2 ++ .../config/watcher-mobymask-v2/mobymask-params.env | 3 +++ app/data/config/watcher-mobymask-v2/start-server.sh | 10 +++++++++- .../config/watcher-mobymask-v2/test-app-config.json | 1 + app/data/config/watcher-mobymask-v2/test-app-start.sh | 2 ++ .../watcher-mobymask-v2/watcher-config-template.toml | 2 ++ app/data/container-build/cerc-mobymask-ui/Dockerfile | 4 ++-- .../cerc-mobymask-ui/apply-webapp-config.sh | 2 +- app/data/container-build/cerc-react-peer/Dockerfile | 2 +- .../cerc-react-peer/apply-webapp-config.sh | 2 +- app/data/stacks/mobymask-v2/README.md | 4 ++-- app/data/stacks/mobymask-v2/mobymask-only.md | 11 +++++++---- .../stacks/mobymask-v2/watcher-p2p-network/watcher.md | 4 ++-- app/data/stacks/mobymask-v2/web-apps.md | 3 +++ 17 files changed, 42 insertions(+), 14 deletions(-) diff --git a/app/data/compose/docker-compose-mobymask-app.yml b/app/data/compose/docker-compose-mobymask-app.yml index d43e6b44..7d41264a 100644 --- a/app/data/compose/docker-compose-mobymask-app.yml +++ b/app/data/compose/docker-compose-mobymask-app.yml @@ -13,6 +13,7 @@ services: CERC_DEPLOYED_CONTRACT: ${CERC_DEPLOYED_CONTRACT} CERC_APP_WATCHER_URL: ${CERC_APP_WATCHER_URL} CERC_RELAY_NODES: ${CERC_RELAY_NODES} + CERC_DENY_MULTIADDRS: ${CERC_DENY_MULTIADDRS} CERC_BUILD_DIR: "@cerc-io/mobymask-ui/build" working_dir: /scripts command: ["sh", "mobymask-app-start.sh"] @@ -44,6 +45,7 @@ services: CERC_DEPLOYED_CONTRACT: ${CERC_DEPLOYED_CONTRACT} CERC_APP_WATCHER_URL: ${CERC_APP_WATCHER_URL} CERC_RELAY_NODES: ${CERC_RELAY_NODES} + CERC_DENY_MULTIADDRS: ${CERC_DENY_MULTIADDRS} CERC_BUILD_DIR: "@cerc-io/mobymask-ui-lxdao/build" working_dir: /scripts command: ["sh", "mobymask-app-start.sh"] diff --git a/app/data/compose/docker-compose-peer-test-app.yml b/app/data/compose/docker-compose-peer-test-app.yml index f2a22675..f1f5e475 100644 --- a/app/data/compose/docker-compose-peer-test-app.yml +++ b/app/data/compose/docker-compose-peer-test-app.yml @@ -10,6 +10,7 @@ services: environment: CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} CERC_RELAY_NODES: ${CERC_RELAY_NODES} + CERC_DENY_MULTIADDRS: ${CERC_DENY_MULTIADDRS} command: ["sh", "test-app-start.sh"] volumes: - ../config/wait-for-it.sh:/scripts/wait-for-it.sh diff --git a/app/data/compose/docker-compose-watcher-mobymask-v2.yml b/app/data/compose/docker-compose-watcher-mobymask-v2.yml index 36c5f3f9..0c743670 100644 --- a/app/data/compose/docker-compose-watcher-mobymask-v2.yml +++ b/app/data/compose/docker-compose-watcher-mobymask-v2.yml @@ -83,6 +83,7 @@ services: CERC_L1_ACCOUNTS_CSV_URL: ${CERC_L1_ACCOUNTS_CSV_URL} CERC_PRIVATE_KEY_PEER: ${CERC_PRIVATE_KEY_PEER} CERC_RELAY_PEERS: ${CERC_RELAY_PEERS} + CERC_DENY_MULTIADDRS: ${CERC_DENY_MULTIADDRS} CERC_RELAY_ANNOUNCE_DOMAIN: ${CERC_RELAY_ANNOUNCE_DOMAIN} CERC_ENABLE_PEER_L2_TXS: ${CERC_ENABLE_PEER_L2_TXS} CERC_DEPLOYED_CONTRACT: ${CERC_DEPLOYED_CONTRACT} diff --git a/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh b/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh index 9f343340..6eeb5c1a 100755 --- a/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh +++ b/app/data/config/watcher-mobymask-v2/mobymask-app-start.sh @@ -7,6 +7,7 @@ fi CERC_CHAIN_ID="${CERC_CHAIN_ID:-${DEFAULT_CERC_CHAIN_ID}}" CERC_DEPLOYED_CONTRACT="${CERC_DEPLOYED_CONTRACT:-${DEFAULT_CERC_DEPLOYED_CONTRACT}}" CERC_RELAY_NODES="${CERC_RELAY_NODES:-${DEFAULT_CERC_RELAY_NODES}}" +CERC_DENY_MULTIADDRS="${CERC_DENY_MULTIADDRS:-${DEFAULT_CERC_DENY_MULTIADDRS}}" CERC_APP_WATCHER_URL="${CERC_APP_WATCHER_URL:-${DEFAULT_CERC_APP_WATCHER_URL}}" # If not set (or []), check the mounted volume for relay peer id @@ -37,5 +38,6 @@ yq -n ".address = env(CERC_DEPLOYED_CONTRACT)" > /config/config.yml yq ".watcherUrl = env(CERC_APP_WATCHER_URL)" -i /config/config.yml yq ".chainId = env(CERC_CHAIN_ID)" -i /config/config.yml yq ".relayNodes = strenv(CERC_RELAY_NODES)" -i /config/config.yml +yq ".denyMultiaddrs = strenv(CERC_DENY_MULTIADDRS)" -i /config/config.yml /scripts/start-serving-app.sh diff --git a/app/data/config/watcher-mobymask-v2/mobymask-params.env b/app/data/config/watcher-mobymask-v2/mobymask-params.env index 6d1bf063..39d55016 100644 --- a/app/data/config/watcher-mobymask-v2/mobymask-params.env +++ b/app/data/config/watcher-mobymask-v2/mobymask-params.env @@ -24,3 +24,6 @@ DEFAULT_CERC_CHAIN_ID=42069 # Set of relay nodes to be used by web-apps DEFAULT_CERC_RELAY_NODES=[] + +# Set of multiaddrs to be avoided while dialling +DEFAULT_CERC_DENY_MULTIADDRS=[] diff --git a/app/data/config/watcher-mobymask-v2/start-server.sh b/app/data/config/watcher-mobymask-v2/start-server.sh index b46a7c14..eab8bac2 100755 --- a/app/data/config/watcher-mobymask-v2/start-server.sh +++ b/app/data/config/watcher-mobymask-v2/start-server.sh @@ -8,13 +8,20 @@ CERC_L2_GETH_RPC="${CERC_L2_GETH_RPC:-${DEFAULT_CERC_L2_GETH_RPC}}" CERC_L1_ACCOUNTS_CSV_URL="${CERC_L1_ACCOUNTS_CSV_URL:-${DEFAULT_CERC_L1_ACCOUNTS_CSV_URL}}" CERC_RELAY_PEERS="${CERC_RELAY_PEERS:-${DEFAULT_CERC_RELAY_PEERS}}" +CERC_DENY_MULTIADDRS="${CERC_DENY_MULTIADDRS:-${DEFAULT_CERC_DENY_MULTIADDRS}}" CERC_RELAY_ANNOUNCE_DOMAIN="${CERC_RELAY_ANNOUNCE_DOMAIN:-${DEFAULT_CERC_RELAY_ANNOUNCE_DOMAIN}}" CERC_ENABLE_PEER_L2_TXS="${CERC_ENABLE_PEER_L2_TXS:-${DEFAULT_CERC_ENABLE_PEER_L2_TXS}}" CERC_DEPLOYED_CONTRACT="${CERC_DEPLOYED_CONTRACT:-${DEFAULT_CERC_DEPLOYED_CONTRACT}}" echo "Using L2 RPC endpoint ${CERC_L2_GETH_RPC}" -CERC_RELAY_MULTIADDR="/dns4/mobymask-watcher-server/tcp/9090/ws/p2p/$(jq -r '.id' /app/peers/relay-id.json)" +# Use public domain for relay multiaddr in peer config if specified +# Otherwise, use the docker container's host IP +if [ -n "$CERC_RELAY_ANNOUNCE_DOMAIN" ]; then + CERC_RELAY_MULTIADDR="/dns4/${CERC_RELAY_ANNOUNCE_DOMAIN}/tcp/443/wss/p2p/$(jq -r '.id' /app/peers/relay-id.json)" +else + CERC_RELAY_MULTIADDR="/dns4/mobymask-watcher-server/tcp/9090/ws/p2p/$(jq -r '.id' /app/peers/relay-id.json)" +fi # Use contract address from environment variable or set from config.json in mounted volume if [ -n "$CERC_DEPLOYED_CONTRACT" ]; then @@ -42,6 +49,7 @@ fi WATCHER_CONFIG_TEMPLATE=$(cat environments/watcher-config-template.toml) WATCHER_CONFIG=$(echo "$WATCHER_CONFIG_TEMPLATE" | \ sed -E "s|REPLACE_WITH_CERC_RELAY_PEERS|${CERC_RELAY_PEERS}|g; \ + s|REPLACE_WITH_CERC_DENY_MULTIADDRS|${CERC_DENY_MULTIADDRS}|g; \ s/REPLACE_WITH_CERC_RELAY_ANNOUNCE_DOMAIN/${CERC_RELAY_ANNOUNCE_DOMAIN}/g; \ s|REPLACE_WITH_CERC_RELAY_MULTIADDR|${CERC_RELAY_MULTIADDR}|g; \ s/REPLACE_WITH_CERC_ENABLE_PEER_L2_TXS/${CERC_ENABLE_PEER_L2_TXS}/g; \ diff --git a/app/data/config/watcher-mobymask-v2/test-app-config.json b/app/data/config/watcher-mobymask-v2/test-app-config.json index cce15fd8..a0baf9c6 100644 --- a/app/data/config/watcher-mobymask-v2/test-app-config.json +++ b/app/data/config/watcher-mobymask-v2/test-app-config.json @@ -1,6 +1,7 @@ { "relayNodes": [], "peer": { + "denyMultiaddrs": [], "enableDebugInfo": true } } diff --git a/app/data/config/watcher-mobymask-v2/test-app-start.sh b/app/data/config/watcher-mobymask-v2/test-app-start.sh index 42e4397d..aeeb02d3 100755 --- a/app/data/config/watcher-mobymask-v2/test-app-start.sh +++ b/app/data/config/watcher-mobymask-v2/test-app-start.sh @@ -5,6 +5,7 @@ if [ -n "$CERC_SCRIPT_DEBUG" ]; then fi CERC_RELAY_NODES="${CERC_RELAY_NODES:-${DEFAULT_CERC_RELAY_NODES}}" +CERC_DENY_MULTIADDRS="${CERC_DENY_MULTIADDRS:-${DEFAULT_CERC_DENY_MULTIADDRS}}" # If not set (or []), check the mounted volume for relay peer id if [ -z "$CERC_RELAY_NODES" ] || [ "$CERC_RELAY_NODES" = "[]" ]; then @@ -16,5 +17,6 @@ echo "Using CERC_RELAY_NODES $CERC_RELAY_NODES" # Use yq to create config.yml with environment variables yq -n ".relayNodes = strenv(CERC_RELAY_NODES)" > /config/config.yml +yq ".denyMultiaddrs = strenv(CERC_DENY_MULTIADDRS)" -i /config/config.yml /scripts/start-serving-app.sh diff --git a/app/data/config/watcher-mobymask-v2/watcher-config-template.toml b/app/data/config/watcher-mobymask-v2/watcher-config-template.toml index e6ce0750..5a2c7ce4 100644 --- a/app/data/config/watcher-mobymask-v2/watcher-config-template.toml +++ b/app/data/config/watcher-mobymask-v2/watcher-config-template.toml @@ -27,6 +27,7 @@ host = "0.0.0.0" port = 9090 relayPeers = REPLACE_WITH_CERC_RELAY_PEERS + denyMultiaddrs = REPLACE_WITH_CERC_DENY_MULTIADDRS peerIdFile = './peers/relay-id.json' announce = 'REPLACE_WITH_CERC_RELAY_ANNOUNCE_DOMAIN' enableDebugInfo = true @@ -34,6 +35,7 @@ [server.p2p.peer] relayMultiaddr = 'REPLACE_WITH_CERC_RELAY_MULTIADDR' pubSubTopic = 'mobymask' + denyMultiaddrs = REPLACE_WITH_CERC_DENY_MULTIADDRS peerIdFile = './peers/peer-id.json' enableDebugInfo = true enableL2Txs = REPLACE_WITH_CERC_ENABLE_PEER_L2_TXS diff --git a/app/data/container-build/cerc-mobymask-ui/Dockerfile b/app/data/container-build/cerc-mobymask-ui/Dockerfile index 651d718f..9d4868d2 100644 --- a/app/data/container-build/cerc-mobymask-ui/Dockerfile +++ b/app/data/container-build/cerc-mobymask-ui/Dockerfile @@ -50,9 +50,9 @@ RUN yarn global add http-server # Globally install both versions of the payload web app package # Install old version of MobyMask web app -RUN yarn global add @cerc-io/mobymask-ui@0.1.3 +RUN yarn global add @cerc-io/mobymask-ui@0.1.4 # Install the LXDAO version of MobyMask web app -RUN yarn global add @cerc-io/mobymask-ui-lxdao@npm:@cerc-io/mobymask-ui@0.1.3-lxdao-0.1.1 +RUN yarn global add @cerc-io/mobymask-ui-lxdao@npm:@cerc-io/mobymask-ui@0.1.4-lxdao-0.1.1 # Expose port for http EXPOSE 80 diff --git a/app/data/container-build/cerc-mobymask-ui/apply-webapp-config.sh b/app/data/container-build/cerc-mobymask-ui/apply-webapp-config.sh index 9f32cd23..2779b3a1 100755 --- a/app/data/container-build/cerc-mobymask-ui/apply-webapp-config.sh +++ b/app/data/container-build/cerc-mobymask-ui/apply-webapp-config.sh @@ -33,7 +33,7 @@ do echo "Substituting: ${template_string_to_replace} = ${template_value_to_substitute}" # TODO: Pass keys to be replaced without double quotes - if [[ "$template_string_to_replace" =~ ^${config_prefix}_(relayNodes|chainId)$ ]]; then + if [[ "$template_string_to_replace" =~ ^${config_prefix}_(relayNodes|chainId|denyMultiaddrs)$ ]]; then find ${webapp_files_dir} -type f -exec sed -i 's#"'"${template_string_to_replace}"'"#'"${template_value_to_substitute}"'#g' {} + else # Note: we do not escape our strings, on the expectation they do not container the '#' char. diff --git a/app/data/container-build/cerc-react-peer/Dockerfile b/app/data/container-build/cerc-react-peer/Dockerfile index 191f986b..50670e03 100644 --- a/app/data/container-build/cerc-react-peer/Dockerfile +++ b/app/data/container-build/cerc-react-peer/Dockerfile @@ -21,7 +21,7 @@ RUN mkdir -p /config RUN yarn global add http-server # Globally install the payload web app package -RUN yarn global add @cerc-io/test-app@0.2.33 +RUN yarn global add @cerc-io/test-app@0.2.34 # Expose port for http EXPOSE 80 diff --git a/app/data/container-build/cerc-react-peer/apply-webapp-config.sh b/app/data/container-build/cerc-react-peer/apply-webapp-config.sh index a7f0a28e..59dee869 100755 --- a/app/data/container-build/cerc-react-peer/apply-webapp-config.sh +++ b/app/data/container-build/cerc-react-peer/apply-webapp-config.sh @@ -33,7 +33,7 @@ do echo "Substituting: ${template_string_to_replace} = ${template_value_to_substitute}" # TODO: Pass keys to be replaced without double quotes - if [[ "$template_string_to_replace" == "${config_prefix}_relayNodes" ]]; then + if [[ "$template_string_to_replace" =~ ^${config_prefix}_(relayNodes|denyMultiaddrs)$ ]]; then find ${webapp_files_dir} -type f -exec sed -i 's#"'"${template_string_to_replace}"'"#'"${template_value_to_substitute}"'#g' {} + else # Note: we do not escape our strings, on the expectation they do not container the '#' char. diff --git a/app/data/stacks/mobymask-v2/README.md b/app/data/stacks/mobymask-v2/README.md index 32fdbf60..880b6a35 100644 --- a/app/data/stacks/mobymask-v2/README.md +++ b/app/data/stacks/mobymask-v2/README.md @@ -23,11 +23,11 @@ Checkout to the required versions and branches in repos ```bash # watcher-ts cd ~/cerc/watcher-ts -git checkout v0.2.39 +git checkout v0.2.41 # mobymask-v2-watcher-ts cd ~/cerc/mobymask-v2-watcher-ts -git checkout v0.1.0 +git checkout v0.1.1 # MobyMask cd ~/cerc/MobyMask diff --git a/app/data/stacks/mobymask-v2/mobymask-only.md b/app/data/stacks/mobymask-v2/mobymask-only.md index 4cfb4ecf..01ce0754 100644 --- a/app/data/stacks/mobymask-v2/mobymask-only.md +++ b/app/data/stacks/mobymask-v2/mobymask-only.md @@ -19,11 +19,11 @@ Checkout to the required versions and branches in repos: ```bash # watcher-ts cd ~/cerc/watcher-ts -git checkout v0.2.39 +git checkout v0.2.41 # mobymask-v2-watcher-ts cd ~/cerc/mobymask-v2-watcher-ts -git checkout v0.1.0 +git checkout v0.1.1 # MobyMask cd ~/cerc/MobyMask @@ -67,11 +67,14 @@ Create and update an env file to be used in the next step ([defaults](../../conf # (used for generating a root invite link after deploying the contract) CERC_MOBYMASK_APP_BASE_URI="http://127.0.0.1:3002/#" + # (Optional) Domain to be used in the relay node's announce address + CERC_RELAY_ANNOUNCE_DOMAIN= + # (Optional) Set of relay peers to connect to from the relay node CERC_RELAY_PEERS=[] - # (Optional) Domain to be used in the relay node's announce address - CERC_RELAY_ANNOUNCE_DOMAIN= + # (Optional) Set of multiaddrs to be avoided while dialling + CERC_DENY_MULTIADDRS=[] # Set to false for disabling watcher peer to send txs to L2 CERC_ENABLE_PEER_L2_TXS=true diff --git a/app/data/stacks/mobymask-v2/watcher-p2p-network/watcher.md b/app/data/stacks/mobymask-v2/watcher-p2p-network/watcher.md index 74d95b92..4641726e 100644 --- a/app/data/stacks/mobymask-v2/watcher-p2p-network/watcher.md +++ b/app/data/stacks/mobymask-v2/watcher-p2p-network/watcher.md @@ -35,11 +35,11 @@ Checkout to the required versions and branches in repos: ```bash # watcher-ts cd ~/cerc/watcher-ts - git checkout v0.2.39 + git checkout v0.2.41 # mobymask-v2-watcher-ts cd ~/cerc/mobymask-v2-watcher-ts - git checkout v0.1.0 + git checkout v0.1.1 # MobyMask cd ~/cerc/MobyMask diff --git a/app/data/stacks/mobymask-v2/web-apps.md b/app/data/stacks/mobymask-v2/web-apps.md index 2eb037f6..d1570c93 100644 --- a/app/data/stacks/mobymask-v2/web-apps.md +++ b/app/data/stacks/mobymask-v2/web-apps.md @@ -26,6 +26,9 @@ Create and update an env file to be used in the next step ([defaults](../../conf # Eg. CERC_RELAY_NODES=["/dns4/example.com/tcp/443/wss/p2p/12D3KooWGHmDDCc93XUWL16FMcTPCGu2zFaMkf67k8HZ4gdQbRDr"] CERC_RELAY_NODES=[] + # Set of multiaddrs to be avoided while dialling + CERC_DENY_MULTIADDRS=[] + # Also add if running MobyMask app: # Watcher endpoint used by the app for GQL queries From a5d3d6bae76011bd20daa169ff06ede84818f06e Mon Sep 17 00:00:00 2001 From: Zach Date: Tue, 9 May 2023 14:57:49 -0400 Subject: [PATCH 0473/1010] Update laconicd-fixturenet.md (#386) Former-commit-id: b6a0af4e956b731c9c694b68c324c7e46cc2b390 --- docs/laconicd-fixturenet.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/laconicd-fixturenet.md b/docs/laconicd-fixturenet.md index eacdf33e..b00cfb3c 100644 --- a/docs/laconicd-fixturenet.md +++ b/docs/laconicd-fixturenet.md @@ -162,7 +162,13 @@ Published demo-record-1.yml with id: bafyreierh3xnfivexlscdwubvczmddsnf46uytyfvr The sample record we deployed looks like: ``` -TODO +record: + type: WebsiteRegistrationRecord + url: 'https://cerc.io' + repo_registration_record_cid: QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D + build_artifact_cid: QmP8jTG1m9GSDJLCbeWhVSVgEzCPPwXRdCRuJtQ5Tz9Kc9 + tls_cert_cid: QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR + version: 1.0.23 ``` 2. Return to the laconic-console From fce41994a3885b4904412c830fef6dd2b25a7606 Mon Sep 17 00:00:00 2001 From: Zach Date: Tue, 9 May 2023 15:23:56 -0400 Subject: [PATCH 0474/1010] match tokens (#388) Former-commit-id: e5faeb9d3b5a90d7c66dcd7c83fe376351f70d02 --- app/data/stacks/build-support/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/data/stacks/build-support/README.md b/app/data/stacks/build-support/README.md index fd85927f..48487731 100644 --- a/app/data/stacks/build-support/README.md +++ b/app/data/stacks/build-support/README.md @@ -30,7 +30,7 @@ $ laconic-so --stack package-registry deploy up ⠿ Container laconic-aecc4a21d3a502b14522db97d427e850-server-1 Started 1.9s New user 'gitea_admin' has been successfully created! This is your gitea access token: 84fe66a73698bf11edbdccd0a338236b7d1d5c45. Keep it safe and secure, it can not be fetched again from gitea. -To use with laconic-so set this environment variable: export CERC_NPM_AUTH_TOKEN=3e493e77b3e83fe9e882f7e3a79dd4d5441c308b +To use with laconic-so set this environment variable: export CERC_NPM_AUTH_TOKEN=84fe66a73698bf11edbdccd0a338236b7d1d5c45 Created the organization cerc-io Gitea was configured to use host name: gitea.local, ensure that this resolves to localhost, e.g. with sudo vi /etc/hosts Success, gitea is properly initialized From 1852d7d4c1967ad10952abdbcc652cbcb1600e93 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 9 May 2023 13:00:58 -0700 Subject: [PATCH 0475/1010] Chain chunker stack (#389) * Fix bug in default container build flow * Add convenience stack for chain-chunker Former-commit-id: 3e78c321b09753246fbc513cd5b4659d62ff5ec8 --- app/build_containers.py | 2 +- app/data/container-image-list.txt | 1 + app/data/repository-list.txt | 1 + app/data/stacks/chain-chunker/README.md | 0 app/data/stacks/chain-chunker/stack.yml | 13 +++++++++++++ 5 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 app/data/stacks/chain-chunker/README.md create mode 100644 app/data/stacks/chain-chunker/stack.yml diff --git a/app/build_containers.py b/app/build_containers.py index 6cd8f2b8..1ed3cb16 100644 --- a/app/build_containers.py +++ b/app/build_containers.py @@ -115,7 +115,7 @@ def command(ctx, include, exclude, force_rebuild, extra_build_args): # TODO: make this less of a hack -- should be specified in some metadata somewhere # Check if we have a repo for this container. If not, set the context dir to the container-build subdir repo_full_path = os.path.join(dev_root_path, repo_dir) - repo_dir_or_build_dir = repo_dir if os.path.exists(repo_full_path) else build_dir + repo_dir_or_build_dir = repo_full_path if os.path.exists(repo_full_path) else build_dir build_command = os.path.join(container_build_dir, "default-build.sh") + f" {container}:local {repo_dir_or_build_dir}" if not dry_run: if verbose: diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index ba0eaf23..f3d9985f 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -38,3 +38,4 @@ cerc/optimism-op-node cerc/optimism-op-proposer cerc/pocket cerc/watcher-azimuth +cerc/ipld-eth-state-snapshot diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index 7035de2a..4002d559 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -30,3 +30,4 @@ ethereum-optimism/optimism pokt-network/pocket-core pokt-network/pocket-core-deployments cerc-io/azimuth-watcher-ts +cerc-io/ipld-eth-state-snapshot diff --git a/app/data/stacks/chain-chunker/README.md b/app/data/stacks/chain-chunker/README.md new file mode 100644 index 00000000..e69de29b diff --git a/app/data/stacks/chain-chunker/stack.yml b/app/data/stacks/chain-chunker/stack.yml new file mode 100644 index 00000000..f7676d34 --- /dev/null +++ b/app/data/stacks/chain-chunker/stack.yml @@ -0,0 +1,13 @@ +version: "1.0" +name: chain-chunker +decription: "Stack to build containers for chain-chunker" +repos: + - cerc-io/ipld-eth-state-snapshot + - cerc-io/eth-statediff-service + - cerc-io/ipld-eth-db + - cerc-io/ipld-eth-server +containers: + - cerc/ipld-eth-state-snapshot + - cerc/eth-statediff-service + - cerc/ipld-eth-db + - cerc/ipld-eth-server From a93fa93d263ad858f3677f9df0501161777ec5e1 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 9 May 2023 17:08:25 -0600 Subject: [PATCH 0476/1010] Small doc fix Former-commit-id: d26dd4b531d30bc3e011cdc5a81f06923417380f --- app/data/stacks/kubo/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/data/stacks/kubo/README.md b/app/data/stacks/kubo/README.md index e9b12321..8388ecf6 100644 --- a/app/data/stacks/kubo/README.md +++ b/app/data/stacks/kubo/README.md @@ -12,10 +12,10 @@ If running in the cloud, visit `IP:5001/webui` and you'll likely see this error: 1. Get the container name with `docker ps`: -2. Go into the container (replace with your container name): +2. Go into the container: ``` -docker exec -it laconic-dbbf5498fd7d322930b9484121a6a5f4-ipfs-1 sh +laconic-so --stack kubo deploy exec ipfs sh ``` 3. Enable CORS as described in point 2 of the error message. Copy/paste/run each line in sequence, then run `exit` to exit the container. From 5c7d4455001eb28a8881438730615409bb995574 Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Tue, 16 May 2023 09:09:08 +0530 Subject: [PATCH 0477/1010] Add a stack for Gelato watcher (#394) * Add a stack for Gelato watcher * Add option to create and use a state snapshot * Add commands to create and import a state checkpoint * Rename ipld-eth-server endpoint env variables * Fix default env variable Former-commit-id: 8b4b5deba88bc5008a623a3826a5d2c0d76aadb6 --- .../compose/docker-compose-watcher-gelato.yml | 91 +++++++++++++++++ .../create-and-import-checkpoint.sh | 28 ++++++ .../config/watcher-gelato/start-job-runner.sh | 23 +++++ .../config/watcher-gelato/start-server.sh | 32 ++++++ .../watcher-config-template.toml | 75 ++++++++++++++ .../config/watcher-gelato/watcher-params.env | 13 +++ .../cerc-watcher-gelato/Dockerfile | 12 +++ .../cerc-watcher-gelato/build.sh | 9 ++ .../cerc-watcher-mobymask-v2/Dockerfile | 2 +- app/data/container-image-list.txt | 1 + app/data/pod-list.txt | 1 + app/data/repository-list.txt | 1 + app/data/stacks/azimuth/README.md | 4 +- app/data/stacks/gelato/README.md | 98 +++++++++++++++++++ app/data/stacks/gelato/stack.yml | 8 ++ 15 files changed, 395 insertions(+), 3 deletions(-) create mode 100644 app/data/compose/docker-compose-watcher-gelato.yml create mode 100755 app/data/config/watcher-gelato/create-and-import-checkpoint.sh create mode 100755 app/data/config/watcher-gelato/start-job-runner.sh create mode 100755 app/data/config/watcher-gelato/start-server.sh create mode 100644 app/data/config/watcher-gelato/watcher-config-template.toml create mode 100644 app/data/config/watcher-gelato/watcher-params.env create mode 100644 app/data/container-build/cerc-watcher-gelato/Dockerfile create mode 100755 app/data/container-build/cerc-watcher-gelato/build.sh create mode 100644 app/data/stacks/gelato/README.md create mode 100644 app/data/stacks/gelato/stack.yml diff --git a/app/data/compose/docker-compose-watcher-gelato.yml b/app/data/compose/docker-compose-watcher-gelato.yml new file mode 100644 index 00000000..fc607408 --- /dev/null +++ b/app/data/compose/docker-compose-watcher-gelato.yml @@ -0,0 +1,91 @@ +version: '3.2' + +services: + # Starts the PostgreSQL database for watcher + gelato-watcher-db: + restart: unless-stopped + image: postgres:14-alpine + environment: + - POSTGRES_USER=vdbm + - POSTGRES_MULTIPLE_DATABASES=gelato-watcher,gelato-watcher-job-queue + - POSTGRES_EXTENSION=gelato-watcher-job-queue:pgcrypto + - POSTGRES_PASSWORD=password + volumes: + - ../config/postgresql/multiple-postgressql-databases.sh:/docker-entrypoint-initdb.d/multiple-postgressql-databases.sh + - gelato_watcher_db_data:/var/lib/postgresql/data + ports: + - "0.0.0.0:15432:5432" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "5432"] + interval: 10s + timeout: 5s + retries: 15 + start_period: 10s + + # Starts the gelato-watcher job runner + gelato-watcher-job-runner: + image: cerc/watcher-gelato:local + restart: unless-stopped + depends_on: + gelato-watcher-db: + condition: service_healthy + env_file: + - ../config/watcher-gelato/watcher-params.env + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_IPLD_ETH_RPC: ${CERC_IPLD_ETH_RPC} + CERC_IPLD_ETH_GQL: ${CERC_IPLD_ETH_GQL} + command: ["./start-job-runner.sh"] + volumes: + - ../config/watcher-gelato/watcher-config-template.toml:/app/environments/watcher-config-template.toml + - ../config/watcher-gelato/start-job-runner.sh:/app/start-job-runner.sh + ports: + - "0.0.0.0:9000:9000" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "9000"] + interval: 10s + timeout: 5s + retries: 15 + start_period: 10s + extra_hosts: + - "host.docker.internal:host-gateway" + + # Starts the gelato-watcher server + gelato-watcher-server: + image: cerc/watcher-gelato:local + restart: unless-stopped + depends_on: + gelato-watcher-db: + condition: service_healthy + gelato-watcher-job-runner: + condition: service_healthy + env_file: + - ../config/watcher-gelato/watcher-params.env + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_IPLD_ETH_RPC: ${CERC_IPLD_ETH_RPC} + CERC_IPLD_ETH_GQL: ${CERC_IPLD_ETH_GQL} + CERC_USE_STATE_SNAPSHOT: ${CERC_USE_STATE_SNAPSHOT} + CERC_SNAPSHOT_GQL_ENDPOINT: ${CERC_SNAPSHOT_GQL_ENDPOINT} + CERC_SNAPSHOT_BLOCKHASH: ${CERC_SNAPSHOT_BLOCKHASH} + command: ["./start-server.sh"] + volumes: + - ../config/watcher-gelato/watcher-config-template.toml:/app/environments/watcher-config-template.toml + - ../config/watcher-gelato/start-server.sh:/app/start-server.sh + - ../config/watcher-gelato/create-and-import-checkpoint.sh:/app/create-and-import-checkpoint.sh + - gelato_watcher_state_gql:/app/state_checkpoint + ports: + - "0.0.0.0:3008:3008" + - "0.0.0.0:9001:9001" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "3008"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s + extra_hosts: + - "host.docker.internal:host-gateway" + +volumes: + gelato_watcher_db_data: + gelato_watcher_state_gql: diff --git a/app/data/config/watcher-gelato/create-and-import-checkpoint.sh b/app/data/config/watcher-gelato/create-and-import-checkpoint.sh new file mode 100755 index 00000000..20b90503 --- /dev/null +++ b/app/data/config/watcher-gelato/create-and-import-checkpoint.sh @@ -0,0 +1,28 @@ +#!/bin/bash +set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi + +CERC_SNAPSHOT_GQL_ENDPOINT="${CERC_SNAPSHOT_GQL_ENDPOINT:-${DEFAULT_CERC_SNAPSHOT_GQL_ENDPOINT}}" +CERC_SNAPSHOT_BLOCKHASH="${CERC_SNAPSHOT_BLOCKHASH:-${DEFAULT_CERC_SNAPSHOT_BLOCKHASH}}" + +CHECKPOINT_FILE_PATH="./state_checkpoint/state-gql-${CERC_SNAPSHOT_BLOCKHASH}" + +if [ -f "${CHECKPOINT_FILE_PATH}" ]; then + # Skip checkpoint creation if the file already exists + echo "File at ${CHECKPOINT_FILE_PATH} already exists, skipping checkpoint creation..." +else + # Create a checkpoint using GQL endpoint + echo "Creating a state checkpoint using GQL endpoint..." + yarn create-state-gql \ + --snapshot-block-hash "${CERC_SNAPSHOT_BLOCKHASH}" \ + --gql-endpoint "${CERC_SNAPSHOT_GQL_ENDPOINT}" \ + --output "${CHECKPOINT_FILE_PATH}" +fi + +echo "Initializing watcher using a state snapshot..." + +# Import the state checkpoint +# (skips if snapshot block is already indexed) +yarn import-state --import-file "${CHECKPOINT_FILE_PATH}" diff --git a/app/data/config/watcher-gelato/start-job-runner.sh b/app/data/config/watcher-gelato/start-job-runner.sh new file mode 100755 index 00000000..44f9e86f --- /dev/null +++ b/app/data/config/watcher-gelato/start-job-runner.sh @@ -0,0 +1,23 @@ +#!/bin/bash +set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi + +CERC_IPLD_ETH_RPC="${CERC_IPLD_ETH_RPC:-${DEFAULT_CERC_IPLD_ETH_RPC}}" +CERC_IPLD_ETH_GQL="${CERC_IPLD_ETH_GQL:-${DEFAULT_CERC_IPLD_ETH_GQL}}" + +echo "Using ETH server RPC endpoint ${CERC_IPLD_ETH_RPC}" +echo "Using ETH server GQL endpoint ${CERC_IPLD_ETH_GQL}" + +# Read in the config template TOML file and modify it +WATCHER_CONFIG_TEMPLATE=$(cat environments/watcher-config-template.toml) +WATCHER_CONFIG=$(echo "$WATCHER_CONFIG_TEMPLATE" | \ + sed -E "s|REPLACE_WITH_CERC_IPLD_ETH_GQL|${CERC_IPLD_ETH_GQL}|g; \ + s|REPLACE_WITH_CERC_IPLD_ETH_RPC|${CERC_IPLD_ETH_RPC}| ") + +# Write the modified content to a new file +echo "$WATCHER_CONFIG" > environments/local.toml + +echo "Running job-runner" +DEBUG=vulcanize:* exec node --enable-source-maps dist/job-runner.js diff --git a/app/data/config/watcher-gelato/start-server.sh b/app/data/config/watcher-gelato/start-server.sh new file mode 100755 index 00000000..4cd3cd73 --- /dev/null +++ b/app/data/config/watcher-gelato/start-server.sh @@ -0,0 +1,32 @@ +#!/bin/bash +set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi + +CERC_IPLD_ETH_RPC="${CERC_IPLD_ETH_RPC:-${DEFAULT_CERC_IPLD_ETH_RPC}}" +CERC_IPLD_ETH_GQL="${CERC_IPLD_ETH_GQL:-${DEFAULT_CERC_IPLD_ETH_GQL}}" + +CERC_USE_STATE_SNAPSHOT="${CERC_USE_STATE_SNAPSHOT:-${DEFAULT_CERC_USE_STATE_SNAPSHOT}}" + +echo "Using ETH server RPC endpoint ${CERC_IPLD_ETH_RPC}" +echo "Using ETH server GQL endpoint ${CERC_IPLD_ETH_GQL}" + +# Read in the config template TOML file and modify it +WATCHER_CONFIG_TEMPLATE=$(cat environments/watcher-config-template.toml) +WATCHER_CONFIG=$(echo "$WATCHER_CONFIG_TEMPLATE" | \ + sed -E "s|REPLACE_WITH_CERC_IPLD_ETH_GQL|${CERC_IPLD_ETH_GQL}|g; \ + s|REPLACE_WITH_CERC_IPLD_ETH_RPC|${CERC_IPLD_ETH_RPC}| ") + +# Write the modified content to a new file +echo "$WATCHER_CONFIG" > environments/local.toml + +if [ "$CERC_USE_STATE_SNAPSHOT" = true ] ; then + ./create-and-import-checkpoint.sh +else + echo "Initializing watcher using fill..." + yarn fill --start-block $DEFAULT_CERC_GELATO_START_BLOCK --end-block $DEFAULT_CERC_GELATO_START_BLOCK +fi + +echo "Running active server" +DEBUG=vulcanize:* exec node --enable-source-maps dist/server.js diff --git a/app/data/config/watcher-gelato/watcher-config-template.toml b/app/data/config/watcher-gelato/watcher-config-template.toml new file mode 100644 index 00000000..19c3a2f1 --- /dev/null +++ b/app/data/config/watcher-gelato/watcher-config-template.toml @@ -0,0 +1,75 @@ +[server] + host = "0.0.0.0" + port = 3008 + kind = "active" + + # Checkpointing state. + checkpointing = true + + # Checkpoint interval in number of blocks. + checkpointInterval = 2000 + + # Enable state creation + # CAUTION: Disable only if state creation is not desired or can be filled subsequently + enableState = true + + subgraphPath = "./subgraph" + + # Interval to restart wasm instance periodically + wasmRestartBlocksInterval = 20 + + # Interval in number of blocks at which to clear entities cache. + clearEntitiesCacheInterval = 1000 + + # Boolean to filter logs by contract. + filterLogs = true + + # Max block range for which to return events in eventsInRange GQL query. + # Use -1 for skipping check on block range. + maxEventsBlockRange = 1000 + + # GQL cache settings + [server.gqlCache] + enabled = true + + # Max in-memory cache size (in bytes) (default 8 MB) + # maxCacheSize + + # GQL cache-control max-age settings (in seconds) + maxAge = 15 + timeTravelMaxAge = 86400 # 1 day + +[metrics] + host = "0.0.0.0" + port = 9000 + [metrics.gql] + port = 9001 + +[database] + type = "postgres" + host = "gelato-watcher-db" + port = 5432 + database = "gelato-watcher" + username = "vdbm" + password = "password" + synchronize = true + logging = false + +[upstream] + [upstream.ethServer] + gqlApiEndpoint = "REPLACE_WITH_CERC_IPLD_ETH_GQL" + rpcProviderEndpoint = "REPLACE_WITH_CERC_IPLD_ETH_RPC" + + [upstream.cache] + name = "requests" + enabled = false + deleteOnStart = false + +[jobQueue] + dbConnectionString = "postgres://vdbm:password@gelato-watcher-db/gelato-watcher-job-queue" + maxCompletionLagInSecs = 300 + jobDelayInMilliSecs = 100 + eventsInBatch = 50 + blockDelayInMilliSecs = 2000 + prefetchBlocksInMem = true + prefetchBlockCount = 10 diff --git a/app/data/config/watcher-gelato/watcher-params.env b/app/data/config/watcher-gelato/watcher-params.env new file mode 100644 index 00000000..e9bcad76 --- /dev/null +++ b/app/data/config/watcher-gelato/watcher-params.env @@ -0,0 +1,13 @@ +# ipld-eth-server endpoints +DEFAULT_CERC_IPLD_ETH_RPC="http://ipld-eth-server:8082" +DEFAULT_CERC_IPLD_ETH_GQL="http://ipld-eth-server:8083/graphql" + +# Gelato start block +DEFAULT_CERC_GELATO_START_BLOCK=11361987 + +# Whether to use a state snapshot to initialize the watcher +DEFAULT_CERC_USE_STATE_SNAPSHOT=false + +# State snapshot params +DEFAULT_CERC_SNAPSHOT_GQL_ENDPOINT= +DEFAULT_CERC_SNAPSHOT_BLOCKHASH= diff --git a/app/data/container-build/cerc-watcher-gelato/Dockerfile b/app/data/container-build/cerc-watcher-gelato/Dockerfile new file mode 100644 index 00000000..67a94bf4 --- /dev/null +++ b/app/data/container-build/cerc-watcher-gelato/Dockerfile @@ -0,0 +1,12 @@ +FROM node:18.15.0-alpine3.16 + +RUN apk --update --no-cache add git python3 alpine-sdk bash + +WORKDIR /app + +COPY . . + +RUN echo "Building gelato-watcher-ts" && \ + yarn && yarn build + +WORKDIR /app diff --git a/app/data/container-build/cerc-watcher-gelato/build.sh b/app/data/container-build/cerc-watcher-gelato/build.sh new file mode 100755 index 00000000..d27987e7 --- /dev/null +++ b/app/data/container-build/cerc-watcher-gelato/build.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +# Build cerc/watcher-gelato + +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t cerc/watcher-gelato:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/gelato-watcher-ts diff --git a/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile b/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile index 6c100091..3e07eec9 100644 --- a/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile +++ b/app/data/container-build/cerc-watcher-mobymask-v2/Dockerfile @@ -15,6 +15,6 @@ WORKDIR /app COPY . . RUN echo "Building mobymask-v2-watcher-ts" && \ - yarn && yarn build + yarn && yarn build WORKDIR /app diff --git a/app/data/container-image-list.txt b/app/data/container-image-list.txt index f3d9985f..ab0a87b5 100644 --- a/app/data/container-image-list.txt +++ b/app/data/container-image-list.txt @@ -39,3 +39,4 @@ cerc/optimism-op-proposer cerc/pocket cerc/watcher-azimuth cerc/ipld-eth-state-snapshot +cerc/watcher-gelato diff --git a/app/data/pod-list.txt b/app/data/pod-list.txt index 34d66ba6..6c98c76c 100644 --- a/app/data/pod-list.txt +++ b/app/data/pod-list.txt @@ -26,3 +26,4 @@ foundry fixturenet-optimism fixturenet-pocket watcher-azimuth +watcher-gelato diff --git a/app/data/repository-list.txt b/app/data/repository-list.txt index 4002d559..4b257813 100644 --- a/app/data/repository-list.txt +++ b/app/data/repository-list.txt @@ -31,3 +31,4 @@ pokt-network/pocket-core pokt-network/pocket-core-deployments cerc-io/azimuth-watcher-ts cerc-io/ipld-eth-state-snapshot +cerc-io/gelato-watcher-ts diff --git a/app/data/stacks/azimuth/README.md b/app/data/stacks/azimuth/README.md index d3e377da..c4e1671f 100644 --- a/app/data/stacks/azimuth/README.md +++ b/app/data/stacks/azimuth/README.md @@ -4,7 +4,7 @@ Instructions to setup and deploy Azimuth Watcher stack ## Setup -Prerequisite: ipld-eth-server RPC and GQL endpoints +Prerequisite: `ipld-eth-server` RPC and GQL endpoints Clone required repositories: @@ -41,7 +41,7 @@ This should create the required docker images in the local image registry. CERC_IPLD_ETH_GQL= ``` -* NOTE: If ipld-eth-server is running on the host machine, use `host.docker.internal` as the hostname to access host ports +* NOTE: If `ipld-eth-server` is running on the host machine, use `host.docker.internal` as the hostname to access host ports ### Deploy the stack diff --git a/app/data/stacks/gelato/README.md b/app/data/stacks/gelato/README.md new file mode 100644 index 00000000..4baaee51 --- /dev/null +++ b/app/data/stacks/gelato/README.md @@ -0,0 +1,98 @@ +# Gelato watcher + +Instructions to setup and deploy Gelato watcher using [laconic-stack-orchestrator](/README.md#install) + +## Setup + +Prerequisite: `ipld-eth-server` RPC and GQL endpoints + +Clone required repositories: + +```bash +laconic-so --stack gelato setup-repositories + +# If this throws an error as a result of being already checked out to a branch/tag in a repo, remove the repositories mentioned below and re-run the command +``` + +Checkout to required version in the repo: + +```bash +# gelato-watcher-ts +cd ~/cerc/gelato-watcher-ts +git checkout v0.1.0 +``` + +Build the container images: + +```bash +laconic-so --stack gelato build-containers +``` + +This should create the required docker images in the local image registry. + +## Deploy + +### Configuration + +Create and update an env file to be used in the next step ([defaults](../../config/watcher-gelato/watcher-params.env)): + + ```bash + # External ipld-eth-server endpoints + CERC_IPLD_ETH_RPC= + CERC_IPLD_ETH_GQL= + + # Whether to use a state snapshot to initialize the watcher + CERC_USE_STATE_SNAPSHOT=false + + # State snapshot params + # Required if CERC_USE_STATE_SNAPSHOT is set to true + CERC_SNAPSHOT_GQL_ENDPOINT= + CERC_SNAPSHOT_BLOCKHASH= + ``` + +* NOTE: If `ipld-eth-server` is running on the host machine, use `host.docker.internal` as the hostname to access the host port(s) + +### Deploy the stack + +```bash +laconic-so --stack gelato deploy --env-file up +``` + +To list down and monitor the running containers: + +```bash +laconic-so --stack gelato deploy ps + +# With status +docker ps + +# Check logs for a container +docker logs -f +``` + +The stack runs an active watcher with following endpoints exposed on the host ports: +* `3008`: watcher endpoint +* `9000`: watcher metrics +* `9001`: watcher GQL metrics + +## Web Apps + +TODO + +## Clean up + +Stop all services running in the background: + +```bash +laconic-so --stack gelato deploy down +``` + +Clear volumes created by this stack: + +```bash +# List all relevant volumes +docker volume ls -q --filter "name=.*gelato_watcher_db_data|.*gelato_watcher_state_gql" + +# Remove all the listed volumes +docker volume rm $(docker volume ls -q --filter "name=.*gelato_watcher_db_data|.*gelato_watcher_state_gql") +``` diff --git a/app/data/stacks/gelato/stack.yml b/app/data/stacks/gelato/stack.yml new file mode 100644 index 00000000..51a8d64f --- /dev/null +++ b/app/data/stacks/gelato/stack.yml @@ -0,0 +1,8 @@ +version: "1.0" +name: gelato +repos: + - cerc-io/gelato-watcher-ts +containers: + - cerc/watcher-gelato +pods: + - watcher-gelato From 0691c22db4220c0e03b0b2c4a7d9151bc66e7609 Mon Sep 17 00:00:00 2001 From: Ian Date: Wed, 17 May 2023 17:11:56 -0400 Subject: [PATCH 0478/1010] Lotus (#392) * fist commit * manual peer connect * add build to gitignore * add shared volume * connect to bootnode * fix volume init bug * todo generate genesis * remove build dir --------- Co-authored-by: iskay Former-commit-id: 5ecfcae5ccc729426022f75160e8e6ecb5c489c3 --- .gitignore | 1 + .../docker-compose-fixturenet-lotus.yml | 68 +++++++++ .../.genesis-sectors/cache/s-t01000-0/p_aux | 1 + .../s-t01000-0/sc-02-data-tree-r-last.dat | 1 + .../.genesis-sectors/cache/s-t01000-0/t_aux | Bin 0 -> 405 bytes .../.genesis-sectors/cache/s-t01000-1/p_aux | Bin 0 -> 64 bytes .../s-t01000-1/sc-02-data-tree-r-last.dat | Bin 0 -> 32 bytes .../.genesis-sectors/cache/s-t01000-1/t_aux | Bin 0 -> 405 bytes .../.genesis-sectors/pre-seal-t01000.json | 71 +++++++++ .../.genesis-sectors/pre-seal-t01000.key | 1 + .../.genesis-sectors/sealed/s-t01000-0 | Bin 0 -> 2048 bytes .../.genesis-sectors/sealed/s-t01000-1 | Bin 0 -> 2048 bytes .../genesis/.genesis-sectors/sectorstore.json | 11 ++ .../fixturenet-lotus/genesis/devgen.car | Bin 0 -> 7633107 bytes .../fixturenet-lotus/genesis/localnet.json | 108 ++++++++++++++ .../config/fixturenet-lotus/lotus-env.env | 5 + .../config/fixturenet-lotus/setup-miner.sh | 39 +++++ .../config/fixturenet-lotus/setup-node.sh | 24 +++ .../container-build/cerc-lotus/Dockerfile | 138 ++++++++++++++++++ app/data/container-build/cerc-lotus/build.sh | 12 ++ app/data/container-image-list.txt | 1 + app/data/pod-list.txt | 1 + app/data/repository-list.txt | 1 + app/data/stacks/fixturenet-lotus/README.md | 28 ++++ app/data/stacks/fixturenet-lotus/stack.yml | 9 ++ 25 files changed, 520 insertions(+) create mode 100644 app/data/compose/docker-compose-fixturenet-lotus.yml create mode 100644 app/data/config/fixturenet-lotus/genesis/.genesis-sectors/cache/s-t01000-0/p_aux create mode 100644 app/data/config/fixturenet-lotus/genesis/.genesis-sectors/cache/s-t01000-0/sc-02-data-tree-r-last.dat create mode 100644 app/data/config/fixturenet-lotus/genesis/.genesis-sectors/cache/s-t01000-0/t_aux create mode 100644 app/data/config/fixturenet-lotus/genesis/.genesis-sectors/cache/s-t01000-1/p_aux create mode 100644 app/data/config/fixturenet-lotus/genesis/.genesis-sectors/cache/s-t01000-1/sc-02-data-tree-r-last.dat create mode 100644 app/data/config/fixturenet-lotus/genesis/.genesis-sectors/cache/s-t01000-1/t_aux create mode 100644 app/data/config/fixturenet-lotus/genesis/.genesis-sectors/pre-seal-t01000.json create mode 100644 app/data/config/fixturenet-lotus/genesis/.genesis-sectors/pre-seal-t01000.key create mode 100644 app/data/config/fixturenet-lotus/genesis/.genesis-sectors/sealed/s-t01000-0 create mode 100644 app/data/config/fixturenet-lotus/genesis/.genesis-sectors/sealed/s-t01000-1 create mode 100644 app/data/config/fixturenet-lotus/genesis/.genesis-sectors/sectorstore.json create mode 100644 app/data/config/fixturenet-lotus/genesis/devgen.car create mode 100644 app/data/config/fixturenet-lotus/genesis/localnet.json create mode 100644 app/data/config/fixturenet-lotus/lotus-env.env create mode 100644 app/data/config/fixturenet-lotus/setup-miner.sh create mode 100644 app/data/config/fixturenet-lotus/setup-node.sh create mode 100644 app/data/container-build/cerc-lotus/Dockerfile create mode 100755 app/data/container-build/cerc-lotus/build.sh create mode 100644 app/data/stacks/fixturenet-lotus/README.md create mode 100644 app/data/stacks/fixturenet-lotus/stack.yml diff --git a/.gitignore b/.gitignore index 8ae2b229..0e253ae4 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ __pycache__ *~ package app/data/build_tag.txt +build diff --git a/app/data/compose/docker-compose-fixturenet-lotus.yml b/app/data/compose/docker-compose-fixturenet-lotus.yml new file mode 100644 index 00000000..d4e72b79 --- /dev/null +++ b/app/data/compose/docker-compose-fixturenet-lotus.yml @@ -0,0 +1,68 @@ +version: "3.8" +services: + + lotus-miner: + hostname: lotus-miner + env_file: + - ../config/fixturenet-lotus/lotus-env.env + image: cerc/lotus:local + volumes: + - ../config/fixturenet-lotus/setup-miner.sh:/docker-entrypoint-scripts.d/setup-miner.sh + - ../config/fixturenet-lotus/genesis/devgen.car:/devgen.car + - $HOME/stack-orchestrator/app/data/config/fixturenet-lotus/genesis/.genesis-sectors:/root/.genesis-sectors + - lotus-shared:/root/.lotus-shared + healthcheck: +# test: ["CMD-SHELL", "grep 'started ChainNotify channel' /var/log/lotus.log"] +# test: ["CMD-SHELL", "[ -f /root/.lotus-shared/miner.addr ]"] + test: ["CMD-SHELL", "[ -d /root/.lotus-miner-local-net ]"] + interval: 10s + timeout: 10s + retries: 10 + start_period: 60s + entrypoint: ["sh", "/docker-entrypoint-scripts.d/setup-miner.sh"] + ports: + - "1234" + - "2345" + - "3456" + - "1777" + + lotus-node-1: + hostname: lotus-node-1 + env_file: + - ../config/fixturenet-lotus/lotus-env.env + image: cerc/lotus:local + volumes: + - ../config/fixturenet-lotus/setup-node.sh:/docker-entrypoint-scripts.d/setup-node.sh + - ../config/fixturenet-lotus/genesis/devgen.car:/devgen.car + - lotus-shared:/root/.lotus-shared + depends_on: + lotus-miner: + condition: service_healthy + entrypoint: ["sh", "/docker-entrypoint-scripts.d/setup-node.sh"] + ports: + - "1234" + - "2345" + - "3456" + - "1777" + + lotus-node-2: + hostname: lotus-node-2 + env_file: + - ../config/fixturenet-lotus/lotus-env.env + image: cerc/lotus:local + volumes: + - ../config/fixturenet-lotus/setup-node.sh:/docker-entrypoint-scripts.d/setup-node.sh + - ../config/fixturenet-lotus/genesis/devgen.car:/devgen.car + - lotus-shared:/root/.lotus-shared + depends_on: + lotus-miner: + condition: service_healthy + entrypoint: ["sh", "/docker-entrypoint-scripts.d/setup-node.sh"] + ports: + - "1234" + - "2345" + - "3456" + - "1777" + +volumes: + lotus-shared: \ No newline at end of file diff --git a/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/cache/s-t01000-0/p_aux b/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/cache/s-t01000-0/p_aux new file mode 100644 index 00000000..81030cb4 --- /dev/null +++ b/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/cache/s-t01000-0/p_aux @@ -0,0 +1 @@ +}+V{iй\kq  ?Af~쩙Ltbyqč?aӚJ \ No newline at end of file diff --git a/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/cache/s-t01000-0/sc-02-data-tree-r-last.dat b/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/cache/s-t01000-0/sc-02-data-tree-r-last.dat new file mode 100644 index 00000000..5af05cae --- /dev/null +++ b/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/cache/s-t01000-0/sc-02-data-tree-r-last.dat @@ -0,0 +1 @@ +f~쩙Ltbyqč?aӚJ \ No newline at end of file diff --git a/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/cache/s-t01000-0/t_aux b/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/cache/s-t01000-0/t_aux new file mode 100644 index 0000000000000000000000000000000000000000..093023636be51dbc807e86f6f05438df51f273bd GIT binary patch literal 405 zcmZQ#fB0hoLQ_}oSIycUsSB0oS2-Es$Z;IVqj=sV4!Qj4pp9$ zSeaU+YslyT<+DO*ii|U&)HpV%D@uw|Q*~1q>nU>_H?nC(x;cr(C5)a>F-9m&qJL2w In2cc>0OZ6`V!Z literal 0 HcmV?d00001 diff --git a/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/cache/s-t01000-1/t_aux b/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/cache/s-t01000-1/t_aux new file mode 100644 index 0000000000000000000000000000000000000000..1a9f9afcfe9f7399e743ad2579b799171f89fca6 GIT binary patch literal 405 zcmZQ#fB0hoLQ_}oSIycUsSB0oS2-Es$Z;IVqj=sV4!Qr4pp9$ zSeaU+YslyT<+DO*ii|U&)HpV%D@uw|Q*~1q>nU>_H?nC(x;cr(C5)a>F-9m&qJL2w In2cc>0O*HN=>Px# literal 0 HcmV?d00001 diff --git a/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/pre-seal-t01000.json b/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/pre-seal-t01000.json new file mode 100644 index 00000000..3a05d4b1 --- /dev/null +++ b/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/pre-seal-t01000.json @@ -0,0 +1,71 @@ +{ + "t01000": { + "ID": "t01000", + "Owner": "t3spusn5ia57qezc3fwpe3n2lhb4y4xt67xoflqbqy2muliparw2uktevletuv7gl4qakjpafgcl7jk2s2er3q", + "Worker": "t3spusn5ia57qezc3fwpe3n2lhb4y4xt67xoflqbqy2muliparw2uktevletuv7gl4qakjpafgcl7jk2s2er3q", + "PeerId": "12D3KooWG5q6pWJVdPBhDBv9AjWVbUh4xxTAZ7xvgZSjczWuD2Z9", + "MarketBalance": "0", + "PowerBalance": "0", + "SectorSize": 2048, + "Sectors": [ + { + "CommR": { + "/": "bagboea4b5abcboxypcewlkmrat2myu4vthk3ii2pcomak7nhqmdbb6sxlolp2wdf" + }, + "CommD": { + "/": "baga6ea4seaqn3jfixthmdgksv4vhfeuyvr6upw6tvaqbmzmsyxnzosm4pwgnmlq" + }, + "SectorID": 0, + "Deal": { + "PieceCID": { + "/": "baga6ea4seaqn3jfixthmdgksv4vhfeuyvr6upw6tvaqbmzmsyxnzosm4pwgnmlq" + }, + "PieceSize": 2048, + "VerifiedDeal": false, + "Client": "t3spusn5ia57qezc3fwpe3n2lhb4y4xt67xoflqbqy2muliparw2uktevletuv7gl4qakjpafgcl7jk2s2er3q", + "Provider": "t01000", + "Label": "0", + "StartEpoch": 0, + "EndEpoch": 9001, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "DealClientKey": { + "Type": "bls", + "PrivateKey": "tFvSRiSg2G3Ssgg0PSYy23XyjaIMXpsmdyG2B7UFLT4=" + }, + "ProofType": 5 + }, + { + "CommR": { + "/": "bagboea4b5abcb6krzypqcczhcnbeyjcqkeo6omfergm336o3kitugh3jgjog2yqq" + }, + "CommD": { + "/": "baga6ea4seaqhondpb2373hjasjplxvbjzi5n5mm4fbbhjxp5ptnbq4cibapkeii" + }, + "SectorID": 1, + "Deal": { + "PieceCID": { + "/": "baga6ea4seaqhondpb2373hjasjplxvbjzi5n5mm4fbbhjxp5ptnbq4cibapkeii" + }, + "PieceSize": 2048, + "VerifiedDeal": false, + "Client": "t3spusn5ia57qezc3fwpe3n2lhb4y4xt67xoflqbqy2muliparw2uktevletuv7gl4qakjpafgcl7jk2s2er3q", + "Provider": "t01000", + "Label": "1", + "StartEpoch": 0, + "EndEpoch": 9001, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "DealClientKey": { + "Type": "bls", + "PrivateKey": "tFvSRiSg2G3Ssgg0PSYy23XyjaIMXpsmdyG2B7UFLT4=" + }, + "ProofType": 5 + } + ] + } +} \ No newline at end of file diff --git a/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/pre-seal-t01000.key b/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/pre-seal-t01000.key new file mode 100644 index 00000000..53e58628 --- /dev/null +++ b/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/pre-seal-t01000.key @@ -0,0 +1 @@ +7b2254797065223a22626c73222c22507269766174654b6579223a227446765352695367324733537367673050535979323358796a61494d5870736d64794732423755464c54343d227d \ No newline at end of file diff --git a/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/sealed/s-t01000-0 b/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/sealed/s-t01000-0 new file mode 100644 index 0000000000000000000000000000000000000000..56a0f8724380fd3bdc658936f5735a25b1ef614f GIT binary patch literal 2048 zcmV+b2>j92n3LwHbF zZ_!a*jC*S_`y*t{R5KKj561uJ+KfCD>zm0=0o}bNfxgl}1^|$*o8F7*=PXjHO0M<` zfyH5b#osWTu)co9U{WLL9oLL>y|(_k^QZLj#nO^$1AJAK>r^RSp@KNEY7|M{prk>` zHX^dmHoQGk`xOT4^ucld9m#8yy}b1^Ee|pPJ=czTHy33eCCAXrZn}S=0o_t1!_(-= zjb+bhyQ7;uL~G*&86=>ErfJ^TbwW=->EjT;yYF{EDu?x|=iV`*2{oEWs*#iQ0XVk#j2*Q)i>@{LZ7il;@1-*)sF&zAj zoUV0cXrCSVUZB73mn`H%q2onh^NO{)3{r)Unj6S+e2}Fma4CAY()#fP3~@eFG%iOB zjZLgcGCmaR@A?}yRFL5H>bL3K_n6LKvLP5Og?%R~1;(hctUPS;z&{&=Vslz3s?-J{ zu2=ZdXzR++Cqh1p49rCCj>rbJ)brx~F_E)Ak&MEso{|av){CBy{CH12I$LK+Y+7AA zX8m}b)6SLq1}Xds>i}#6D}678YdK6!YbbgHe7=VY5w$?%E|oq;@9F>d@!gbIiCme^jAx^32$0hwgh?1z zot6r5JuXf7?O=X_da|Ek*gqPerO6i>c>-coa*ltVjZCW8F5gDoB~w2dR118~jR)c+ z1YTZ+sgat&^3I0g#&)0`uDws(`%Rq^)5Q=?X9{Fp=@yw}i|*9os`qXrI4<(WkSaWm z=4#FW@1AF95(1%gCC-FXFUc@QrbUaqA^0>M9lc3ExI|u(8YUyYX-;ngd&BW-F%Xo;LaUz78j)gpAtgOr%?^ueSDIR0PK z=xeROMoaU%|A+J(AA$FjXp@Y6y>Q#YlTCn^4$d`^<*-Z2&l5}Tnn1nUxHJbKJ6uPN zqQMaCaU8MruT(<8SQgSy){NCppJA&c!!D(PW#4U)m#i7-sig8WXWGNZO#@kE$X)Y5lAbxp;!AP|l16gOC)xx`RzBrPkao{paZ2!9kK zIjRMcjfNvaHd!jH^KL_hH|@}EZ`~Scv|>dK1jJQ1evAFwS9nfbm96ha*3w>*RpX6- z6`Z+6S_DJ4COM9u;@Chu`)QolAZ*cSkB~_4hsGKhBbNaB_(8KHMb(#Q_50t(7Nu#@ zn#_-ljoB#lQ16f02D+S2ULo`RTX-1->g*mkW5w0GG}2p1_#Tb;2*EP zX1Y~WLzN$7LBO2t8Q@P+H-t6BAt_pTb|eRUD{3-)5`T_bMTa~M_?q?N1^8##k el(rKmOM4VBK+>rl~6($TN8v2qEoNN~JQj8S0+^ literal 0 HcmV?d00001 diff --git a/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/sealed/s-t01000-1 b/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/sealed/s-t01000-1 new file mode 100644 index 0000000000000000000000000000000000000000..dc3afe0facdccd1886e1f3fd488898b968bc249e GIT binary patch literal 2048 zcmV+b2>^`yA)7CR^sfKq9^q~8z>OLprG5+7lqller4CW~ zVwAJ3w}~M-4N$dkdM#!?$jA-94(J%b*@(#~kR?4o_npKF>#0ykM)D8>i>|}n4;g5a z0E|*PAo%`3H2ziQw*B7a)1LpsB?0)mlR`J|gTE`+Ze8(0tkcu3?J7OjO`|gk2L@-5 zxigat4Rs0UhFq+L&SDuzaV?$lF_ux=&mUW`s^hKfTljju=U+0ogv@TG1Nl|}k`xbQ zFd8x#lH4Oy$(x{%ELT8#ASF32OHMjy5jV<|Sy%-p*5E+P5rLj4L*pM>SJ4SIrtOjZ zNsBXRjyY~2W%#dASi~GFJ|n{f1F9kAek!YA1ljO@qafe!^y=ftnO-p-tc@dT*#lMMUaifX(q zk`fRqot<77BnChcmQ$gBAiZPEog8y^GxzxK|1KD%AlZH7N=7zCwMXLxh@LTpRcT>> zc+(n=1vJPXkE*>EwEqBst}#h0Ts_2rECvY=?-Vm0P&_mfBw1cY4R9Y4{&5m>i#ld0 zK7l?#m!?yk-kKFngys7BJ}WPh(Nyl$Nc)8#L}6cCz>1Ny^Wss*h`eopt>@eEjz0E@ zH}RTE&I)wn1ngSAn$j0l(Jb3y5XvPt?hy!y%`1o-sNcobISx}cQ?y%r(Z}Nj#Z+_^ z`+c(VZ`vZ{U-ibXlREg(7Hu+Kjw4x8^wPfFdRdNo_mm&tj)O zO{FYDi-@LeF1^@cYhudi@mjh#PU>1wp7|G$r}kMXea1ozj4bhw{A9^+(YGGuQCc3` zAsKvwwfH%zL@pRH_~cqPpc@vmh9o-SUAbW_q02@-aCXOChz`(-sZLfMh2u$s9R)() z{$@>}pN;-;avJtRW&we+nTxhWz!+&7i$PkXqbudn@FyV2@u<$4=E`ZZ{37=1WW*$%uVRM<#>dD6l!x->&Z9+9(D)G z?S>m6ZeK3{z<4jL*LnZ=B@Ltb?=50nLO%MQ&TvdwgHf&IXc-{$X{?%y)fl?>S2qow zjzjk)wJI>aU3_KYKC;ZA4Ib7_tM>~Pl-!^xc*hvhagGVPSQsIn>DoKTaf^WcDi@el z(yJxGG^C(vDSDfkXo5dp2~zJ@_E9?jC8ALQz%1gHM_fI|G1MrliHUYowO%g2ADP<7 zImFst}HQRX2#cLd*LOSTq^tMBo|hP`8nEnj=g0bI}o2w12pz_Ve<+MXLb% z8zMg|ZUnJ1E>QB?v?f>N$409hh>VR%5H zt=YajqS4JuCz@%DxOkDIT+k|}$mhS-uuD;@**#OH?_Hj)HzYXn<&j)f+)%9707XX1 zqFVLqb-6SaRh8gHBnQp>d*${}>jM1jKrp^BEq(@+g7T$ecZ)%+ICaCv?)=iBS6k?s zT8j}2`Z@oE?&~Pzn-6eg9Huj275$a!zGZ-#AfPm1SF1{wP*OEfCheeJg)5?MYnw%wRu!=|tQaOg%rLrm8%SQc<1vf7PBq60NNt(_(C z+eG<$iCNxnp2%$+8<&)qV%aA@R&_f-o6#WUI%NTHC!9JT5;Z?P;m`Y90E2wmevb~a zg{)5UX<9i*21wSN{&iD)zw0;iGTq@?5QHRoR5Sxx)c+z9t>G9irp!MDNuiklnP^K< z>QPnWEHP86&>Rm=x3ffD$d5cPSYpr*jT`3UE>>&1Woq zEp`dqnV6rIrA>tAQ1oC|1+p4^&8V#bNg5Qv<*TJO$*u|f%Nl^)PL$5(@ e99W6Ia@plkU%>=Xrg4hZ?C^>TdRD8-SAJTSF6y)Z literal 0 HcmV?d00001 diff --git a/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/sectorstore.json b/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/sectorstore.json new file mode 100644 index 00000000..a49be73f --- /dev/null +++ b/app/data/config/fixturenet-lotus/genesis/.genesis-sectors/sectorstore.json @@ -0,0 +1,11 @@ +{ + "ID": "f355523e-69d0-4984-bd0e-9588487c6231", + "Weight": 0, + "CanSeal": false, + "CanStore": false, + "MaxStorage": 0, + "Groups": null, + "AllowTo": null, + "AllowTypes": null, + "DenyTypes": null +} \ No newline at end of file diff --git a/app/data/config/fixturenet-lotus/genesis/devgen.car b/app/data/config/fixturenet-lotus/genesis/devgen.car new file mode 100644 index 0000000000000000000000000000000000000000..a22eaed4b12db40c11c0897094fe9bde9b0a36c4 GIT binary patch literal 7633107 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
    (I9`RvL^=<2Y?MIrv+wpNq&KT@3qI5P{{FOEt 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�iNffO&TXs%*8#3NDy;=ofM>ru*ABZ7Jx=+ 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≈3zE-}M*aBS0OA3Z6Ao@zd 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
    +CybJt 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 +>)e<}ml5_{dl~etg`F<*iuh@-y~5Dw!_b_4VQr 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

    GZw?_oBYofJ8%w@_ctd;N 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

    @I`^Du*V2VNDdfrzK zV|7KmtuDv!3NILm55396d-KASEjyaNY>G7S`!@T;qMng0Mxip=Z#B?5i~3-Y8pBiO z@G-||FD`9GSUA~ZVgV9`y38pIj6eLpm47>|IRwXxiJDM@p7Ep`H4oJU;!#Lmn;vWz zE|Gi8dGa5;rr&c9S?y4NBaivHj8y%)gZ#Ve${m!Ex5<)$h(`X7Lwzucwc5y&Lu4uv z>aJLq>j<+d4a=x+nCYxv)$jYySZdXOAhEMUk}K4@p=1Kc zv5f!u<2}RQ_L74o2pQNY+)mqb>;Pm(%3QO|#rWmb88#2!JvZri^$od8qlBZC^9@rg+$!@U22M!gd@z?V9Y z(wss^A=5nZ+KOoK!>hcZgH?{UQJRgZ}p|{`XD(_x1kw)%M$3^8Zm!ThVxG z=u+0WtEDsT{GS70-MpBwEx)WCDrDn@zUb(Kj^?e{;Mhmhx<7JtvzE1+zHsb}TQwnI zKIBRZt$D$`X}T_v}#9- zcNzz%IK_&GPemzxjjmSRYtjlzC-C-FGrl(DH~+Gv&_fPK#h|JqL9F{)QeO*XZ*rbN zw(u1{o*P{U@m(ES`~MT{PILX7lL6-`LPFw_{k&;jQX!vZ z*{sgCpisEE`+=02Q2YVu_im}6^ds$oTj0K;?4Yk zVj>Snkq6{hIF(|IUnDk3eDCjAqP~M=cJhNv&@4~=>Ty$Ml^n-@FB%Rj!>8Fl_h~b`k_~4%u)`@)V$?J9?4x)@?zD@Y{nvoh(&wogG28a3J zT7Ac8gj}g|k+AVve7nbMhprhXJlxM_E?Q`#Wd$=f<`L$}i1Fog9uX<*re_Y%;eaIN zhO+na1C_v#`_Lbk+KLA+d%s#+%0DEpRJ`8EAFaMVz$+ov50@Dp0`igKb+LI_@)ACK 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 z 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%0AF6XA3b#b#wT_ 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

    IKLIdUOn=mrL`LIM3WoA4PUwf! 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

    }`=N^p?Og!=Uo)fo$ddO#6{6qrlHITvowD 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 *j_% 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≷uz+%LY+&UyW_3N0A3%v#BQEE@eg3IjUMwdc}k%m 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

    EU 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%0DmmU>5n3S! zJ2E^|2Ewd^03(3{(;EZ|J3C6LAN^t9^lRaZ)`7LBneQ$r# zAH>xX)(l*NgSz);?4x7n{8RmD_A*Z^oN<5l$KmIdlQR(Ex^FwwZcHou8{vZAX z;`SIn-QPiaWVg6>;_!#84;20w6EUr}_@Q+*NIV567_0TMr}})260$if#FUM^AH>nF z687e4_UH+)I zaB5`f*=FfOmRzq=k{Ca@q#&eEcQF*j(zQ(hWXOurQ(pWd+Lo+TOn;)2kHx*Hi_HUp zg!6gh3@u{q*?x{Fz-deb8R*!Z|DV1054P;O>O1c__r7=EyYId3`+l|BlECL)`j76y zDr>4-k_Wq{`gGY?#AeVij!U6jDOE*Pqmo>V9`bV7!f)_PB%uf z1t`z~1)f2KF3?N_Q8EpqVLG4zCD9DcAc&F(JfH7(?S1aK_r3n1AC>{jZM}QWKKtj| zYp=cbT5GR$V`hMyh%tg}QCV++w=8(4W4B;$m!cMFTXs5Yv>*AKZP^ieaL4veaTz^v z%~0*pf`0G@K<26NSqcF}XpS*X(iGC?v%=P!%KJFaa98^%9h9q@E&UR`RGQd(cz6gW zE9QuL$vIN56`x5t5!l-ilCFK|@`v0#SUg-F_EqHZqIOiE@j)(3PA*r;4&wG$mjKR% z0Y%z$y#FOfaZnSe=3Ih=1$y(%3q`XxZQ3~0C3F>&B=G~Yms`{RNKbR{s$TsdV?t09 zQ`!Im$4@%hrB2+T7rLWhW4BL0aw5RPP*W(Srw~$3;PY-qa$?KK@=g~58gf8qF!48s z7t@M}#Nn@)L>l7FCKARMzG4HHoAdkA3IpTi6 zXb=BkX-=M_VO)+!W?6@%iz`DsBhd@_uo*8#k4Um_jkuk&NbcciuMlIgxfYE23H?8Z zjlC5PdMKNEblgp_oQnEn^k~&h6CGCgfjcAlok~rwRRc9WP}9CM)2~Q!)4^lv&dl0K zIvb3I*Ag&@(Xj{V27l>~%BH5nwI&A1MIDCsqjg5U!GD|XLb7A`3R}!w*oT`8&4IeG z7NaN0UD)UOSfdO3Mw{xw8ge3&z|rPXwTaso{?ad%Oyn@(3nh8q1a zH@#5})$~wJ?~A5Ma?|_W^geR$A8n}VebxTd^u|)P@m}pR8}vtIQ`6!6ll#=TiVMKM zg^^#&e^f@|lQ99lUcZ*Ru)kVU7uM8;>!J%JxeM333)j(w>qq<5h3l&8Qy2DQR`}i( zgt+_Zm&&FtJQZ_)9j%>@E?h4xJXVap&Rs|meD?_o`*Ihqt@f!4`_zT6k1mkpF1*!U z_b$yg$UaNgk4rjCJvAXuA@+lgqzRv#pXdC!=I`Tvinwg~Q zTt|he+Oz5ob78Xt8Oe7vPrP;hMwrZRXL1hl5pB#2h^SJ27MaM;TCe$83n)Jelhbo{ z1Z&hvX{VQqh0L^E#0TkI@LgEw=}hhe(x-sBjK2!)-hpx~EM z!G3vIW~xa3ok>;kAF2AM!f&g)_wMNy-3}hKh*4RH4_*A$-owQZ zv?d1`fGq}V_$9tdBLXUi$Mot(pdeueN$Mj%_*(k_$iN(f8_p_V4gW|$GCxQp2ig2~ z7mjQd9~`lJ(t-Cx{|=9ej2gFu|8jyt0%?aw37@5D3In1NTHQ_uanZnECbH&=`|u^t z2Z&+t$^R*ZKFANbZ}kyU{gSUrJXgZtM%%X%9RwS~Jb6(o!`7fpi#+ICZ|>gC$jrD< z_I3&d+TY<($xJkyxoaU&2Tk57|C7vHtXH+Tq4^sGj{Au;+(zUnSe_UZ7`GEOsGkvs zitYU~pW?SM9f%HhhG)bXt9E*zpF3IA<$ah4B%H@cQ{%X^>R08rh+pCms+;)HW7aCcFAddRZ?u;ZF=3aWdto1y}5l}!Jyrv)%80zuuokxpz72MfjUtrD6o5K;c4a}Pt?c(?q=^0IP zYd)$m!@@wJBN+wNgb{A&L^Q;;4f+b$)%^+RRp^uoHRNl)u9(K*7eoZ=?(mlcAX>js z*3#ZFHTFFIcXO7vGr)!S*=S9d{+RRyt|8jZ`CRfAubZ*SF{lKzS_M5d{Z2w8P(r@# zx-1Ye;G8)4aHH17fU_bAh$1MUgrzPmH!%w!3+z_J3948?xOgR$g&pIOQ9=NIxXu@+ z*>2+xlqWR?Ahgu@9=!ljqFc-FWA}3wgQ|yajxM0l&s~`9fwq?pQ`TzEHoS zqnTa+sUQTdJCXjMz@mKwC>O7?1`L`F#@9O-p#4+>Uu&28Sr{yj}+W0O; z-9s8anYy{9l;O{R51ok>u5H!d)FVpG4EY{6ueK;T^KDD|jY0&u)zC|yrfSwGtLlTZ zPFG30m5I-kCUU)Jmt2Q;f9z` zD}1cCfeGH>k>5QQkWk`tPULSpQ70_RXWEHK3P|K{J5i@6yyj0Ol92QVZdMp#@8MIa zFS;Oqhkr2X%!6HJrpPSfViKQB}f!| z9L}({nO~4!bE1*g4{E4d27@e}eTqN<^@yXgelHyRl0KhN@Br6}Epa@bQ9y`u%Jbk{ zl1C1F2L&g^Ss=N^GjABoa0f-{I-(EiE#m2hIj^6iqkQ5atw~B9>Yi0JKb2Dc@MDyQ zmcj?Z2&(#1ERT~Bh%Ep(Fn#V1&kBHo%tHkfo!^rMG%MPCrwGlUK0g7EnqjL&Z{b=H zoF)Pk1rFYY{vy6KLiPB9s9m0_nYz%9OCTIykhkwiUmAgXd_m%l%+F=WG@NP)8nv3f zk!>x1OG$iPcalM)M$biz>$LWLFLKBP-H*&$Zp?N&Y>ki7j6#rfIxA$J?I# zChR!pDMkc3cXMfU(BvQz&ld?jkr2`GX62|19&k)xwd~H(NV=GKRuC6j4=SS9!cG5p zYgX7e)4U{*RqGsxED0Ob$3RbTc-6{aeOCg~gS}G;bZbve0BcJ6+&!kL)e>-@L(?1y z^cm0EIe%Uz%Q-<6oT36RkBe@f6G==NU~XsICfh}|gT(zEU-XuQ37yjFvSTB zy+NxW7ue(qF<7{<;#ihAc7)kwAImV(N2==bXDW@_xmsc2&u20o-1dsQ;-O3C)X*IuZHA;wYy}!IGdF#IlEN}j?GjlWZYn`Rc{Kt#(~FA zbm5$K+`JdkfpY+mb)}gO=tQs)qqV+)HCp=toUxZm^Nr=Jm8@?(%2Q>m|1*@MPEm$q zhWOMME$sBAQLRx4WvFC5eQA_&P&qWz;LAAxtmk7qpV4FQ7!-6^co^$&_{TPYq$AoM z(TeQc9<`&yjPNkCJszhbjpmpty!`g~lz?>MxVOic7S-BpkLS9tVtZr?sZ?uy$M&e% zo!%ZbQ>GKjKiMAXMA{xD+^IkHX?j?XhJUPmeuRihjCp?b=oDZu9mr$O@&zxbMEFJ(VBe3;@OyOYD#DYvlfNVmNDOgGI zGd;<@P$fJtlc%Vk(A3li^1x?Gae$#_XK7$FTQf|m_zi8b@NtQMG&ck1{)?G8BgZ-R z&!GL=lEjKDs~@2hh@{8k5dRYmn|^_)JN{2Kvaxk%>=b%T!D7TiMG z8kl6>=~=R|&AlX%Pcw)jV&PVlKM+MxUZMhyTF^FNfryPmLSh9qW(d(9KAh)6*kfrd z`T$iC^q%H}TrCB;(+7ykUOt@TL-vb6#46rakC<{G!&l~Xm%cbuZWq#VD#Y%#MoVl^ z_Y;JUrueHJb=zy2Ku%P(lF+0~zj=3N7;CBfnZ*+&O*Bi(nOfC#6BOn}WI#!D+WRC) z^dWd2db6x!l%auZv@}YD9q9>wOX=w~3=Kj!+drw;#xfbgr02VJ*mDE)*-Sa& zdP7Qn7BpE$O8+i85E*FaWrCoPko%yFXR8C%9uXdZ)=WDY-jJwUqLMD4DEsOMO zpOBRw{RmV_^H9=!N{emJ`Fv0b1WNge;mcYuTtlRd;h#3oprALxvd4P%>~!k4p)pi@ zHc4|dK9+q}plP4Vn{%q$VM{=)-d#-s`_n)n;3FZZAS5ff<%eYX2`YF_?Y77ktCP*G zpzvlcj@saj%-Y--W#bS+TiowY!br)r4}yQxL5xfVvpwEt`01c0VC z1QY_*dj+FqLu{&Vh%{2N)|TRK?xTgwT}AbeG{A%l%fLJ%V7BwsPwW~FLA%dvR`ZrS zVe*DUR#Y^DR?ipb@)`e&of!LGN zc{iWV50E8^@@^{Mp%)gbEQX}b0{i1?z9LUnRDmHFmy)~>`I5)GNo$OSWV)(b8@KRl zo_}I0|3SN_ykTw%2L2o3UrVK|Rwty;rdksQCOZs&B; zV{^jx_*boA1`5KL_~I9Os1L~-lzkLRF~`xI*tkV5l7H=)bG(5L5Z%=Dy-H(sBu zhG|x|J=gPtmC**hg^j^ZnNHj0M;Jl&G^hJ8T9Z-8CiAneJ*S&7rzyQXPr_=o_f?-$ z7P)8+{I$66M#iL(jmF;BGWknXR;-o23lg#l$Y34;S9o3n#D_yEjAI7#ph{W zLK0baV)a-1m~WJCMaiu0W0M+wR&2GF2VZ)_2Yr6fqpSTx9o=LNsPiNFb(-|DdYupu z3xTf!_T^SDk9y#oP!9}jP;X9%2s})NAL4%$2w+Dc9zaE{Chs}Fq_Ag*k<5fjxJFtzgtU2aL=<{s1Wyb zvYlWJ_>j!w>C#F4vg4e>N{ekJqEl(Bi#58uECSYnHjmei6rVtvw#Kao2CWNsd~A&Q zpEK8#OK&B)#wFnoOE5<^7hyq%+pz^c#kh7t$!(p zCNCpGsvrB|FDdIwJo5%rIK`(OnRgaO67giXsr&!0sz>3ADVRt=ww<~7cj#yR4fO^6 zX8VuE=I)9)jq|y#e7)hxsj)XBGl;!82bkLfC?qdp;dAYBTxBJS}&Q}X}ONO-sqJ1a-u`_^}1w?SQ zVz+@lCoey2vw9n&WfqEJhSRJ1i7rD`(D{p)qzwUyP)Ewik1Mig@J|Z_*&*toN>_>m z>XzBbY1SbrY}01e%&jk^W*5{bT#~tlF?+Q=a1)$Yoo=;nZa=p#+}O^yQ>wY8Kk1jU zvHu1U#!h{aDC3DQ3^CYC=j*oC1`d8|51m6&RXt1z}!#@yw z6X9gp9V_52F{fu@v=u$Z^yv278KLbqN{zC{Tz2>yHZcsg&Fnp&W~Ou-bsbD#seb5g z0Z*FFf209KbNZ{5et;H5@jo7|vh#__t<{63gz~Zb=X|P-GYa{Zcjnue*G+Oap`d4HZOXMAkP_upMokRseU|6v4xnA#iI$;BV}05k-M_hX;&s1 zyzNhKpb~Gx^u~dkw}te^_Re}R@S^D%C_W7oFK86>4(&{29{$S&ekSNlDHfqb)u@4% zx>+KEY*J0RLqtOzb7ksa#YPaeTm75MWpD(UyEAn(y|(#;E&&1r^@2QuRRKLR*s%0M zNNbbnQhTH@0wqt&I~3in&r};Z_7%+Or^VjNEcdz0_1O7wHqJsrOnqzo*_}B`$tbnds{AV)#cs$iz%& zGA}kUVgF-EfXB4zFCaFUTJ<__biRGE;wNL8tavSvWTmWC1rr_W71JTHPTp`dNX^w$5i(4Q@MWrqF(r4m>MZ?2uUweK zER~QccbRg%WX%<;Pb*OWRO3Rp&gH~M=OH5it(yDq?j9cfG(fJ45k}auTjfM9b61@T zF>k$>Ahdj@+7KbIsnwsnceKdJWqx0D)r7*g0pIZeSaiATr}9ow7*SMmniw7T zBR;1N(N~j|YTY0viWqf{)2^&)=Ed*%f|!h@a34EeW9p6?N9NyZT!(Nm4yLEWpAd-+ zjgvbaT|RO@f)2rb8gyNCO-HVyA$E;)a{h2P<=4pCq<%1H&o8yKe+Ul=pY1Q-y<^zl|?Pk8O(v zA9OYj`ocCvX;nK+aFA6!Mrr^f8m3LI5llA(&A&uL&wl2WHT1M@lxl~=YFu~#CbF&% z1_^d|pfl4{THO@tgtXg)+DQ#cn^rq%Lay6}<5!-;ANZP{!zW)MvV1k>@X5KdJ8@ia z0`vctnnX(^|AUNts;d(Z>|Xs}G{gh$PvY1cp%piDUj95tEBxyTwICNSDnZnw2kt51 zg-HSzkV$xMlE5xb!n2cvAVAMd68QX7e(N6j38>16d3)~qJu6uSo82%-@ZnN!uHF6s_qRP+=T1mm@^SnS5G%;W#sE|gcF*Z>mlFLIfE^a zg}gD`mIsEFzRwW7JA4eKE&)1vu2b#d-;CVA>+RsMEDj%9>^F z$O4W}(*IZd0L<%Kqe>%%gHkW^u;9(1!;)qhGfa5cWsMt&$kQ`GErR(8rbykC7lJM- zVT=4KYs9douV09jLU(!LV0}|5-{_o``MZ$Gs`exupMNz-9eT9J==srJ(Z4@1wSvE@ zq_$?Wvynx?gxyb#)dZ87285Mm!4R}L@;WNZ!z$TW$w+uhQWq(&nYFH-N#wYCuzbGI z{RHu4bCzqs;fJi=-}L=b|52_BU*n+dYFv9H9mODnyYc|<*w1Wlb?R@dPyKU#v!sc9 z%kCsHz}#JTHrX^2H*mwtP3K{o$g^_?JlQ2?n7 zye2H1pkwt7-?d?Jw}~qech%2_L2F45<)K2ns1AI+`jbdlDAE^%bOxl&z97_ZAmrTE zF5oEO6+lSL>bP&nGI=^e!zD^mEI7ouxJ$1Ums_j?QIbD$SN$wfcWKtei@+!u*{ zKrjAs3!rZ>x?D8KcSo0tP^e4)_Z38!f7iVtx;)=)ql*h%5nV3YN@Y~OGITM7E`ctW zhK?WygkCYa9C(H3@_lnXIro{ne=bV{x7#N@42g?T_lP9(g~WarixOg?s{x4nO79|C zxGzN*XY|K1^ijmrM##G1fM=#lC%D*stRHynl zp0P)zKGTcgKWsNuMN|7nXb2314DDlxodoM>efUqc-^A!5ETu;1?;3ZHp5s`9fbX}i z6c8+)@QU*x#>vwbvp8Lin2BydeS+yh&8fXh0-w9SEY(xemo<`WnY1-_K#ub>$k-5{tG+h4(k#v|G zenBlmk-h)-PV3$o#TG^jns)i(K{Ovl@gs%82d6?(_^7PR3zebUJ*`T}Iewel&!spKb{0eUbH6A?Wq(ylgCu*6XO&mGkJdo_oJ)S;IFRT}>U*(W zpT?1};ud-iPX&f)05ZI}?DSUYjJ)*Q@*~!enU>OlPDqhI82-LiMO_)Hm1Rl%5vAcl=ozhH>SGLR$KpBl*4Vwt8PM4LZ{s&)+)kUnkyc=RaY^v2wf^n*fX&8xpD#slVX)7TF`Xye)rl ztvy1kjy-h89x(_iYKH&dXjywi%EdJeh3wLVEVlLtTso<$#b%H2E;AgtqJ_~?Ymaco zR7ZP{m}!&6Bx6(ATxny)Tyg$Zg*EpnZ}^A+9i5Dg>{jhpqJHx%dn~69bx*K0%mtl4 zN#PGsnAB4}sM1s=a{9r45PD}g5xXeP8MI4zS2C0sce5*ba8(R$|A>qReeUWp?zh}( z6_)nl-MY$pnd<6AZcCKWRkj7X3L3B{mAR|Al9{ev1Tst}2QzIjd)S=xBPs-Po=p49 z3H{<;_gFd*@dE;k!Y(uDME zC3$c9TEOlfPHf3lVt0${`U`;F548vPCU*aY!tNHYJ%eelfOem1Bfwua+WjN#!M%yy zQ`o&#aL6ruu1L!7)|sMnsD!sg=SxJOV5c~#$gYs|V6i$8r4u_Kv(uT0LZ%C!6ik@X zK<9t8U8^vlKN=WRX^I4SDlah?b3BF;pM66 zXX@SWxr}{oBsH&}vtu-0twGOD!&AZ#7fuU%1rX%amI1 zb->itVV7TS#;qWSsr^%~X{A*YY(yIOll~??Pq5fNE6Dz;(-3rebWR(7kNeq|53QMg zez$Xz?A#~xmS8b&xptc2)R#YbMlCGuI)?!ZN4oTUz2LlqgfBe{#5Iq{FQ|^?lb=ruL5$X}Wr6F+UX5DZSjyqT3CQ8f9t0G(Ul$o!AXES3nS$W^dim&F3tSe(^E2{(r{V_m@`Z_V@@>d~z|{$?Q~J z*PHefr(V>>$HrZI=qr#ES5~-ok=~AxpnpIo_^NBiv0bg%3W<8v<;=n;ky0lsY-X67 z;{pbxU;$F#Q&|T&F>*9%E)k=3>U-h_#+}^2z^RtJ3}UK=kc-1Wkb^D_(8L~0a*$(p zts~gO*;V2hf1&AQzEIIGMBL-O*_>f0iH4=#xQ5_C(&sg*-@|`h`1VysA*qCf>0P;b z)$wTkgCp#2)y=hP9mx|ePi23gJe&O7|2MJC2*0rM*#t=TsnU`{dq+5&rP__rHMoxL zR;y#2#Uf0Ix~@?Tcv+>Fdo+~Q+)EnVbW58OpU0>faj)7VH(l`h@23*p?jCQ}c2eBk2RgW$C4i!m{|q0u{d?~oT|-~cB_a1h@UkY_pD)_4O6n!Rr8II7 zqL8dg#kXsGL=vQOOwk&V88-yl4K(jMw{UBvS0Dcsq1ev`im9V19^6ghX;hsWEjaCz;(w$X+8AbOn5|Ch1j%R#%Xq}JD#x+#wM#^Pb z-_n9s)is)g)g>lLQzM|*9%e(B#Z`0;&TI96OF)!ZX7M-yh(Vzy05B@m4|&eg3`riB zQqn9^Gv{)2YBnJui9t}!Tk)pbySYVY0nx!Ef{5Fxz483<6%m&efbh5mDI zUEIRw)%fXG*MKA7o?I57qYDJ5VxHv^0#p^Uj#sbKqURD+wJOoMRy@_??CsltNkTNl zF)THZY~EP6Ce)lK>qhDTUG4#UI`ChsfA$~EJDvV3%{ybIL)YjlonoHV2dHdxWmv7} zu83ekctkPRzr)bsGMhRRqXzEPHQ*M#QKlZW#=W?{dP}tzo(2Ea)ph#0wz`&@G(mS$ z3kxY-wG*DQk09``ML?(rM9?0liC(E6@k04xB5wOgd15N%Izaf8Q`!VDQquCuw+#S+ zmQ;4;z>InI3MukM-fB)eg$xH|FI*>f=A49V|NsojbzuW(xw(ObGd4ZmPM{EZ?NdALEAAuL9#nK5}No&EMB@MQpwYy65i-e;e$_No%{pZ;z{OC^NiIz z#Mf$a9mVE#3z0rD2i61Ox9;IOMc27$X1?X9|o@x5oX+Nb}ehs{ZLQdn^0o zZvQ;sG0u;5OBB5XoySjf*;cF6@K<*R7y+f4KIb0|Hy3!phgRZ^|SBmN?|?xa-B&{nBB zw-}PLqC=UN^K|qlxLzdVymTg5NB&G6{dNfsPVVXfs`hoG7!J1>mWF4eM13lHukppv zy%~^?>GL+GXDsOrhqK^Swy>vz7%zK(%5X~E`cIu(<@QOS6U5Zy;!=y0VN?bm%7y>|>iL55c0(6HeO7L)92O9UgTv1WBw+3viAabJ6nO}T z;fyedlaULfoEI%Q`9{8IcYV@tFMmIP%W{-mb39~_CP@p&@rC*krzGC7nUE)(nwX7d zLY``;((-Gc5KI!aw`6W}~=&p#!W6nc~^|re84W9W^=>$g5b$GsE4<$c^|SROF4VKWd-V5P!1 zb$tmzTL9$*Q-y0p&l`y$zl*%0|B77qpsqJ|5}DI)^kWU<9a1*yCWIIe>G8-RGDj=ZshvWfSU8{UvWMPgRZcC|#pT z&Xo!}KE_fD!3Cxh%Oi}D)XLz|BL^Z#YqZ!LxD1cPRoc%i#n-}q?Y{!(un`!~lam$g81|h9D-3gC5 zaR4*zYDi(zHESb_CdU@$fXv-s7f3yJyF{If4y%i7z8r9c4ZPsfljYjH!oUogm+R%h zQ+sM;WequmiN}O{IE*ghn>Pe#NI&sH&H#nzvuNP`G&Ze0s0mHw6pcvkmIQ||M_?_= z*}CfVT5MJvowQk6upvwa((>R*gzL!7b(6~F0zeXpP5=by2z;Ifrq&n+o3TEZe)`(p z603Ji^Nq zhMF1UkRPgHi|%sx$Fd4jh%lL6;UIlM9=pjYRu-#0r;!&Sl&3p(c7tUj zY-KSTidWC5rK!=CWn{XAP-Z=hnARg`0x3tO2#Asb2?vFF#50(MB8+yyfB zmc^5lMY8>e!i1|D-x0Wvl!t$CTjlO?f&FCLQWI<&{N)s#?8y9V`WGK(=$!TxYVff; zian+71Q{ zAH`^0+Y(XLl2&7VsaltT{wfl%b!DVt`wLo?ZyAJVkq&oX1h$GU0oV=rRX&B7#QeF0 z2P1`tD=ms?mv|XK8rAJcGCw{(Nj))nBw9|+aBlL*ET#%hVT~37yzz$H?N^&fFOkn2 z_z0-g#~~8X!D~qxAU3ibnR`e^k-W7BxDo?Q>F%ycLv|{(bA-$6#5;zV%6tVJBS}b^ z#<-v{A~r>8$C-{4Sdp<&T_d^u#tog@#y+SCt0fiM$N|RW_Bqm;6h3m_;b5n8Q)iv^uyL^S z*H}tHB|w%R;XLyeh(PwpQ`A3te~U5l>sT&(5?7?hHdnL(u!Ui7$rDfU{CN6)bq0-R zibE$UqQW+T-y)ks#W+L8NT!3GbzUUNf$;!u_A_oo+^8vJ3Mg`lXVR#)n~(A5sYK`a zrv!zq|HUi*T#*)`7W?osVoavit0rSLPeS)zO~Q&+YIGCX+go@#$jn3n%0kpJj1F{V zj#x1tW3P`nVul>3hSX+;n72&@_v=*qu!p6s%~*w-qOzd(A_+d#p*h(M3Bc%DJS0QT zuS0&k8N0Yh$^PnE{amAcTLcj)`F?8OP({RH?C2Q|R<8u5L=Pmk#ZO4RCp^o>glE}c zB7$d8AVtU9Qw`eX_G|M~*6J;3^V`t2xW9S9FQ>$*%2p^6xbGYSHy}Zt`aLEdJJG;eE|v9S50s@2yi+` zo64^Q^8l366FiH-2;a%6Zo+qB`UxUufjYvj*rH4r8|>Xm*sJa8rDnToZ8kfR7u1IJ z%DdJsdyZ5@lJ#tY(na?$IKl-6Xp@$##5&c+@F%n+6vWdjEu8I;&zLi8VNPA>cr46n z4NQlhW?%@2xX*|>3{)4^i!w#u;PW<-&d_SGa8M|brA_{122JDCU^e+Pl?F^V*@ttQ z)<#F1>^&rVLu1cGGhWbVC3C8|X71s& zPKP!-`&$Tw$$AAxY+9g`2t%ObUcztDCVZXuh4aPV;OuX7_qKfS@puE z-Jdx-zIGsnDsBS8LYKSpbcz|g!fNE$DTVK#IlRdT|0~$vD^9xT$45m(FHJ#wRBrWI zr1C;@Zu(R?G4gA9*MSVOIx*tW=HFop0%-`&`bF&wFG+7|{t1I7eBJT&MnogSe`voR z^d-GNtarW1lMaUsGOD)skn*H%jo-xR%KGob@dJlCyqwon<8Y%RhrPJgQNyK7+J}Fp zW=C4l2z*iqCY}^{sU@HAb@++R6b0+&eul>CDVr&(griDF$4~Xj`PQ)!y<-;oNV6-6 zqBsCd-OxCU=ZB9=E}-GZzl1V1x_n7uwvnLW;E6C`qY`cg^D_33G55F;iRxp;4mVs}GscM6qtjQUH7PfA?vT<}wra3XD#0bNpK~Rx%a-$X=Y766?PX;1 zC0`AeOPYq#Ft2t1(qz4NVG}s~tRYHS2 z(`mj-dBA~$vt@2>MU~L8X%~$Wr%ly7nq2c?04YyPQL^lFHlpE=TtN zoKfOz$vj)K5#_+91`nt{K21_Mc5s3bc1X4%F;ejUnn-&3i811-+g1pK`G6L|sD82S zIuP)AYBaG&?iUj*czV}Hz|goGd~T);bEljv*1D_7m-&oDF=B2#)`Un_BWf^b8$?3Z z^Ke2WfA#!j!%3=@=oA#4X#ngh>=I#mD)gqUbU0r0gjljOCb|pknbnCKHaL_z4ph+k zL2DH5igf})9LH3dX|paaiH4})WPt}o)x0rY9_hXkc!bcdejeK(N{OJ+z#REh+fteU zDdrZz0tl|SG&ur>5@4}q*zmZg0R=9mHUFbU>RuKW5pn&SX=2$&GX-K`3|1cY%EQq< zGOQ&fiYQdobZVA+t6%_*g(;(AC#~a2Ql0Bc7?Y8GQE4_lAAg3QB8w#*90M@27Ex38i zI^oyI$pc#zOHU42wuK}70t6l$bC{K#YevOEX%_kL}b}$qYQL1KR*3k&EwfmG>@nL$L8_a z-)GmYx+$}e3z%IEFUGJKkJ!_ZT$PjkT4L`F>?$Ci|$W8hk3Q@+M`@QsV z)t`s2(|>Wz`y1HOwmMA5-Q!+NNPDwnoMi-MV12^!^JgR{J32+kM^a$7-k{|D*gAW< z`*16n`1%2U*mrJWQzKCef>TDTq~0jG&?A7PyfaGP&Kqg~QC`jt!?V^G_vDs0 zKGfTBRFI!9Qb-@3)wr}{+=!tPyo&BJqu|#FWMy<70*UD+TdKRn;|h-&36HY(=YqQ) z_jW};I4utUneaJT*s&i&>PD-Gyolnc-e15#Qe!+%q@&R~=^JQA1`K&{Iz%DWnk2Mt zxLQl`;^Ba6YFziUav`eB9mUjIyP-QOG^e9G`geQu-PW%7%Qw=ch+NCm3eU9O z>SY$a+sG6C_`X0!30j%O7HB0$*Fu@exIUdxcH{;V#U-YXp7XNaScV{wOTG3^&LlqG z+XYTw#$;+W{ZH@8D&EmEPcG@W1RixkJf1EBf+*>?MQfH#YnERJS~K*@{bvGTtjX7j*2J{33}UJwIeEFRG;u|DlAIi2cS3UL zlufZ&mJ8hMNsCsK&qcdL_w`M8#dP&fS8W%pV&g@$-LDVGVz4!U4CkcF#qiN7~pNKpr45?(*L0Q{%6?}Z==9f*P# zik!Cda6{(LNg$TlP@^Pr$^ zX;579lT95tg5tGCllaq_KJGS}#GB6KWHivWs~AqJ>+J#Mke9kQ)eI<@1cubinM_BV z0kX>jh#rg;pi?ZN6WTH~uiiL@pA&WjK0jT?BH}~vAA3_Pjd^r@0k+x(sDnM%$8!Nx zW#C7&ZRksLQ$|z*$5b>dgwl?J(U}z6TqDnYbF#Q;lHaYsqhW8BHz3598}&OdRhvqu zG2K~x8+Y+i`iACAk|fUC@q^um2ETErJiwCLV9P8Iz}d0ioToP;I|he9wk*509PZt) zVRXJb5(uL_95r)vXAO%X-CRDH;K{J6r8FS4R*4T9dx)4kv+Uy`3|X?}_Y zKPi7nR%1D7LjxN5+)1CCv*a-4Skvf(GpO>crWGn~VRnTo&9b9d$;MWtHS5z0{W1Hs zXb2eet35Ue9~j9Uv($yO+gpn)awW>cJ>~R7E-AV*WrSBjS&t#PXCNkP2;w@Wt!Gm&zxi6=fu-$vM?k&?Dcsk3W?UI|nuRN#YAk%= zV1=#$LoMX{bY2H(j@X>$66S9Ve=$)bh^m+XlIcxx_QL)LZ8uVbSci_ z&Qjx7o5TjNTz`VTT7F1GW_L$Us5Sb*6-O`6szm?+o9TmPm2SY7n6U{F1X;`7#>=W% zH%XUA1MtLij!NP-WW60>gl1hg>6vx1avVa`!kqIr6-2fHY`oOjv5|f7!aQ=N9{JmN z;JGBxcHAqXGQMzc9shEQd_;Y|#jg1nAln@;kx$bg87`1G$j+xW8(A*dlQ(F8)AvjL zXZ-v)9Wf-)0<<;SYIS)x+t@ z^FP1s^Y8Ir;5SReZ?NE$NLo1#Vh5P&Eh`34^8W_;-QLolm6O;tcup#2rG2bw_f7ZQ!1-eNS5S(GBeL-*h>;=M>Rd#>RX zQr>`|((uGTlAbohE&U1N+VJIL6Y1`~SR~A0g~{@SUx1)Xl|<4v^BOKqwZ&A#Y7fFEb6GoHuuTBXabO(&fjipKIg1qjHYv<(IWx0z<&+NFp@y6Ah@M&5z2xt$ z%Olv<928sMQOJA2q?L_RLnJlarnDcC)M|{QNTjt;4FFa>F$u)8;?e56PK~xCJ?gs6 zEtKM8P?fz)jUGuLO7!S;4BveUrQf`ie!d05HQ3WJy##FPK$enQU@;{!y1{eRqem$6 zRS4hx2VXZQMa$s+E}rW$3h$qgRAfMb>Saa$eSA)Kb>+lb^

    m7xOWb-x*J^VU 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

      s#d6)71G>APJ&mOtx<-da<7Q?39iOaN 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%0Ar3WX0dtbP0744;nF)erQcPSy=x@7GEp! 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

      3rlGYvjgAf#jwIJ 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

      IRW_NRQzuw;#y>Aglc_8&`8M9+FD9UPR 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�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�@sN7NWzFcm{??g1RivvAW9pYm}PAniQ{m)G;x z4vDd~8TN6&zig+}tDDPbU}wR!?h@o;EAwQCK4w|7u-wkc%lx3+V+W_~Eb~1Rv+;=u zS=<*kagKD8QdH4rnv zsFGq_b6SF;ttg#bI^9GE%Z(&`%Ddz@U2O3o zqoD|RH+xjn-%x}N09xfC&e5CRVw#7Sa>D;|grh1m^Jh`OMS!xP*216rV=aG{7_YZ5 zFf21i)V$^bvn!y-tN1{5JL0hYeh$bnY0wtmyd9(7=#Dq!*<~wUoGqSdBbZ6{FnS@Z zoi8hE)5Y8c_Uyu+`qARs@;B)ym&2cXna!FBTTG5mFyG)dVp?88E?__Gzvzp_Au+xcwx}hu(?|>3 zMTTIvNT%4TJ+icP1i$OqzqCwhvk`V}mJRzDpPwhO$<}*ezM1=hLQPrgV%fGY-1X<2 zL(o!5{l$j=92_sN=x1JbYtkBGDN_>gye)oB%YR@7S}aCIRz{wB&Q<=GnkSVACGc~ONv7V(-IR?lM@juJzb7D zIzTr(iLnRmq=SH%PE$O4C5#8;{=ac1yvlSxg#Hjyeq!yMdM^pZniiLu%7RQzPftuu zNdZeq>2ObFK_svalE77_+*q-TnaLoDq4NQJy4CZMvDQ&F*rDXEDpNWg@| zw8XgNWN?!dmyni_n39qX$wJnUUL;>*=(vgQ0gtq9%AWSwMjy!31at(yGQ3LbgyM=SF1|NncU%em$o$<8B z+sCMGX>8;Jl4-z4}t0zKhFE|$3B5S&cE{KmOzvNUp*$y zc})KPgY!4&HftVTF9dT;k31FOy%>)zz5np~eK~fP7nlQt+J3Fx}Gl2i~<$Em9nYlj( zesjRz#i;ytfcAPQL0a~otv>3X&$I`|yDj`__cPg}*u($H`CduCp8Y-lx98V0-uYjc zU*|k@%_(2yainXX^R;mHBkW@=d>Y=VbN_6v3ES%?6Q*3z4TK+sEXb;cxg)Eb^S4U=ZHowZw3Da-h z^DD(jljX$z!NQGNIOi-mXEYgKHJxWzGw;@yMrzUxAlwb_%Q2iquV*cK=L2V&mjCct zcp-46XZdf$JLd{4d=uW;Z(8^>weV+a;hzDgJXzr>8+QDA;2d*W{;XR&eykSG^-$Ur zR(RrVZ8+CQV{75myH@x-_;W9|h0h00S+wv4CVuv0!P+V%o2)q}U^yC-DaOwz)K5^Eu9p{>_h0lh+y?pMeg>M2* zd)Ny9EO5@pSok*Jc79$0ZqMHy;67XUgTU?e|1aS7^xd%E0=DqFiJv_gtzMkJ{GeZ% zgtRFSUGZ2r<%?x#;nX)QLkp*Vp7TVcqr;hb zsQxu{BwOQm|NqGKJIgVww;Z!&JR#w_psY{JpW#`*eiV`eFh1QJ_n_etUsfui|27G? z?J)gK0`cffQ02-i5HiBo(KrY*&`A(>g>oQVjzT891`33b9XuiVBV3;);Xh$)6W@wL zCG3|g;oL$Ab1Ni-m-yw~An|KgNO;*g37KEU{}B8VUic3QpZrupUWP>XWiGiN?uZG~ z-4b7F!p}{Z<&o}dOh_eyrl91RaJvaRV)2yjOHFv(g!$ppeXj{K(8w5WlL_0QQ4wEZ zLO+xQ@#{?JK&MB%%7l0ozbYszx;xOQMR*hX(Wr^9Fkw5?6Y)(Z%xEO>y(Y|u0Mq}t z374WiiFa%&;dT?|!T6v%l_udD6K0{_iGOawrD%Y})6sAUkC<>78XoZsG$6unO}G~F zLVTueiF9pFJb%u z2{Q&tI4oPj{PQK8cY%aUb0oZfkc8U@OL%yQggk&i`T;0M!mJSz7LJr~DcUdHpB^pY zkuefRkCiavA_-@WlW^^L3E!I_p&#v@@v|pNxF}D;ZIdMAW(E2O3rznh623ZBLVuxz zV~ZqQTP)$X(6H>5pD$s4m4tg2NSLum!cA96*zOt$S6nNh|8EjrcfEv;8zrn-ETOX0#Fv@=H%oZk zEfP{+GhZuim$2Om2{+v#Va6&6_ueUC{#_CtUoGL%yCv+nR>JM~N|?7!Lgju5*E}F$ z)&>bb-zeeIhb2tkB;k=qC0zEngw)UE@7pIOT>G?yW1p4K|D1%cJ}=>-tr7-blu+3& zA^RiJS@g1m*{@3Ie_g`&c1gH)w}i9yNSN`KgwgvXJhETHr{9rq>3b3uejs7ihY|)3 zN~j!`@bJeHZa*R+`&06>^fL+PeIa4~Q3;2AC1J)l62^ZgVY?qBZ2psk{$mn`{UV{` zgoNsE5+aG;{Vi*`@6ATG5Vw}UI52{^|Ai_a!0oF(m>q8OXLv91*Y4;U2GDuN^*0bw z!+Y>I;J+)5P}%m=7{aQRFD@52-SC^$Z+0^`VC9x8+7VthWk52al5s%}Ve68MiiQ8- z4Yv?ZUHI*5!e7Y`cL5)E{*94@84ndUAk1FYv?-zDf4UXnih&hvh5!2U&V<39|C1#A z83w;?y?)6N{_i#%PuP6(vKhi3`6Yby(7%=o|MM<+jBxMvXZH$!rQHvN*>8X9assZ7 zd(BPwZ0DCegv#`NVT30)obnPLdcMDp@awA|j1c}xTomEAJ^tY*G;&urApGY8OB)IQ ziu;=oo*VnGW`q+5UEGrJ_64U}3;)Wu4Z;;oKWt05I=M{;!tleZItl+?W4jR!S~Mns z@KD2*DTICUI`kC&c;_#;Cbl1OqtU(R6DIbbH&pm%-9MUec6#~*!ii;F^9et_=x@cs zzj9vf80tUJi38?sQ7Vz-J&q@El=K_9vaT5o_D}jCj z?k$}ypnv2#0jvJ;zVui8PKK*`ufKr)>GK8LyY*=SmBT*@`0f5gmq`Eqasdxd-YlTv zKQ3V4$@AR8fAZA=Zfd=e*HDk*~atZUZ_s8ltLB+m9B;(z0e zB2=%e5)iNAr!J`S3xB^WT7-Y%Mgf(oW(|nXy8J!?{hL!863kEw*q7H1U-|MNx{6K;F7bcXQ92$3+D{>&`lU-o4=Vf6Fu z<_Q1zDRT)oef039!v6#H3c^5-@$-d0^fTe%nVl91|5<;(n(*6pEw2;)YgS)Rxc7Ls z#lk;p=TgF|Tc+GB{1yLg0!M!&{4c+9CE?yD`u<(`=QUVE`0bJ}?h*cDcil&Lc<+<< z3xEH{4TOP?8y*(^iJKoK+|>7#&BA}yCr=SZ@AYjF{+FKj0%35$r7sG9W!nzIZD9>w z75-1m*hNTvDEx=@dz&zR#AB6v*rpE}?6V4ODAMgC(9`^Er%)+VJB^BZ%MKKPp*w@8MRrGQ4>~$7S zJyi6YF_Tva)%e+#AL^_>{^hw1EWz*~7!F&+cS}kZ`;d9vjCmwp@L@~8_VS04^R1l! zxCZ&a|Jvc}@H-QMSU!Aa;oXjxk-+4$v$LJ)@JE0l(!aeH8M<1#{ww;FMc>uDqp$8N zZDIagqnFV)I5gNdd*s-^z9x$8bhVE(W789+rs^hLkUzDcn|aErw|ShvM7tXCitl^5 z$Nd@@%Cs>p{CX3osQi&T6MGnn@)T%w0uA{MnNUogRa1__uc3|pTM&je!0R$B4m_9~ zo@d0_;tVo*swYm_WO+uyKo;}MDd2$bzV$-4-0Am@~O3%Bkju<$1EPqO(xgZB5^nDNBEm z`yny)CepR=L%`2Dn|zoD>YM#4b;>>1dB5ZV%!Y)?n++lUIcnXiLw=8`Q8_o#_z&A%m(b8 z59MBY7jB%#%f>mHOdeX|ZNrllWggON26u+P6z{w@iEd1bZkOSG9H4Php0k^P_b%qU z$f4~5GR9*ZK9}R&+N*DO=Xu2%8{_4@72@~xKe{#D#Ps$*x$S%b}+}Dmn;<%lHXMuSClO%0^;0|JA z@T5vIZg2vqd;JiRB4p`1GxyuucT52s~N*5u*&hl zUW-^ZuN9U@q^99+DeG{9s4H_+)^9Ga^Tn}*!u-*3*`?gqVwHI%-bd$^WtUWlQzZqW ze#~ehI5TF)2UVww6Ap#>B9J_yAe$l`B+DE(Vu!j(5?u1QgN;WKYjphRI52>sRjO=! zaj%V;>a>Yw^zh=xnfK-J#-Fqs6@_ z_oGf*BP|Pm0C;RIoV?im``PdZ5#H|qdM$i6@CLT`sHGKT!(xRgta7UAUq8q*QsTfv=uG%Ry*skh~m1otSo&o04@t)^oR+_;8P zfPI}4@y>S2yG*9zow~ZbVAgEhOI&BC0S=@+10vPylX*a#t2IpXlB&A6Fa zS}v|<;VibI*xUAvDCd87PNe3XYF>WcOz6(??o{JEvd%75dDku5HtUl7+J83rs-u6F zfG-q*c$VUQ8J?T)Eb>Sxh3Tu@fOizL;`R3B*5G`6ezC`LxKZ!3Y&YN?Q9^O7@NiNL z{=tv&tsjb1gy+nb`BQEO0gI32cwd3%4m^Kix?AyuNuF{18>KQ8pQXMO%ogy1CY%mO zry*Zq(c=D@83niPn~k#1w+`3i2C;H!9`h?D zmX09>TsDhO_m*OShU;I&J!6y0O3TZ;;^;0;C_u!O?fa3eJ7y`-r3dE;%NCTf- zDxVj+D}ab_C0VgAn;0%muPB&d%$i+Vk%vpJN8VcyThMK4H|k`T3BKc1I|)R-9W zidl2)Pv?z7OaSg2GuzPWdb^}_Hm+(A_b*_g7$2a(hp?F@2G(;?edY2K*2YX6#I|yk zkE8f#DJXk+wQk-VbSx}K%MoKdGz2Dzo#!QBpdjCT!D!0*P?|-}_Q|AarH~gJZi|G( z3My*gQ`pvUj(SF6x%ea-E~LO+b7mfxw)ljb7y(Ir!#0Hf;#r9o^V0yLZCT^zRdBxm z^)jTKgE;Kx0B*IrJMsQ^JZ#r=y9@6|Y$JqyDKBj}0)LLPc~2nqn0Y7TrHocCrr7TzC)_XSHe?t(%&XVYmzsLjO8&LC0rqe`q##Plnjg5kEMr>s-=yet#r;~XfdY}vy5n>q@vgP@{v zcoSk@YAD=-C{z?cUOwk#`iT!yQ1}@q6Iy7vd3_1r=|;*tC&G8xe1}mTSvLZ}@*ZKT zp%GI3^vC^};@eyoLHCTL?m=Em#c7)%13d%;bREXaY-0yeZd21>TTq67lN3xo<78d3pSLIWT* zabJ10iYuQzc`|g>l-bio+oBxO#$tQp*oyD8(fH1FMf#u3hrO^E>ze5>P2%K%ZJ&Hm z$B-Ys^Wj*Pehf={HVqH$I?kyuEZZn;4f0Jl`Y}9d(tc!H|Avgi0WmQP1T;e3kKuW&Af^CKJZ z(49Ym3_O;O7W&^JoQreJ(9v}=fbgD%(PI2`)Xa+u`kD4*o;i6cFDvGk0S)n~dU55a zFhD|Iw80F4(6M!so-#w+V>uORun)=yZ3D1wKyl8TX1B5wVL7kY17Q;YJ6abcV@|ji z2dG9Y?39jmNmL)z#^q1ub%yAd3+BoQb~3#~bg+LD=~3SGM$w`jyak+P`8FW?vq>ln zwuv%y3>fm#1T#rueGYNh4!0mIb%GUlWEpjOLD?KRLo194d;M)h0zvlA{n#~4&zlEJ z(eD2c{4og6EtoqE`UFXWtcY8VZ>qqJHo$mRC z^K!-PkSKSxakLUZ9&+$dH(2;!3kRgW$j9@U4!waz-_=*EN=9asQhD2QY^3_p$vwlU zHc_6h0Pex$lmP-65xP>j2)%yScvX4v%W&nEye4z5cze;}C{q=#|pGP=D zvR$L7r%bO%z!C+FGY&7O&g+i#qN(E2(Yn=^-wk7&3S2@Qr%Z1WExrpd8yOI7(z+)o zbb%BC7naN}7opLv%>{eKwTMomD zddZ?Q_m9%Sj1}kzw(W#0I`d9T2lvaF`)nZ6Sd+^gkv$+cD|%gVyH z;hpkq;lJRW?b*V;XiN6+;k9sIEj*$Y&iw)Q_`K`PPM>pJ?0@+?*sn!z{mmBtv+dVi zzY%|J=N&IM{cYxh2Y%fr@F54bJbz--C8vJ+^?<;A|0oWAy=?UJ(I<`wyw{2OOEF})ch z=4LF*-u2LJCwu}Qv-^n&^BVM8u<1l2fv1lCbx_JJ{uf_A(MsS$mJduT{o=Nz|8t_9 zz+djM;M~`*s(42^*+t+#-2TGtZ@hW+>Xs*y1pdi}PED74lfF(q*-PMyA5HG`>(sPI zhn~z5c+WmN-#WPOl|{uTa|Hg(8*jJhkoDn?t4@v-_-(JA`|R$!if>+ha=gG7-8<=u zcGEX}@XX14f&cV=Zp4LC9=vD&$>{=b|Lsd3-F)oh@4r4-A@HXvPd%`HxuW9QH*@blcK>f11pemA^-FG^nf3Jc-yRouapR~L zj(y|#+ri(q2>glo_<~XAKJv!#-?j^U!~Dzk?EJXTibkh)3Eb7QbEob8@khFy+9&Y0 zZz?Zb(XQPC*{2Q&Jn}VV;dh&_IXU^%5rKc%BKoF$&nH{1JatsyyRIEt8n$c84J%Il zAn+~)%|E`d>63dOJ9R?ftaE7JRl84BD^@@Dm40@L79f9-EwSh zdY`Iu%$2mq8oOV;Z1?S3)5HuW)_cc)aoO&KE0>HAGp3lUul)SMwP|ndpCLwvIHMVJ zN7MElhTL_n(o0b9@ay({@pn)D*WKbPOgP)Q@s%6W3O;(|Inm1~$_E7xwpi?WdEvWa z<{$G@t!HH(Z#`lAcj60jIIH<-%lo<%4!S8qWv`)e3=MReZ(cm(30PZoGQAz%Oa`;k-3RMm~Otx=7$J?pQhQrmM$YeUo~FzBW`zo=`Uk zeEeO@?UWBLbIwe^Ha=RoXs*_lRqA`+?1?KVGRF5cqA6{d4??z3;7mLOUYxURmqbzIXY` zU-xK71@6yUyDleZ&a+=?KM1_Vs*ESTUi{$oF8zeSyDS=Wpa1JNdkozHEd*OCe%a@r zto5(#sZ*=rEQfE^nqOD?KOLnvlKwyRob;X%yJ4ozn>BD3<(um+z4(Hx%Io!Z0`L0a z20i0Q;DvkjE&^Y2D(m9ztEMjAs`G1LuxXyUVbz^Y6ZgHZ_Y(O1E&uuWO&>J>`;U5- zz~8&%;4>vJ-1cRZBS+x%nk9Am%Bf|A<+Fv2vb=S)I3v$F299wo{C>Ps2V3|9weSaP z;jBG-_>HyjhfMsmopWbH_JpuVW8;lpy^NH2bcLbxAFf4@eTsdJ!Zv?gb3MjJgZ&Eo zEh|rbO}s8o0d|b&k;NPyyW~)uLx{tC){SEt88-HA#ObP8Cr3kJ8c}ytYSAgMhf^a1T2N5 z>NwAvapJH!(V}DZ_ZH5UQ9m!W=%!TDwQPcZT?@KebONBmaSUe zX7Pc`fN;Tj58?tSGXXhf`V;FAJuIGHFnO`y(_{=kf@knY&PO6MScB})p^Nc@8U9B= z3|T^XV>}0NKF{J^>=Z625A^QcyKY%ejO9LH!w_qT9VdDXL)kD~#7fRg~3{zN>d3v(^PFdrmj<#z+zSl;B9bja@(yg!HMc{~Pwb=n!m z+}-(UcWkQUnF`}FZx?SD!??`2!nh*V8{5Tu**JUtUjUs6)nb6XRFkl)m0wlEZUrp2 z%;auxOh$9RENh$}V#gYVyc64EOvlK%Le1S~~w2c;P{0G1{vZ45pY06>^@^ViW z=#w@^)U&ZJBfr~%MP^=0t0y!R`Z0%}6@t=MdOL@s%3MGVY?NMdxml zPQ7J@Au)<8ZZ0lhjK_73xV94aX5!++xHMeI7>9cy6XJ1aVLUEnj8BbE!!40P${d!F`OploQuvCMDn^M_d${l)}3nlhS#mXL17W zyTo0N$+!VAIW0LI*FVOm@H)q&6x=$A3lY;&(s5rWuHWP(lel^^1s7SSrQ#;dG~6AT zhT9!+-)0J~s!U76{gAld6UpOdOAty&p!D>*lH7^kMuslsRRfB@U9_0r=aDNn_iBArqp9tE5ipF zrB>ncTD6Abr+CC95}lxi@ckr1c?tB{4)+7b0M^NiyxvgIqk-XRA1&4@&}E1+k%{7q z;AWC(@aKG~Mb8SKZHAW&NcIG)SWtuJpf&^%fhf~JgL6e!0k zX3ykCM<{#onMr(J=hA`=pwR{K%-hdp@@D4w-AwCCmhvP7Hgclb%B$CF20a8iw5NUq z>eD(kG53KyfpZ2>yz1GjcpDo3@@={S|&e4v;ZBi4&-ZE1f(aF{55GjWfLF>X; zxwbbMko9iq`8431UoXZ(*_T=ur+X-Fu{;aX(YRz9`cqaFwe3W#fgw&L!afQp+6W-! zu{O<8xUo%JY0zHoiidr3iCEUXnI3D!;qW$VTsr{y(3fnk$-t{-$9XIB}>u*@v>chyW3vzxv(XD%*@e^`C zUUcK)WjEcw>6vGD?0ogLkB)qDN^wLt=op`r+M{Rh?DHoqS`5#}pLurYYrEe(@`>Vz zh!nm(diLv|eg4Jy1&fxgyz|xFZ$?CSgj4pIapNz}%`dod+5L#Jzy>9W6O;0@e z!nU0+zZ2c0>A3Mf{ruah${DjhIvCleq_kD*+$*kp=;8U#ZfVl=oHqRj3?6dfMdL5N za{lHW`}QCB=G!03%9m8kzO8+??&}_Y@`ab*eCOaD8MiNwThivOeY;N$9&*t*w9P@1XTS35p1tqB_vvq^a8W_bf`g6)S)P^-S9H~e$jS$uZNjQr z>dif>qq`%?;nr2R%N^|<8r8r(%B?$EdBb#%?$$Ll9-qUhhr86s#?Ha+mhLfb&DA7g zsH3mmRaYI+t|(s*N9%KQjTw%jb1PqQE_g(5;aYG~AM0)s)-0@%uaU3F<#n}ijdgc+ z_V;#i_#CPpAKt~$!WFJpZh%+!_(6K*T2C)MO7G=P^K^DDI2GN@(>=PY9*7D=Ro>uO zaC`Ic#@F8B?C$L8)*_pQRX!h6;j8>d3!k&{l(X`n@4Gwo)Uc}YjVhn=RKD)?HtVT- zU1^^F9-pfs{2cuv$JnsSh0R)dn}p>!D*xtsaILSYBYuse>iza^pVL`+pTFuyw`z29 z!S_Z-<@0(=Jt{(RsVXw3Io)o};|bHe&TuW#fla4c182kNMrvcNsn$HAm9w>{om%85 z)*jZkXm4tJwSB(*VgJzH(cV`NIS*@}IzH3BGQM#f(;%p-uS3uC1`k>C_rKqD+4VQy zcK4&tT)oNV4om5M-stc5>~%D1mXbPp%=`x)dic5ILk+IEZt>qkl1M=uJS4wh{1Z>M zY~}WN!y7eCN$;`#{&(LCOI^Bbz1!RKyeWlCZYs@v;j6DNn)JhoQ+KTF*1bdQs5@7$ zxo7RV^&6krvfUN#Yuvg=pMJycTes_t)$ZmkV$MCU&!9H@WFknQp1{fJyLr4-?S~JJ^>k{|qJ67IO~VEwfvkw;Zm(;g zr$gB6@IJv#uAWY>YnV%Q`gLdJ^^?vS=1n-`iRrke#YWdc3Z5x3?;#dF7L8R6@kUl~ZPiS8o4X&g6(i-IwfL zFksEo3)0=49OGT>z5Tth&V~yf8CP(DBi$XHK^eIHm}k*HI)&Z+X;orZJ=)=^y5TxU zu`@ysbNg?aI3TQ|SLILMa?i}h{VVTiW3ZBu!;bLIZ7dJBhE zmC+`;hf`g2sPgBIIS#KwTNs^{)4TG;UM|%!%GokWtBUO6$oGx*Rz8&0I--js407+P zykp_J$aI8W;T!8lD~j?t(vX>0Pt4$|k-o;dQ+J28*2A4Huh->)R;_&fT<;>+X%)1o zsB^hzN$Tjv-J``i|gpNFRoX)ZV68++2k#yAc1&Ox{hu<`J} zp81KAQmpl3g|w~_o6ke*<(PO$s%Km*cco!<11oU-%SvZp>xNijLmGDb_9Y}b0_zv} zdP#xZeLLJm_)!&8(!`6{4PvdlSAnb2^x(x9o) z#%D}y^L3Ziojb)DT}tme)J0oAvFka%PVA=qW~BW6)WnpN>fsdC8%S*zaX9tC$h`FK z&DNyHwK_cD`*Q+0-xM7lGNd#x^v*47hAMC74J+8YW|;CmZrD0>ctqUcyipH*yk_*C z&km0^l#(&usHes#GqDZ4D~vS_|I~ruagF_I0hF<(sgAblIW5P9_XrD9n>o}l=q_hx zy_cs`Gu22%1cwJo*X`9>t34Rq;Xx3u)imaVG+(jkG3Efd~!S z9@VXTwR6;-i0eblSda%*2%PG0YvF<_Swf;3@m5+o__I=JtqxQj_{fy1demX6=Jt6e zsajaL>wK*x=&5RIq>2=s;cB}ub&5lEfhn!I=Ft6)2)w$~C>7aHe&s-`)S?@pRW{ffn=Lg@W|9*tE$R&RAGI&$fV#T@Oups#2v!s8v6 zsVPw%kxQ>04~lNJx8BaFdd^dQT2dIaf|{$dAYJNeRrfR&rK+k;)JV7Pe96O%G-ZjR zo)}8iz64(`z?Rx54_%5_7Vs_5QK3#HOx1owtwS2rrAW=88s1o!s3n)CcSB(-ZWM+( zya^Zql}lYn0ObuyV^S*ef&N!f`#6U2y_?n)2XOJ}Fpo!bpX0biS5h4b9yL;J;#8wR zDOyl*LSj{1jN+c*Rwh<{qvVK1a1Ls4PHAebHnx*(EV%vC?MnDjzSj7m?bZ4Hzv#w^ z9Dew95uVz=)A4&)Q)jI{q8Y2#|KsERrF!0khEIjX41Z#?f6aos#@~6@-coJ%v^975 z-d*x;rwcnMGVGnveVePpjt|)yKj7eJkAC;d1NXdEv^^i!h75k?pCfPkxFjRP7Pv{X zOLH%OIe2XU+|7UcdGQr@rd-!~LCLObhVHv)n z^Ls45?}Dn%-@UeSc;(QgtLEc&g7=&i7yXpXEp0Bd^H#aq1r{wZ)lAKK@t!bYXj?okwk8OlXze zw@=#LUDeGOZ}@7^UA-gk++2KV<@C?Lx^_pWPRS2}TBnr8fjNDDJEl%HZ{I%g{I zs>(bW@J!{m2n~ASK#b{xELGX^eC6>RBf3@p#qT~+eCs*62YUDV=-nT^eZM=HxO~`8 z$!oI@R!)#9oGD!W)K_;HU;gTfS>5j%Up{TlD`Wd?TllZb3ZM0lzx4Q~ogMcU9jHu_ z)Xx--)Wy$HSrr^ zdtJf(%N#%K8gc82{g1aD(r~%+iggQJ{$Iw7yY1wK1yvl4HeDB;(NB3U?OL2xQc-~! zKmE8wtx4zju-$Fc@D2?#bJ`6Z*80=9wb!k9?)V48JM?W+m@t0EB!87!Kb@!jG7o1G z&Z^~cwrc(2y4e%%o0~bL-{!X}AHQ_l>RIpHFyQ;W&Qae!+~@MSTN<5X3;O0e{oXJB z@WClRdOWZG+$CdJ|I2svs~Y;ov)7GS@ywGC@Ba3`LH}C<|1E+4mcV~Y;J+pC-xB!$ zQVBd_4hYU<3|w!^lzQ#d2b$(?{73MTuOnBq9k}D+s~4|-y74XFUe{-3`Z`zBTWvwt zH~2nc*7}BHmk)cT$x%Jxwnq;>^25;=_xFBoruwfY5%aP$GBj;LjRC~PjZfZ`x*~4o zt2@8ixvS)dPk#+~*RLzwF>?5|yB~Psvl(k`#GQiiXcw4E$_KOt@qF%8M_&VoJZhpM}K-Kl$hG>wfrY z?2udhM+4n^Hh%m0J8VJE#Q1`~Sg`4Z?5blEobUTQ z>ld%g@dSnrS$u=qy|8!ElWpcZr|f^qqI;%r3o{jmo!^9jeont1rcXXL_KkzDXaCru zarna*W%gJ!y6Y#O_PQYZksmC&X9`!F-}Y^;j9ULj(}u-ue(3(ytH0f`qN?fLU%dJ3 z4CkgD_ZK~qywRe2rf>^0{WZ!Vy4lU$9{6s_KW$oC{mYnC=7k~JYnHJ?Ug#%?UZI_qu4K|{2Yk=J)_DFi`r^tsSsG^w2g(Mg1w9jSThKqj@|hU;c}ti&iZf`@ zjpsD~{M!}ZH*;=#{#b+E{;^{l-SW#-A2#3o*|LOr50o9k8pI4vEvg6ARui@P^OcDz z9=xdYC+hPBQ0J>xPISz_QXsDRe4(!s!1A9De~B=TV)`l4mE^8O1pK87qAL^iE3YI~ zMVaV=gKz?6{tz&X5CIs_bX6uQ@Nm-uKPB`A$8hN;{sN7%p?rmt4pQoT?FTi&QHWc@ zeBuaq?qnRJtSC^NPTU|D3pUodI*RDF8sR7DdhdS!|{s;;=~E?^;Faob(6eWn7jcps~S*8?lM zc=zBuXRg3KlDZoQ{;`)JU-4*jW<;3>w80|I?9Qzajt-nkuTaADefnEEb}pd#dBf#V zCR8_G@Z+`*u~7sQ*W!mz8Wy;*>5kW5st}Bbh{#B+4QN`FNArfkTmDqlj}RJGK^T~O z^u!J(%)$t6j3v*V3kE$8F)Xv?y zM#c5)(Ip+%K5E2G;5nQB&W@}&5gvtgU)H+GA1k7 zf57>DGy4t9?$mMoDs|k2xznajxVT_a{zYrlv6o$b#hA_NHR`qMO7%|l@9JIZ9qOz4 zMs>Zq4!ONgU8~-s?$Mu9pH;W0&#RB?Th*u4XVk^|4t1ycy84Rxnz~orqkf>ir@pVg zs~%OqRKHLk(^hDAYjwA;0n+CAD$+A?jG_N=x=dro^^yIH$c`&#>6`$qdt z`%?Q{`$Ai#-=@E;pVZdqckB1+_vtt5x9C^vx9jWmhxCW_NAyklqi9M3<{@^X>DFXB_rni=% zWf)qlwnvRn5b-mm2);3@NyAeVJfxg}lmhn@A*P8b#OP!?1eE|*CBqGkr1q&P$RfN! zzfwuj_Te4a7Of~n+oJ{50I469S!kKESc7Op^S8ZkRcV+NB42~IOEx1)ET7>+@=&8uGaBW6cMlpnkBjn+?Jemm)XUIcjjxqeg z!zDZnt)o6O#+|BrK#m2B)XYSPAr+G{F_1RN5d%Gw2BPm#4KfCI|6*A{j&Qih!azM1 z$yyBm7u4f?vv%W(V^p(p)nL0K1GQSzQBzVyZMGtgELeCW;^5rEeZ)N>+)#v%L(2%p z1wH<^$U_YFM+)pGmaqbTf~yv9Wo;;A4dt1tVbMJZQj{Kn!zYNOR9Q%5MG1lxm8>v4 zaj>e&VwZRq;<1!IQdWa;MP{y)@T+Xu-KyAxnI+>3HuFDDaSc#*lI)_>4i2jq30@7n zf`78zONd+=L?}+Y`S6woZ&Bq&k$;&G8W4-s{QT3*e>KS~;Za~)G!p;ng>VSJ87tOS zEg02YsmMBl1#~T==09Z0L7zzWH{pgJp+eyGAQ%rqS0V!rpAP4K5o|4#S#TtZ5Vd6q ztY~Sn!svwZr>94VjmK;SJ`iVX7ELCr2Y^GU0$CVreg2z81!-Lsf6y@?LR6Fkm9GTfU5Zi+_F$zU1p<%%76xV! z^n()9MRwn&6LVsTSd?VK5^!db?UEv4O0+0zG;)8cZUoog#$;kdQ3SXDjmR!K`PWe_ zl<>7KU4uF4v}D6y9HUEFCLf^40&oPkDMP>#8&JTBLWn2|Dm@hNn2C$R;9xk{#khi% zYFQ7(0dGf9z|B%LoSBvCMWXaPqV(Y4zBUxp8PozE8A=30OebPmAtS3py39~kFh@~P zL&%^W2+?g^9oijqgy>dUQQS7lt*XOX>7$s*sbF64A9PmJZd)BbEaEoW{G+XDm~Rmwx=Fw@fna7M^Q`|CDVm>bfjLsyNeAE#Xv(; zkNa&2vgI)xCPjBWMATpy`ZlR9g2<>swhRX}Dy!We z(iDaxxK#-*7p>%PvX#7et|J_+#4%s9>=d*Ur`1j@g>gE_;><>t)u3J!ynL3S7PD9{ zpi3-TmpfQlwP4ZQSrHmbC+IL-Ek&_kUKHa-zVr-3HC!weE1b?yMF`^t)o^G>ls5=j z-l~rkfl5&WZbWwVi(pO9FM^A^i^8&Xqx>Kkp5XlRNdU=eXryQ~(C=PSw%pd}?KEO-h(eO8QSgbj#r8eu`L0wK`l zI3ep{{ecEhH{_6lD;t*^%3atTY)T$<29Tw2h!WbD+i=n*^cWz;Zoz3#^qH;xqL?*? z(K2*UWPVU5F`|P*5Lrs9C?#Quy3C?xS)!;T5J3&*Qg$L(e&J>4OkA>*QKsRdZE1?myzteBhlVWme4#vksd+!tQgU? z182iDT*yDTY*qmc;h`9xa6_c=J||fDn?4I~&E}Mq3E2_JqBiGaP$P=a8)WMTOU!Cf zK>areLf(bG{(~Gqh5xw-zCRnm|7RmK`m+(5{n-eu{%iz;idmIn?y#g1hT#CTCJ1l^ zWLMa-z-)@eg{ssb?bM4Q#S&qPz7au@a>}ORq>V|P5<$6eLu#Q-pn;`^(lUZZ&@kLn zi>X3NVthdrI>+!)^#-VSywp0>GqXt3yV1}#UK!)hG_GA2;V}H`0$vFI#u&fhw_G*4 zQW5AE2<@TH0WDJmYsQYEj7B4POoNR9KXkCmhzuYLdIsJb;$i<5&SV?(Lt%tdmK%mj zh`It8fO|;8(OlaEQ)Dt_$y0VY&Q3~FsUdZP+q@rb%c@7nlTYz84*Q~16e@9LG0v6#62VsZg`QYaOepz=wLa!4F~!RU=SGSKg4BaiB8Di zNQM@c0^p%WX0{|FQr$yZ>{>oTj6jM4x)DJ`Poo@y%@7MPziC~FbR9vnDF{`Mn9Ls2 zwbUflG+BybwfW7_j$-cxXux>cF`y)*xrqL*LTFHQg0PH&m$LxA8j5stO|H%MC!xxXCxQktwNDRS!-av2U8RZ&4KO$4aFp6V1%b@eEL2+Ca5-!Smjj7Ng9`&QatD??vbTo4db-{k)+&9i-Z-jOZ%v(A-9IB!7`D{Y zKZmh@h9w7KwD-@nd|}E|_s@7Y`)7F7?4My#V_;IVe-5J@1U!%{v%~+x1kq|aj)5uq zhd4n0{O2N|fBth3&_DmV2y4XmxL26df#iA2)$u2fz8VhqAL+4q6hF04$J5w>`;<36| zkL3!Hb;~Z+U8@77ibwbLhq_oa7dhBO7b~&^78|maorZSJE|wXp?qVZl7u!G>y|Rm? z`HM0`7b{0p2GXDo2YFcNB{9(A(~FDHyD>n`Zq2`?x?_dP79A^eMUmm<6safTeo*I@+b(PoZtm`R#FQ-V% zo*ITMMDH{fMQCc7iX_wv|MA{C)MMA^{|(fP7z-OdIj7Cp1x%%cLjQsO9lFe#*9u>y z*SiA1VeW0B9dHU76)Gm)Fd-du^-yS)K_xqaSZi5zE6fl%w-4+ViTS}Lr=C%Ls(%S* z*iqu3;AaDOu=5fFUbr-(S!Ee`S}>}}|9KUHGeLIOeySw?L$FGfBU?a!c7#e;iTOR+ z%$#(R)0hne=9?2d#5rdyeZbE(C*&O+)L}l$K|H*JDlixcb_&r}oUMWarlQT2zv@I9 ziXaWXil~1~Vu9QF17^pooZF=|JC+k=xL@N=gs zpkbg@8zL~4yOeVpUcFli>{Npvh4jAZ7pyuj50GgLIHh|?(W zmQ(4B#Fp=5r@+8mFfao*Faz2`VkXiFu@G}N49x`tGju~#oJBfByrGRU7Yxj>7@i6i z&}77df#3o|2qzW{LbSPHV1{pu1%qnZp-7Ew)VW|_hHg?#JroqVgc5gR!5~DR3kGJ4 zrdTkr(+@>!YD<9&24?tXA_cKvAXrD|?8JhBBpqxHOq6A4!Js*6#eoF_c97`z%mo9j zX1!9@xHx31RMa1>5t$!z5hzqswra&#G~hIIZ5Al%R9Gan>XcnAE8i-2R47+~LPTv9 zip7Tz(NK8ZM%GrL4vTCkAcwE0%@AQ*Z8}k#7PsKUV#QjvBFDDctWhs!=FGL95OG^o z!cwY1JVf4FyCQj8RdVf0&oryjT=!#m4z8H#*zTD zim;*z*$S&ITW09C^~qLS8)eFt8Md88IaHOP4e<)AEna5$bL$tcb8XZqUS{a_)zt0u zAz@)q7BwWyjM3qA64t?%0wv50A1hKYB}^oiyjIpqJH(7H?UZO?$f^%j@MXlq7H1Q_(gRrBMnF&9ev{4$N|2`$NYW0dY zmVWo-k-?aV&HU`m+n49gWvz6gf|7t zU>!vwmcfzTonrS+E9o9n%kw4SS-sWg1kFuRBZ3HP+M+P4x=d}`e^BwPP8KbSNGN5o zM+YTHCl)yVSWcl0Je*+i;Vnp->~2W8j09q_Dr?PkPs-qXvkcpqJRb^j9Zl)G1!45{LxgfjE~Jb*4#Bb zgTBx}JiILmo{5`e#UMabWA!*7yr`N%Q!#*5iya{e=8i|uuECDrMDQfo0ZMk@U}wi; zXD0`miR>VV9FTA`9HPltcvhh`NE1vO!cQ`dU2&vuWL<>UIW$4ASVO~#v~B>4gFOQ=4{jGjoyREoS_aArg)RoY7<7@GLoC}ecyO!O z=>@Yo_==d3-^Msl#d3UFJM>x(tb;Uz*7MCTLPv1$3hvlXFma1}^conQ85rW398e}@ zZdlTmjH1s7RjYvzVqYVA0l9OPn=FH3)<$lOlm){C4=JHOAb5cJ4W`2NU8N|vPmKKz zQ3Y7TJ>K7nsD>(6VuDKekGAb~)ry>@CI3N2Dn(bQv5b90Pe0<1WDgm%M*Kd3*+%>k zu+~_jCfO!FSa4P$9$+Hec$Jr)1V-T7~z_b_AL@HvAz*pZK z0cJ>K5Ni@3#HZyTiC`ANJxfj`KsjKVfQ(8G0a3GJvP3U7#10stR7|Uc9)e{SE*RCs z?p0xtV6UCQTqsh8%`UFubgEud>{-(Gqe6NGVrS-y?MdcKDaHgUWD~W5)op2QiF|=` zS}BHt3NSP?QwYOML4qRTV-u*MmLd_BlPotzk8zmvG3OMbPmch%B$Ga^8zOlzfIWa>|3ENab z<+BBarlTQ@)m@?%8qOKg1`n>kVJpc(+$dE-#nLtp9t7YJUO@+P*Y5o@Dd zTBXR%rIkjxb^@T4UbCwMT75AXV}y*9t=&F^(B?!!n{6ewR1!2x*>&G>3^w0uRIv5h zJV}q$>*2W9EH9pnUTg7E{qNsvS(WNuSbmDT?CeV4#XZ@& z3*laTB5S>CaCh-iqn*~{dLJU!dx@+W_T~hYg3=kek$>dQirWmBaMWLJI7uVwM~p95 zHIEb4{0t{@d4JIvAG7C}I8i$dCt)o!=7Q!doZ!SGY~nZ`CxLgZ*b-I<0un?MAa!5I(9jOI2Zfkz#CIznCZIxIWb^u-=Mn7e~f=i5oA zXl2Y!FrmRp)Iom?xT){d?s#Bx!cgRS)1CY?dFPZg0!PulliabRJ2tg;7YTIMWsI-O z{MW;;xr4V6_jdH0J9a4Lq*BVh8LfEa)=gVwMF}EZRQ_o>WE0$4 z%O6X$@?mE2LH8)=rmgMgR6|zF(v9^4^hUo2O{u7qER|LpMyZi_4?dS*p1Qx~^5jqB z2Ws&4Z>et8_Vh5PCu;u7(P5pXY`@=q%x5e)ncD9RP1Q+|Cs831thM|Z?2{cTTe_x} z?{tqxuzq+uI0}C}?Vf4MhV-zkqUVR%wXx(=>BjUKcDVCHZ#>ZPoME_*KT!mt&}Fe>mTekrf!{{n)nfh zTw`kc^i;}|3OZ8n*PEw=WZ#>^?%8_tB+vP?Ai(#gzA;tD^QUjO-l(&@(bf&=QNj0X zLa5&L^ai-=4NaI#pK3D6qg&}z?TyU-Y5~3X39D-yP%8 z8fkbe$>{!}N!?l3N1m#Jc%w;G8m;|soIV6DGClbc600&FJG6Nha z0j#f)Vt)ycnY}uBs08q~H@wxRehcL79@>~1ao}JhOgYBB=5RZi?ik^~bKuoH8j`L@ z3_)Sg4Zb%Rn`)i!cj}G|)lo(9ek482@b(jNF1pY#_L?jo|L&wm3nBKFwkD8R)&b zzH3AaKDGRi4e)z773U9V^D(`fWCs~rlj*KuiNDoklFXb;@6~4Ma4Y99n5TX7wJe4- z^D`jRWb!fVJfxO0l@U?^(H<4<2w4I|$naL1`ei8f5CeFJL=YURW*VnkS2Rw(S{Wy> zpzT_ge2N)LCnwXZB**ecB++uYQV9(Y+al~C!NMY}zL-3Cw%Yk;==|YE;j&{i%=ehj z&Lg)+`HlaB3!Cs!&f?(1U4B$qHxR?rrapX9!jNYq4hZS$k&iq^=tq}qtnZh+n%p{- zBZf;QOs0=C+!_Us zRD-H?8!}Fm!?85SuX}j5*-w}Q(;Q;0#tl>?8TzR23suZO3R7zQt8RYSk;>FxCXucu)^qN{3@n*H`*3haZ*qETi4)8gdpr zq><9LLe(Vl+BEyh4e6uOzE9~8>xT3|GfO74zP{hcB9qD($ToDGiaqRFiP9{|CM5&8 zeB!mG_!T^;LQDs3Czx0k91Fx1ejurS;N5@0?x~Y#Dkdu*j;7^Y z=@x0g{j8~){e@<2z?eTI{zbkvrU-{+FZt2NR_&rD=Cwm(^2`}*Ut@rMO$rS2^Uv>K zNE_?JdWYz+6!Agfa+iq=WJ4h`Ja+9#-MLQ$|Zgy>O z0tuvge^yc)8YPLX(qt$ zfj)g&8T#Z!;4&6qIFl!LsjR*aPm|ebSQ4^;1`!gCJBo8Yzk5czBioS2b=sLHNC*re z%?d}Z<0RIYW`&%D$@q_zB;=E16e~#-LNWNclf~SnI4iXQjAde}^j_HYpq$BM%87SH zVF?yVB%VZFb3jqz{i7V+vTTo#(wHBfxKDMCZ0p$ZG}k)UE48o0;+|2>n5@bS9*2Am zdDaVzqESDsN(@14ztUPYYBJ6IQ+}tU=LTm-dAnthk^9_ExVM-r9Lvac2DgT%h3s+U zk=5#@JhGIAee)kiZtCb&; z*^{r#cWH?{99Jt`<2AlYTjIc|Yy+pV9vOv|jOEJF4F5sK2S?owwgztSN-%xi{}Y+) z2%FB)gyi5Zk`QpIh!li+Y@XaJ^F*8s|2k`c#IZGS&<%zB330m9nTL3E!aJBEl5#fu zf})1y85Y4e#Ebz~M`2CKJP6i=G9Tsq3P}zPv>FZtt3j2ylztF8t3d-WvKpQ!tp;+I zjd3V`+MNeA!$F4&C{N18TXE8jw4+cPJzAu&{>v0H{O^&{G9Q~nDl4o4AWp7nf75ZT zo4UN#zKJJcHK&=Q38CNxYeq8x&%;5J2Ua#sg_SECQ_s6ly-(^HVm;AtUGqkcOtC(L z)XW2s9~LPGsmHRgYQwZkc{VFXBRnk&Q5Beq;P*Mv25l$HPMpNQqVJ=nuLzL623LWP z2~##3M`cR-JmN@7o(;%O(mo~CQq0CBgY$>(WPC{mQ?&_RLX8Pd=lEB}+HBm>cd*T9 zjBZ&RR^q{M7~H9R&kMd-KUGot+kdQ<122dnuIV9?5l`^ha>bRLl_s6ak;#8aW)nE=tPr1oY;`Bqs*ABMCGk-75YFV4PWoMI#}dwyOG8v^1&$Mr+B|8J zehQtcNXp2qAke{kT|q+`#t9YAvl=3bOUq{<#S9CR%kAB6)N7x}##h38#7L#3 zkU%C0o_r>CHHwa+R^vvbLlK zhA+M^rKZDqWEcLkYV`pFMG5I&tH1rMwZ~3=Il$KqP$XhINVFVp|AI({7ljEjR*=4B z1Yb%qs@ts~?bgICtRS7nZaXBawLh#q21ZM|(1Hn4LfZaq!4|g8@M&Zr2LBH^5Kb9i((-Dwy+Srf6U&G=~X@8qw~iuU9Nva4Q!o!@9O97rC)T1 zIEj6|tMTqQ7hJ;0!6B-zXYse|1Xpc@pk;?}maPX~W>T?L!U?v{Fj?9N&9$)C)Ym`r z_#ZuR_m@BTY_iin=97Yc^)G(z>%aKeQy)3vp&2=utx0JoQ-5{j7ry={&wTljXZ%MM zyNP0xsc(Gdvv+*y!9V-R*Y!n?M)E!FCa+GfB`*T6p0oG^o&QQKq0UT=X`#W=VT4pt zjkr|o5ni5d>A=vd>zi;0<7X`ri=T`+JwMAh`oxbG59>KANWR0IUZWqI?qvUNCp$Im zyLca(?lyLIoACSaba!YfyK9;xsz6?Vm_*Y`k2_qWSU01 zER>*<)mUnz@vag|qv2|)ecajF)oc*jm@UQTEi?t6F9L^Rm27hQAq={!EWD+2(G!ei zfI2QM3~m0qZUycua$cDtya&3&>9NZby%ENx1;toCxxt<4Q5d?*5>T1fZ`^lhHnanB zu%mZ_Pgf>dS52f{QI_M@((5`|^G)0LK_mjru2mBhP%eSZAdI5JcA+fEVaje(PmpM2 z8jY_hEt|XGZcK%>r@Lc2yRGT&c-9h19Gj1WG(E8xlZ}8i@`?tWEjMhASTe1W4Dr-9 zcR(DDaNM=H3N$9anS%p%Y{(h49hpfc?dhu;MJrfLQUeqOB7^Q*SF>Kmaj2bIcbUd@ zXG~njKeQEUtA#^qAq9+zkRv^f8rw;MYB+Tfre-H$2;`w73gI{;+<~c#pD~SL)^ax1 zC;4IUEaRk~h^LTAB3`OVkc}<4;3}yyS{G<(t{ACkshER&g8o~LoM}YPROEC?E9peh zD4lQBT57`^=c-oe8vZvX`d?zM;a^dsG(f(0T*Lp)nv9DD_8i#e_q*pBemqrGI!GSh zH9YDUyp2~2bV2>}aSi`2pRxPDUSX+;GBN#(L-r<`2@5$ZUAOg$Atgl}T(@m9SVwd? ziRG$~@^v3##{=HOJ1*UV=90&5 zjd+{vpyaojCd-H4#tzSayNLtpWFZ4dbq=C|l8;+-v1`#JEz(xK^Y848N!{`vVLn|8 zwIr>BhN&VbyI3SS{;)JfM}dcs4unM}+KKNJ2b+0Ar)Sv6V^|P)8)yk(Og1w>+Xx|E zj@s)tX(WJTeIPaUGp-h>c9N&v34*1vZi4X%iq4Wvyjgd#NFYY5IX4= zY!(G~C5~bHuq50AU81eFEx^QB#!NLyrWCAr*X}(BW^TQsyJ$+Agd8d-N~DjOmJ%Kn z3|d%4telLPYD2U0y#dpOzEb<5pL_sfWeR_!lmx?dLAl20MO>F9BcuSChO+iHLK3yN z{RDXeq6n+$dXZ8nQ3~4hw?m*TB=ho{y0#@cl;5mcvN2n|G0ru)TF_Q zle8w$_^@)uHz(r`J}&q~fKO~rbRLazCInv);6&Hf!8PCu1SbHVD`%m_01{jgbBVL- z(3xt7d7^?&fyAPO8?&>7m9HKqwh(KJA6)2}5%;9<#5D!tB%&ldO+__K^yW5v$8{cw zu4}AlmmiiJ-ZgdW&Z)qKwL7v!Q{VabfBV;e`KQ19*msg0(-`c62D<)mUbXu|$NlT~-k<_Lt zxp?c3VagFJ4GV>#8IyUy!1de9i+O9H!E$z00X`i>+bUO1<^;)NvG5pZ%i7Pk;4Wkl zL0K`eO{}#g)<6&OCQS&`Ko{X)S@Ox+wje3ZxtO;xoK0o*H<+%(jb7<0TSjF%+a-#a z=m_#_aVbRVCPV<(&{V(FC&rbe1Yj>og19)X?{F`~1o8!x_K1jf-#q<91S!+wi3qwY zej)ZM;~vHp_89l=FzyXR3NJ6D2DVy9ocuuGNBlVy_!DRUtKrYOm!u}j3Owrem|4`JfCFJo zs)gBFtcPlGF7-{snsLF`Xeq}LwWX-huRVB)pK4Q#Uepk83=$pt4uL zO&pMFNG$e)YHZWUMlw$`1c2h`o6y`?e>*SK{}vJ;8(5=TUB6cUsKTeI;jn5@mdW%@ z*r$qRv|SEIQ_FXC$EG;GP^z+9u--`aV@PKTczXxqRDXJTOLzQ%?nG`k2qc{a*=T2> z3Fe_}p|mN=p|!JHM=?_Hcf2yZW%`cTg6h_x2HhbvaaMO$7mR}i zhKc8=k-m+Z)e(9VI>KUU-#pflk_1sVd?&#CtS)p|M-&fcV+06HC|3$sWTFym80yr? zC8jt4;WM=B+qY)plG0|4yWME@<;~dy=H8nbOuYO!Luo_$<1$<;-utZx( zmA9BspvnW>x)Dj0o98A~rkzwdSc}EVf!Zr_<>ew*W)!W#3l@f@6D$S4I>DkHEXJQ$ z>OYELnLz;{S@<#0vZH3QWrt1WOt>(j(C^X^?2?#0F@;OUy`(mH(*6f&aNc&gRQMO7 zkWfq(dPV3W?LwRlw&pX=$wveAUJRODG82wjBtuyhqhC~{)|#vVRwQwfRivBIg(8s% z2w`j{St|!vRG!*9vy(SkykBqpGDDd9kloYBf)6Jo@D?ISS20j!p^3*>MKDANUIpgL0^a(Yxerz)Oi9%!p4$<&|U_HlH`j8HlADG;#B zo_-yxbGM#El6&<4D)#922q@cYX}+=$Ebx>+SCl4%9MFM1fuE&v1x+_z(hZ${4!M}N zwEqQi@v9r(X6miwdOQ*zByGE6nys75sR^zci7Ubs@eWJ=E=@KtUo<(|qlK0H85!j5 zJ%Y>AD945AfUJFHwWvu~z`|C(>pmrh+rV=EyybjEpfHnauzu6}My-s@Q@KV{^B?>^ z4yYIEpIi8~xF7k)9Z(@%6kuXQx{9ZiNu|xAc*=OvMCvMkx-y-@9q(cQhtvRz^TkV> zRP2@WG#R|`Y%ijgZc&H{cCqv`(*7m&v`c_S;O2dSkGq;*-{UqB&uu=OAnuEn{7e9yxbHyF>I71uCX+4^w=UnP0Kq zsHdNFAL%36SCZY`C|X2H0TuDxqLUeh4G0KfQ+O$QktMBNQQJ!Y9V=T+W4$y3i(1)q zmC0S_UNt5k%YV&&S>0rvB!AFe94zGw4J^(K{?e^-?}B zW!XxF;bdWPe{*he(~2kQEKapgdIn*_hFz)<9+*(fK6G=#f>isI%Y3SkY$;SFC6UaE zauw6qr(Q0Pi;yE^AzpJ)vf|GAv}YFSLPE+WINng+EX!6{W1oHnac9f25%IbTGtE~- zr7P~NPrb4%y+}&=#GM_=hs*L6+1Teei?z_W{36>~Q4NYa>(ifYHTbx*6wMTDDCek- zp&L43$_nd6aN~2JMU%L*_+t-Y*!UpTFhVxmzD=W4i%i7$)=$z!K{9;tMl_;k!?v3u zuMl=*kXa*CPAQsiYL-%)U4q;`vlq|;dX&FGS0(TuT9mVP)AYc@wB1KfFUl8V`W(d92v}1d{^wbr0NOyH zyN&kpnNKb47RoK?gmx=Rj-sj$(r%*&k)qAwGheo}TUmBdI@+x$J&LM6Si410)f-dd zGhe>6TU>ro1KO>qL44-Z_t9>n2ocX`Xg6&EM?yr}?HEzjhYFrSYn6(oh^p>c2loV` zD0!V1Sce=;d!5e1?a}ExMOE)*y&|eQ#h6xfs?rrX>~tRbZ<})qG-W!g3{#i{`0+X~ z*1NPo7IWzj#dtcvyyDle9ozmAX7)OJLEmL3u-j!?FmB~|#WaXEN8U^T8%(#tp+~*4 zff#!;4Riwg9`t7VXsh0gJ$vHWfvkIGn@Cl^)CwxlFUd8XhE`9wQeJ{bc$DPD4s(}u z^UHpUOg@e#@hm>I?^;+VjvV;T8oIHnxlcMg{9%ykT5A?gslbM%$#XngVRke1#Pk#_ ze;vVa7jgyLP0ZMDEV^oQT>(&?_O06jIIlKDdkRi(z>aeT%K)TcI~AzsuAL6WYeX%k zU`Dko7#Rw)^lN7Q201=hGx;q_({pI%s4tD)yVB6y14<*T#a!FQ0S;H1&dBv|TXXJh zgI=yQB=UgLhUVTjJS<#k$ngQC4bQ!8!=W@Cbn4$zl=NKjri&$vS&(i6N@FKw5KSH9 z1&WS_vQP#piwnrbqpTb-JzbO3h&harv2SYl&TLpahdVgwpy@{kgPq}1b9c0pN}PqF zX7Lfjfjty$>`_1(3Rpk^%G{HK+mT3J_o?e4_38anYd*!Ms83C3RoA$c{Zq@ms*yK+ z>SjoNZvWKWnMCR#pL!^yzOa94Zbl;YuunZ4Qm^ZuT25H_{`k~{!FTN@u3R6SkaE;g zUYv}Q62!8^1uZf z`9@eRj=^rMYck!m#bR7?pq<>hL zX`}r`Lq~m0;>uZ*d^!cqu2=lv;U)>}w6d5oyG|_vFK@OLDvNlX2+phT3eQe6)$^k? zJPj`_uW}xTWmlz}A#}!Yc%dnvl$8WqKf;^Mk_d{cm`+ZcuVe}3;K~?K7K?pay00g7 z8dGnv4n0u`Cp^=Q$#S}Zzg8v{rXY(W?UX zalGg)?7!vxG;bC%$KD?2%_2hB+hJC}eWWvZ=BV||^QGb!=IrK*pL8f)imskND?;t# zn(e7{hdKm^qm`}+?I#@Xs%LvyoGfz67+uZo0{jsu2M^$^hQNbDYIl7P55A~91a-ph&L3M)01j=$cH#{CJ9}kp|`^!fv z)WCAo*Uw(#uKN`MvPXvodf^@mp}c-=No&!2>;TaHoK7dVvmL+aDQ zgkw1#o(36D39qtX7?><)Zcg@EVU7XqE&~#NS-k8~4{huDUx}ajb?x@d;Y#l4fR+2= zwmB?=%3CcqcVFCINAYEyJ8G@c3RZKaT_JXNc_srBx-T#yC!XA=wbf5>CHI=UPn(KQ z5)Bd&`7YYB34fDpB8(vetyQM+3TRSQj8#CH8Z=q~F(mP^t$-N2OvfuA_>29%0AdVj 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�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 z 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

      %C8(d;H@(=X&=(k57ZS98a4< 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 CtsQX~Jn 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�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%0A)8|CVEaoJx)4s5x45z&Ne{ke#k+qZ6 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'*Vnz|Zr@pJR!eA>;@$332!K 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