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
This commit is contained in:
prathamesh0 2023-04-04 14:53:28 +05:30 committed by GitHub
parent 4da69ebf4c
commit 2515878eeb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 349 additions and 99 deletions

View File

@ -58,12 +58,6 @@ services:
environment: environment:
RUN_BOOTNODE: "true" RUN_BOOTNODE: "true"
image: cerc/fixturenet-eth-lighthouse:local 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: fixturenet-eth-lighthouse-1:
hostname: fixturenet-eth-lighthouse-1 hostname: fixturenet-eth-lighthouse-1

View File

@ -1,40 +1,46 @@
version: '3.7' version: '3.7'
services: 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: fixturenet-optimism-contracts:
hostname: fixturenet-optimism-contracts hostname: fixturenet-optimism-contracts
image: cerc/optimism-contracts:local image: cerc/optimism-contracts:local
depends_on: env_file:
fixturenet-eth-geth-1: - ../config/fixturenet-optimism/l1-params.env
condition: service_healthy # Waits for L1 endpoint to be up before running the script
fixturenet-eth-bootnode-lighthouse: command: |
condition: service_healthy "./wait-for-it.sh -h $${L1_HOST} -p $${L1_PORT} -s -t 60 -- ./run.sh"
environment:
CHAIN_ID: 1212
L1_RPC: "http://fixturenet-eth-geth-1:8545"
command: "./run.sh"
volumes: volumes:
- ../config/fixturenet-optimism/optimism-contracts/rekey-json.ts:/app/packages/contracts-bedrock/tasks/rekey-json.ts - ../config/wait-for-it.sh:/app/packages/contracts-bedrock/wait-for-it.sh
- ../config/fixturenet-optimism/optimism-contracts/send-balance.ts:/app/packages/contracts-bedrock/tasks/send-balance.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 - ../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 - ../config/fixturenet-optimism/optimism-contracts/run.sh:/app/packages/contracts-bedrock/run.sh
- fixturenet_geth_accounts:/geth-accounts:ro - fixturenet_geth_accounts:/geth-accounts:ro
- l2_accounts:/l2-accounts - l2_accounts:/l2-accounts
- l1_deployment:/app/packages/contracts-bedrock - 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: op-node-l2-config-gen:
image: cerc/optimism-op-node:local image: cerc/optimism-op-node:local
depends_on: depends_on:
fixturenet-optimism-contracts: fixturenet-optimism-contracts:
condition: service_completed_successfully condition: service_completed_successfully
environment: env_file:
L1_RPC: "http://fixturenet-eth-geth-1:8545" - ../config/fixturenet-optimism/l1-params.env
volumes: volumes:
- ../config/fixturenet-optimism/generate-l2-config.sh:/app/generate-l2-config.sh - ../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 - op_node_data:/app
command: ["sh", "/app/generate-l2-config.sh"] command: ["sh", "/app/generate-l2-config.sh"]
extra_hosts:
- "host.docker.internal:host-gateway"
# Initializes and runs the L2 execution client
op-geth: op-geth:
image: cerc/optimism-l2geth:local image: cerc/optimism-l2geth:local
depends_on: depends_on:
@ -55,9 +61,10 @@ services:
retries: 10 retries: 10
start_period: 10s start_period: 10s
# Runs the L2 consensus client (Sequencer node)
op-node: op-node:
environment: env_file:
L1_RPC: "http://fixturenet-eth-geth-1:8545" - ../config/fixturenet-optimism/l1-params.env
depends_on: depends_on:
op-geth: op-geth:
condition: service_healthy condition: service_healthy
@ -75,25 +82,32 @@ services:
timeout: 10s timeout: 10s
retries: 10 retries: 10
start_period: 10s 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: op-batcher:
environment: env_file:
L1_RPC: "http://fixturenet-eth-geth-1:8545" - ../config/fixturenet-optimism/l1-params.env
depends_on: depends_on:
fixturenet-eth-geth-1:
condition: service_healthy
op-node: op-node:
condition: service_healthy condition: service_healthy
op-geth: op-geth:
condition: service_healthy condition: service_healthy
image: cerc/optimism-op-batcher:local image: cerc/optimism-op-batcher:local
volumes: volumes:
- ../config/wait-for-it.sh:/wait-for-it.sh
- ../config/fixturenet-optimism/run-op-batcher.sh:/run-op-batcher.sh - ../config/fixturenet-optimism/run-op-batcher.sh:/run-op-batcher.sh
- l2_accounts:/l2-accounts:ro - l2_accounts:/l2-accounts:ro
entrypoint: "sh" entrypoint: ["sh", "-c"]
command: "/run-op-batcher.sh" # 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: volumes:
op_node_data: fixturenet_geth_accounts:
l2_accounts:
l1_deployment: l1_deployment:
l2_accounts:
op_node_data:

