Running Scroll SDK Devnet

Overview

This guide should get you started with running a local Scroll SDK devnet. Additionally, it has specific asides for running is on macos.

This guide assumes you have access to the scroll-sdk github repo using your local machine.

We’ve written this guide because local deployments for Kubernetes clusters can be finicky.

By the end of the guide, you should have a Scroll SDK running with a block explorer, RPC, webUI, monitoring and metrics, and a local L1. These are all accessible to wallets, browsers, and applications running on your local machine.

Updates to the Guide
  • August 26, 2024
    • Changes for repository refactor, including new CLI tool commands.
  • July 31, 2024
    • Adding additional make commands and minikube config
  • June 26, 2024
    • Minor typography fixes i.e. docker v to docker -v
  • June 19, 2024
    • Removed external bjw-s dependency and prerequisite
    • Removed manual modification of .env.frontends
    • Updated docker image name used in generating config files
  • June 18, 2024
    • Fixed minikube addons enable commands (missing “addons”)

Prerequisites

  1. Install dependencies (using brew is strongly recommended):
    • Brew (optional)
      • /bin/bash -c "$(curl -fsSL [https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh](https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh))"
    • Docker (Docker Desktop)
      • brew install --cask docker
    • kubectl
      • brew install kubectl
    • minikube
      • brew install minikube
    • Helm
      • brew install helm
    • docker-mac-net-connect (macOS ARM64 only)
      • brew install chipmk/tap/docker-mac-net-connect
  2. Optional: Install dependencies for support CLI tool:
    • node >=18
      • brew install nvm
      • nvm install node
    • scroll-sdk-cli (Experimental, APIs may change)
      • npm install -g scroll-sdk-cli
  3. You should now be able to open a terminal and run the following:
    • docker -v
    • kubectl version
    • minikube status
    • helm version
    • node -v
    • scrollsdk
    • Or, in one step: scrollsdk test dependencies

Starting minikube

To start minikube, run:

minikube start --driver=docker
minikube addons enable ingress
minikube addons enable ingress-dns

Getting minikube to work with custom DNS names on MacOS

Now run the following commands:

minikube ssh "sudo apt-get update && sudo apt-get -y install qemu-user-static"
minikube addons enable ingress
minikube addons enable ingress-dns
sudo brew services start chipmk/tap/docker-mac-net-connect

Installing Scroll SDK

  1. Clone the scroll-sdk repo and find devnet directory

    You’ll need If you need repo access, reach out to @dghelm on Telegram.

    git clone git@github.com:scroll-tech/scroll-sdk.git
    cd scroll-sdk/devnet
  2. Bootstrap

    Now we’ll install Helm chart dependencies, generate additional config files for our services, and create our genesis.json file.

    make bootstrap
  3. Optional: Configure values.yaml and config.toml

    This is the time to adjust what services run on your stack and their configuration. I’d suggest not altering these on your first installation, but see charts/scroll-sdk/values.yaml (view on Github) and config.toml (view on Github).

    If you do make changes, you’ll need to run make config to regenerate the additional configuration files.

  4. Launch the chain!

    make install

    Your chain is now starting! Run kubectl get pods to check in on their progress. In the next section we’ll expose the chain to your local machine so you can interact with the stack.

After Launching the Stack

Funding SDK Addresses

You will need to provide funds to the following accounts:

  • DEPLOYER_ADDR (only needs funded on L1)
    • In the default configuration, this account is pre-funded by Anvil. If changed, you’ll need to relaunch the contracts pod after funding to deploy the contracts.
  • L1_COMMIT_SENDER_ADDR
  • L1_FINALIZE_SENDER_ADDR
  • L1_GAS_ORACLE_SENDER_ADDR
  • L2_GAS_ORACLE_SENDER_ADDR (funded after L2 chain deployment)

If you installed the necessary prerequisites, you can run the cli helper command after Pointing DNS Requests to the Cluster. (Note: this command only works for L1 accounts)

cd scroll-sdk
scrollsdk helper fund-accounts --dev

Other Useful Commands

kubectl get pods will show all the active pods and their status.

kubectl get ingress will show all the exposed services and URIs.

make delete will stop all services. You wil also need to run kubectl delete pvc data-l2-rpc-0 to delete the remaining pvc.

minikube dashboard launches a WebUI for exploring the kubernetes cluster and the various pods, volumes and ingresses without learning all the CLI commands. k9s is also a CLI great tool for exploring running pods and quickly looking at their logs.

If you need to update a specific service’s config file:

  1. Make any necessary changes to the config or helm charts
  2. Run make install
  3. Delete the running pod by running kubectl delete pod [pod-name]

Pointing DNS Requests to the Cluster (MacOS on ARM64)

Running kubectl get ingress should show all the domains setup within the cluster, like the following:

➜ scroll-sdk git:(develop) ✗ kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
admin-system-dashboard nginx admin-system-dashboard.scrollsdk 192.168.49.2 80 5h3m
blockscout nginx blockscout.scrollsdk 192.168.49.2 80 5h3m
bridge-history-api nginx bridge-history-api.scrollsdk 192.168.49.2 80 5h3m
frontends nginx frontends.scrollsdk 192.168.49.2 80 5h3m
grafana nginx grafana.scrollsdk 192.168.49.2 80 5h3m
l1-devnet nginx l1-devnet.scrollsdk 192.168.49.2 80 5h3m
l1-explorer nginx l1-devnet-explorer.scrollsdk 192.168.49.2 80 5h3m
l2-rpc nginx l2-rpc.scrollsdk 192.168.49.2 80 5h3m
l2-rpc-websocket nginx l2-rpc-ws.scrollsdk 192.168.49.2 80 5h3m
rollup-explorer-backend nginx rollup-explorer-backend.scrollsdk 192.168.49.2 80 5h3m

Now, we’ll follow the instructions from the minikube docs for setting up our local machine to use our cluster to resolve all .scrollsdk domain requests.

Take note of the ADDRESS in your output (it should match the result of running minikube ip).

You’ll want to create the following file at /etc/resolver/minikube-scrollsdk (will require sudo access).

domain scrollsdk
nameserver <minikube_ip>
search_order 1
timeout 5

If you prefer, this can be done in one command that creates the directory and file and then outputs the required info:

sudo mkdir -p /etc/resolver && sudo touch /etc/resolver/minikube-scrollsdk && sudo sudo sh -c "cat >>/etc/resolver/minikube-scrollsdk" <<-EOF
domain scrollsdk
nameserver $(minikube ip)
search_order 1
timeout 5
EOF

Lastly, flush your DNS:

sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

Testing Ingress DNS

Try running:

  1. nslookup frontends.scrollsdk $(minikube ip)
  2. curl frontends.scrollsdk
  3. If those work, visit http://frontends.scrollsdk in your browser.
    1. If those do not work, try resetting your machine and running through the instructions in Getting minikube to work with custom DNS names on MacOS and above again. It may help to run minikube stop and minikube start again.

Testing & Interacting with the Chain

scroll-sdk-CLI

The scroll-sdk-cli tool has many helper commands. Run it in the same directory as your config.toml file in the ./devnet/scroll-sdk folder.

  • scrollsdk test ingress will test if your ingress is configured correctly and host urls are accessible from your machine.
  • scrollsdk test contracts will check that essential contracts are deployed, initialized and have the correct owner.
  • scrollsdk helper fund-accounts --dev -a [account-address] will fund any account.
  • scrollsdk helper activity -o -t will generate activity on both layer one and layer two to help produce blocks and batches.

End-To-End Test

The scrollsdk test e2e command will walk you through generating the following tests on your chain:

  • Generate a new wallet
  • Fund it from the Deployer address on L1
  • Deposit funds to the L2
  • Deploying an ERC20 and depositing them to the L2
  • Deploying an ERC20 on the L2
  • Bridging ETH and ERC20 from L2 back to L1
  • Executing the withdrawal claim on L1

If any step fails, you can restart where you left off by adding the --resume flag.

Web UIs

You should now be able to explore the stack on your local machine and using your web browser. All links below assume default configuration and working Ingress DNS.

Connecting to the RPC using a Wallet

To connect directly to an RPC or using MetaMask, use:

NetworkScroll SDK ChainScroll SDK L1
RPC URLhttp://l2-rpc.scrollsdkhttp://l1-devnet.scrollsdk
Chain ID221122111111
Currency SymbolETHETH
Block Explorer URLhttp://blockscout.scrollsdkhttp://l1-devnet-explorer.scrollsdk

Helpful Commands

Anvil has a lot of useful methods that can manipulate the L1. Proper documentation for using them is available in the Hardhat docs (replacing hardhat_ with anvil_)

Set L1 Token Balance of an Account

In params, change first item to a wallet, and second to hex of wei. This config uses 1000 ETH.

See docs for details.

curl --location 'http://l1-devnet.scrollsdk/' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc":"2.0",
"method":"anvil_setBalance",
"params":["0x98110937b5D6C5FCB0BA99480e585D2364e9809C","0x3635C9ADC5DEA00000"],
"id":0
}'

Mine some L1 Block

See docs for details.

curl --location 'http://l1-devnet.scrollsdk/' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc":"2.0",
"method":"anvil_mine",
"params":["0x10000000", "0xc"],
"id":0
}'

Troubleshooting

ingress-dns issues

Getting ingress-dns can be tricky across different machines, operating systems and network configurations.

Directly editing etc/hosts has worked for some users, adding all ingress hosts pointing to the minikube IP address.

Follow the template below, being sure to create one value for every ingress in your configuration. Also, be sure to try the IP of your minikube deployment.

For VPN users, we’ve seen the following work:

  1. Execute command sudo minikube tunnel

  2. Open file /etc/hosts and add:

    127.0.0.1 l1-devnet.scrollsdk
    127.0.0.1 bridge-history.scrollsdk
    127.0.0.1 frontends.scrollsdk
    127.0.0.1 grafana.scrollsdk
    127.0.0.1 l1-devnet-explorer.scrollsdk
    127.0.0.1 l2-rpc.scrollsdk
    127.0.0.1 blockscout.scrollsdk
    127.0.0.1 bridge-history-api.scrollsdk
  3. Turn off VPN when visiting in browser

Stay up-to-date on the latest Scroll Developer news
Roadmap updates, virtual and live events, ecosystem opportunities and more
Thank you for subscribing!

Resources

Follow Us