View File

@ -33,12 +33,12 @@ services:
# TODO: Configure env file for ETH RPC URL & private key # TODO: Configure env file for ETH RPC URL & private key
environment: environment:
- ENV=PROD - ENV=PROD
command: ["sh", "./deploy-invite.sh"] command: ["sh", "./deploy-and-generate-invite.sh"]
volumes: 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 # add manually if running seperately
- ../config/watcher-mobymask-v2/secrets-template.json:/app/packages/server/secrets-template.json - ../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 - moby_data_server:/app/packages/server
- fixturenet_geth_accounts:/geth-accounts:ro - fixturenet_geth_accounts:/geth-accounts:ro
healthcheck: healthcheck:
@ -49,7 +49,7 @@ services:
start_period: 10s start_period: 10s
mobymask-watcher-server: mobymask-watcher-server:
# TODO: pass optimism rpc endpoint # TODO: pass optimism RPC endpoint
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
mobymask-watcher-db: mobymask-watcher-db:
@ -59,7 +59,7 @@ services:
image: cerc/watcher-mobymask-v2:local image: cerc/watcher-mobymask-v2:local
command: ["sh", "server-start.sh"] command: ["sh", "server-start.sh"]
volumes: 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 # 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/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/peer.env:/app/packages/peer/.env

View File

@ -1,5 +1,8 @@
#!/bin/sh #!/bin/sh
set -e set -e
if [ -n "$CERC_SCRIPT_DEBUG" ]; then
set -x
fi
op-node genesis l2 \ op-node genesis l2 \
--deploy-config /contracts-bedrock/deploy-config/getting-started.json \ --deploy-config /contracts-bedrock/deploy-config/getting-started.json \

View File

@ -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=

View File

@ -1,5 +1,8 @@
#!/bin/bash #!/bin/bash
set -e set -e
if [ -n "$CERC_SCRIPT_DEBUG" ]; then
set -x
fi
# TODO Support restarts; fixturenet-eth-geth currently starts fresh on a restart # TODO Support restarts; fixturenet-eth-geth currently starts fresh on a restart
# Exit if a deployment already exists (on restarts) # Exit if a deployment already exists (on restarts)
@ -8,12 +11,14 @@ set -e
# exit 0 # exit 0
# fi # fi
echo "Using L1 RPC endpoint ${L1_RPC}"
# Append tasks/index.ts file # Append tasks/index.ts file
echo "import './rekey-json'" >> tasks/index.ts echo "import './rekey-json'" >> tasks/index.ts
echo "import './send-balance'" >> tasks/index.ts echo "import './send-balance'" >> tasks/index.ts
# Update the chainId in the hardhat config # 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 # Generate the L2 account addresses
yarn hardhat rekey-json --output /l2-accounts/keys.json 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') SEQUENCER_ADDRESS=$(echo "$KEYS_JSON" | jq -r '.Sequencer.address')
# Read the private key of L1 accounts # Read the private key of L1 accounts
# TODO: Take from env if /geth-accounts volume doesn't exist to allow using separately running L1 if [ -f /geth-accounts/accounts.csv ]; then
L1_ADDRESS=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 2) echo "Using L1 account credentials from the mounted volume"
L1_PRIV_KEY=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 3) L1_ADDRESS=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 2)
L1_ADDRESS_2=$(awk -F, 'NR==2{print $(NF-1)}' /geth-accounts/accounts.csv) L1_PRIV_KEY=$(head -n 1 /geth-accounts/accounts.csv | cut -d ',' -f 3)
L1_PRIV_KEY_2=$(awk -F, 'NR==2{print $NF}' /geth-accounts/accounts.csv) 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 # 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 "${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" 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 # Update the deployment config
sed -i 's/"l2OutputOracleStartingTimestamp": TIMESTAMP/"l2OutputOracleStartingTimestamp": '"$L1_BLOCKTIMESTAMP"'/g' deploy-config/getting-started.json 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" node update-config.js deploy-config/getting-started.json "$ADMIN_ADDRESS" "$PROPOSER_ADDRESS" "$BATCHER_ADDRESS" "$SEQUENCER_ADDRESS" "$L1_BLOCKHASH"

View File

@ -1,5 +1,8 @@
#!/bin/sh #!/bin/sh
set -e set -e
if [ -n "$CERC_SCRIPT_DEBUG" ]; then
set -x
fi
# Get BACTHER_KEY from keys.json # Get BACTHER_KEY from keys.json
BATCHER_KEY=$(jq -r '.Batcher.privateKey' /l2-accounts/keys.json | tr -d '"') BATCHER_KEY=$(jq -r '.Batcher.privateKey' /l2-accounts/keys.json | tr -d '"')

View File

@ -1,5 +1,8 @@
#!/bin/sh #!/bin/sh
set -e set -e
if [ -n "$CERC_SCRIPT_DEBUG" ]; then
set -x
fi
mkdir datadir mkdir datadir

View File

@ -1,5 +1,8 @@
#!/bin/sh #!/bin/sh
set -e set -e
if [ -n "$CERC_SCRIPT_DEBUG" ]; then
set -x
fi
# Get SEQUENCER KEY from keys.json # Get SEQUENCER KEY from keys.json
SEQUENCER_KEY=$(jq -r '.Sequencer.privateKey' /l2-accounts/keys.json | tr -d '"') SEQUENCER_KEY=$(jq -r '.Sequencer.privateKey' /l2-accounts/keys.json | tr -d '"')

182
app/data/config/wait-for-it.sh Executable file
View File

@ -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

View File

@ -1,4 +1,3 @@
# TODO: Use a node alpine image
FROM cerc/foundry:local FROM cerc/foundry:local
# Install node (local foundry is a debian based image) # Install node (local foundry is a debian based image)

View File

@ -25,7 +25,7 @@ RUN make op-batcher VERSION="$VERSION" GOOS=$TARGETOS GOARCH=$TARGETARCH
FROM alpine:3.15 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 COPY --from=builder /app/op-batcher/bin/op-batcher /usr/local/bin

View File

@ -8,12 +8,15 @@ Clone required repositories:
```bash ```bash
laconic-so --stack fixturenet-optimism setup-repositories 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: Checkout to the required versions and branches in repos:
```bash ```bash
# optimism # Optimism
cd ~/cerc/optimism cd ~/cerc/optimism
git checkout @eth-optimism/sdk@0.0.0-20230329025055 git checkout @eth-optimism/sdk@0.0.0-20230329025055
``` ```
@ -22,6 +25,9 @@ Build the container images:
```bash ```bash
laconic-so --stack fixturenet-optimism build-containers 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: 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 ## 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: Deploy the stack:
```bash ```bash
laconic-so --stack fixturenet-optimism deploy up 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 ```bash
laconic-so --stack fixturenet-optimism deploy ps laconic-so --stack fixturenet-optimism deploy ps
# With status # With status
docker ps docker ps
# Check logs for a container
docker logs -f <CONTAINER_ID>
``` ```
## Clean up ## Clean up
@ -58,23 +81,24 @@ Stop all services running in the background:
```bash ```bash
laconic-so --stack fixturenet-optimism deploy down 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 ```bash
docker volume ls # List all relevant volumes
docker volume ls -q --filter name=laconic*
docker volume rm laconic-d527651bba3cb61886b36a7400bd2a38_fixturenet-geth-accounts # Remove all the listed volumes
docker volume rm laconic-d527651bba3cb61886b36a7400bd2a38_l1-deployment docker volume rm $(docker volume ls -q --filter name=laconic*)
docker volume rm laconic-d527651bba3cb61886b36a7400bd2a38_l2-accounts
docker volume rm laconic-d527651bba3cb61886b36a7400bd2a38_op_node_data
``` ```
## Known Issues ## Known Issues
* Currently not supported: * Currently not supported:
* Stopping and restarting the stack from where it left off; currently starts fresh on a restart * 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 * 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) * `cerc/optimism-contracts` image is currently based on `cerc/foundry` (Optimism requires foundry installation)

View File

@ -13,9 +13,9 @@ containers:
- cerc/fixturenet-eth-lighthouse - cerc/fixturenet-eth-lighthouse
- cerc/foundry - cerc/foundry
- cerc/optimism-contracts - cerc/optimism-contracts
- cerc/optimism-op-node
- cerc/optimism-l2geth - cerc/optimism-l2geth
- cerc/optimism-op-batcher - cerc/optimism-op-batcher
- cerc/optimism-op-node
pods: pods:
- fixturenet-eth - fixturenet-eth
- fixturenet-optimism - fixturenet-optimism

View File

@ -31,6 +31,10 @@ git checkout laconic
# MobyMask # MobyMask
cd ~/cerc/MobyMask cd ~/cerc/MobyMask
git checkout v0.1.1 git checkout v0.1.1
# Optimism
cd ~/cerc/optimism
git checkout @eth-optimism/sdk@0.0.0-20230329025055
``` ```
Build the container images: 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 stack:
* Deploy the containers * Deploy the containers:
```bash ```bash
laconic-so --stack mobymask-v2 deploy-system up 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 ```bash
laconic-so --stack mobymask-v2 deploy-system up docker ps -a | grep "mobymask-app"
docker restart <CONTAINER_ID>
``` ```
## Tests ## Tests
Find the watcher container's id: Find the watcher container's id and export it for later use:
```bash ```bash
laconic-so --stack mobymask-v2 deploy-system ps | grep "mobymask-watcher-server" laconic-so --stack mobymask-v2 deploy-system ps | grep "mobymask-watcher-server"
export CONTAINER_ID=<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 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` In above output the container ID is `5d3aae4b22039fcd1c9b18feeb91318ede1100581e75bb5ac54f9e436066b02c`
Export it for later use:
```bash
export CONTAINER_ID=<CONTAINER_ID>
```
Run the peer tests: Run the peer tests:
```bash ```bash
@ -87,7 +89,11 @@ docker exec -w /app/packages/peer $CONTAINER_ID yarn test
## Web Apps ## 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 ### mobymask-app
@ -119,15 +125,14 @@ laconic-so --stack mobymask-v2 deploy-system down
Clear volumes: Clear volumes:
* List all volumes * List all relevant volumes:
```bash ```bash
docker volume ls docker volume ls -q --filter name=laconic*
``` ```
* Remove volumes created by this stack * Remove all the listed volumes:
Example:
```bash ```bash
docker volume rm laconic-bfb01caf98b1b8f7c8db4d33f11b905a_moby_data_server docker volume rm $(docker volume ls -q --filter name=laconic*)
``` ```

View File

@ -1,22 +1,22 @@
# Demo # 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 laconic-so --stack mobymask-v2 deploy-system logs mobymask
``` ```
The invite link is seen at the end of the logs The invite link is seen at the end of the logs. Example log:
Example:
``` ```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 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 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. * 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. * In a terminal check logs from the watcher peer container.
* Get the container id * Get the container id:
```bash ```bash
laconic-so --stack mobymask-v2 deploy-system ps | grep mobymask-watcher-server laconic-so --stack mobymask-v2 deploy-system ps | grep mobymask-watcher-server
``` ```
* Check logs * Check logs:
```bash ```bash
docker logs -f CONTAINER_ID docker logs -f <CONTAINER_ID>
``` ```
* 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: Example log:
``` ```bash
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: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 { 2023-03-23T10:25:24.143Z laconic:libp2p-utils Transaction receipt for invoke message {
to: '0x558024C7d593B840E1BfD83E9B287a5CDad4db15', to: '0x558024C7d593B840E1BfD83E9B287a5CDad4db15',
blockNumber: 1996, blockNumber: 1996,
@ -60,7 +60,7 @@
``` ```
* Check the phisher in watcher GQL: http://localhost:3001/graphql * 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 ```gql
query { query {
@ -71,7 +71,7 @@
} }
``` ```
* Get the deployed contract address * Get the deployed contract address:
```bash ```bash
laconic-so --stack mobymask-v2 deploy-system exec mobymask-app "cat src/config.json" 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. * 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. * 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. * 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.