Skip to content

Deploy an OP Stack devnet ​

This guide will show you how to run your own OP Stack devnet.

Dependency setup ​

Environment setup and Golang installation ​

First, install dependencies.

Clone repository ​

Next, clone the repo:

bash
cd $HOME
git clone https://github.com/celestiaorg/optimism
cd optimism
cd $HOME
git clone https://github.com/celestiaorg/optimism
cd optimism

Check out to the version for either the devnet (this page) or testnet tutorial:

bash
git checkout v0.1.3-OP_v1.0.6-CN_v0.11.0-rc8
git checkout v0.1.3-OP_v1.0.6-CN_v0.11.0-rc8
bash
git checkout v0.1.3-OP_v1.0.6-CN_v0.11.0-rc8
git checkout v0.1.3-OP_v1.0.6-CN_v0.11.0-rc8

asdf ​

Install asdf to allow us to install a specific version of node easily.

Here is an example for Ubuntu using bash:

bash
cd $HOME
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.11.2
echo '. "$HOME/.asdf/asdf.sh"' >> ~/.bashrc
echo '. "$HOME/.asdf/completions/asdf.bash"' >> ~/.bashrc
cd $HOME
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.11.2
echo '. "$HOME/.asdf/asdf.sh"' >> ~/.bashrc
echo '. "$HOME/.asdf/completions/asdf.bash"' >> ~/.bashrc

Set the path from the asdf documentation based on your operating system and shell type.

Here is an example for Ubuntu using bash:

bash
export PATH=$PATH:~/.asdf/bin/
export PATH=$PATH:~/.asdf/bin/

Check that it was installed:

bash
asdf
asdf

Node.js ​

Install nodejs 16.16.0:

bash
asdf plugin add nodejs
asdf install nodejs 16.16.0
asdf local nodejs 16.16.0
source ~/.bashrc
asdf plugin add nodejs
asdf install nodejs 16.16.0
asdf local nodejs 16.16.0
source ~/.bashrc

Install NPM:

bash
apt install npm
apt install npm

Update NPM to v9.6.5:

bash
npm install -g npm@9.6.5
npm install -g npm@9.6.5

If using NVM, install NPM v9.6.5:

bash
nvm install v9.6.5
nvm install v9.6.5

Then set the version:

bash
nvm use v9.6.5
nvm use v9.6.5

python ​

Install python 3.10.7:

bash
asdf plugin-add python
asdf install python 3.10.7
asdf local python 3.10.7
source ~/.bashrc
asdf plugin-add python
asdf install python 3.10.7
asdf local python 3.10.7
source ~/.bashrc

Foundry ​

Download the Foundry script execute it to set up environment:

bash
curl -L https://foundry.paradigm.xyz/ | bash
curl -L https://foundry.paradigm.xyz/ | bash

Set path:

bash
source /root/.bashrc
source /root/.bashrc

Run foundryup to install Foundry (forge, cast, anvil, chisel):

bash
foundryup
foundryup

Yarn ​

Install yarn:

bash
npm install -g yarn
npm install -g yarn

Depending on the version installed, you may need to update your version of NPM.

Docker compose ​

Install docker-compose:

bash
apt install docker-compose
apt install docker-compose

gcc & libusb ​

bash
apt install gcc libusb-1.0-0-dev
apt install gcc libusb-1.0-0-dev

macOS only: set up python ​

bash
brew install python3
npm config set python /usr/local/bin/python3
npm cache clean --force
brew install python3
npm config set python /usr/local/bin/python3
npm cache clean --force

Build devnet ​

Build TypeScript definitions for TS dependencies:

bash
cd $HOME
cd optimism
yarn && make build-ts
cd $HOME
cd optimism
yarn && make build-ts

Set environment variables to start network:

bash
export SEQUENCER_BATCH_INBOX_ADDRESS=0xff00000000000000000000000000000000000000
export L2OO_ADDRESS=0x70997970C51812dc3A010C7d01b50e0d17dc79C8
export SEQUENCER_BATCH_INBOX_ADDRESS=0xff00000000000000000000000000000000000000
export L2OO_ADDRESS=0x70997970C51812dc3A010C7d01b50e0d17dc79C8

Start devnet ​

Start the network by running:

bash
make devnet-up
make devnet-up

This starts up the layer 1 (ETH), layer 2 (op-geth), data availability layer (Celestia), the sequencer (op-node), batch submitter (op-batcher), state commitment service (op-proposer).

View the logs of the devnet ​

If you'd like to view the logs of the devnet, run the following command from the root of the Optimism directory:

bash
make devnet-logs
make devnet-logs

optional

lazydocker ​

You can install lazydocker to view all of the components of your stack in one TUI by running:

bash
asdf plugin add lazydocker https://github.com/comdotlinux/asdf-lazydocker.git
asdf list all lazydocker
asdf install lazydocker 0.12
asdf global lazydocker 0.12
asdf plugin add lazydocker https://github.com/comdotlinux/asdf-lazydocker.git
asdf list all lazydocker
asdf install lazydocker 0.12
asdf global lazydocker 0.12

And run the command:

bash
lazydocker
lazydocker

If you do this, you can skip the viewing containers section and find a transaction.

Stop devnet ​

If you'd like to start the network over, use the following command to safely shut down all of the containers:

bash
make devnet-down
make devnet-down

Then clean out the old config:

bash
make devnet-clean
make devnet-clean

Viewing containers ​

To view the containers running, send:

bash
docker ps
docker ps

Find the container ID of the ops-bedrock_op-batcher_1 and run the following to follow the logs:

bash
docker logs -f <container-id>
docker logs -f <container-id>

In a new terminal, find the container ID of the ghcr.io/celestiaorg/local-celestia-devnet:main and run the following to follow the logs:

bash
docker logs -f <container-id>
docker logs -f <container-id>

You can do the same for other containers as you explore the stack.

Find a transaction ​

Now, we'll check for a recent transaction on the L1 with:

bash
cast block latest --rpc-url localhost:8545
cast block latest --rpc-url localhost:8545

Output of a block that contains a transaction will look like this:

console
baseFeePerGas        7
difficulty           2
extraData            0xd883010a16846765746888676f312e31382e35856c696e75780000000000000001749030eb8e51903cf49e2c8c21e7ff98aaa7d45e3ecd51b8594440c5c66e9931b70b18d1a629212074f3ef9188bd0a9079e094e414d287f73d40ea8392349600
gasLimit             30000000
gasUsed              21072
hash                 0x9d764f5e3e2ccf5a334ae4fbe3827e7b80750f39aa671c958b5c09a9b67d9dfc
logsBloom            0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
miner                0x0000000000000000000000000000000000000000
mixHash              0x0000000000000000000000000000000000000000000000000000000000000000
nonce                0x0000000000000000
number               1569
parentHash           0x1a5100654617b565bf2a117c7487a57c54d0c61b99d94592518fbc07b3fec45d
receiptsRoot         0xa981da57b00630bb01a6eb02629212ea8b0c89281a07295ace6bb78c81193e68
sealFields           []
sha3Uncles           0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347
size                 740
stateRoot            0x9d1e02cbf556997123676f47749a043b5bd9bebe629f5dbd3f256a7d5e37b665
timestamp            1677272382
totalDifficulty      3139
transactions:        [
    0x40b79afe3dc05ff398c2142ab47eb94ac3759a03dd1322b2d97bcdc2d1c34934
]
baseFeePerGas        7
difficulty           2
extraData            0xd883010a16846765746888676f312e31382e35856c696e75780000000000000001749030eb8e51903cf49e2c8c21e7ff98aaa7d45e3ecd51b8594440c5c66e9931b70b18d1a629212074f3ef9188bd0a9079e094e414d287f73d40ea8392349600
gasLimit             30000000
gasUsed              21072
hash                 0x9d764f5e3e2ccf5a334ae4fbe3827e7b80750f39aa671c958b5c09a9b67d9dfc
logsBloom            0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
miner                0x0000000000000000000000000000000000000000
mixHash              0x0000000000000000000000000000000000000000000000000000000000000000
nonce                0x0000000000000000
number               1569
parentHash           0x1a5100654617b565bf2a117c7487a57c54d0c61b99d94592518fbc07b3fec45d
receiptsRoot         0xa981da57b00630bb01a6eb02629212ea8b0c89281a07295ace6bb78c81193e68
sealFields           []
sha3Uncles           0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347
size                 740
stateRoot            0x9d1e02cbf556997123676f47749a043b5bd9bebe629f5dbd3f256a7d5e37b665
timestamp            1677272382
totalDifficulty      3139
transactions:        [
    0x40b79afe3dc05ff398c2142ab47eb94ac3759a03dd1322b2d97bcdc2d1c34934
]

And copy the transaction hash from transactions: [<transaction-hash] and set it as a variable:

bash
export TX_HASH=0xb8869dfecf9a5a0e26df6b13e64071b859f2cc0587b97cb4387abf9ddb2ff9a0
export TX_HASH=0xb8869dfecf9a5a0e26df6b13e64071b859f2cc0587b97cb4387abf9ddb2ff9a0

Read the transaction call data ​

Now read the transaction call data on the L1:

bash
cast tx $TX_HASH --rpc-url localhost:8545
cast tx $TX_HASH --rpc-url localhost:8545

The output will look similar to below:

console
blockHash            0xce5691878b61e3b5bbae66317512365ef6bb1f597b4dfc11e585abf470cdf4dd
blockNumber          1164
from                 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC
gas                  21072
gasPrice             1000000007
hash                 0xb8869dfecf9a5a0e26df6b13e64071b859f2cc0587b97cb4387abf9ddb2ff9a0
input                0x0000000000000c2a00000000
nonce                318
r                    0x9a32da65f4dabf0e1c6d2a86d52c7d6f868997cfc1183fc28c5f0a0615a5e678
s                    0x4ce385cc70a178b86d95de05428763805183276a6fd418c44e346a3838a70144
to                   0xfF00000000000000000000000000000000000000
transactionIndex     0
v                    0
value                0
blockHash            0xce5691878b61e3b5bbae66317512365ef6bb1f597b4dfc11e585abf470cdf4dd
blockNumber          1164
from                 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC
gas                  21072
gasPrice             1000000007
hash                 0xb8869dfecf9a5a0e26df6b13e64071b859f2cc0587b97cb4387abf9ddb2ff9a0
input                0x0000000000000c2a00000000
nonce                318
r                    0x9a32da65f4dabf0e1c6d2a86d52c7d6f868997cfc1183fc28c5f0a0615a5e678
s                    0x4ce385cc70a178b86d95de05428763805183276a6fd418c44e346a3838a70144
to                   0xfF00000000000000000000000000000000000000
transactionIndex     0
v                    0
value                0

Now set the input as the INPUT variable, removing the 0x from the beginning:

bash
export INPUT=0000000000000c2a00000000
export INPUT=0000000000000c2a00000000

TIP

Remember to remove the 0x!

Find the data on Celestia ​

Now navigate to optimism/op-celestia and run:

bash
go run main.go $INPUT
go run main.go $INPUT

Your result will look similar to the below!

console
celestia block height: 3114; tx index: 0
-----------------------------------------
optimism block data on celestia: [00191cef8fb52cf322b77694ff5a92149800000000020b78dadae1c7f0c37b015fdd84970dfbe3ff4ab7abe8b9083c94aebe7df77e705bba47f8e72b762fadcecd6b62695920e9eee3e5369b3fd265726ebcfbfcbf3f5fcde3bd6960f53b7da1c147ae4fefe689b724ff54c83a0031ef93479f5a75f08e6a9bbd0b755c220e4ed8b3fd5c9cfc1b9ed0ca69dcabbf5cbd274aac793950f38ef6bd59e551e56d77fcf7aabd9287abd8af7b9de39cb3235732c58be7034774bf54134beb828c19b15f3553a74b64ffbd3a2fe0e8cbb77b0217dccb4f68de9774fbac5efaed040190797950f3e22bafc9d7884cf616d87db6a46ace99b277252dd36f9c7d5ebabfd46d5a71bec9872696b605173ccc153d4a7befbd69f64f6db25cc7dd59f86d5de586b457f7d759f73fe57fde0c32af006a5eebdcfb85d385b3ef3d158fbccaf263cb8b35cb2a58cc0f083f5cf3b742d555f3fe2362cd2b829a37c9c9446fedbf8d911f3f86cc79c335e960f26d5eef25e735f7dd9b926019dcf1ed5b134bfb02416e36be3b277635b757f36f2bff9260ddcf1f20132e5071afe8bcdd9ccdcffda440e69540cddbb548ecdd73863673ab122e2d36d69dfc8bd71be61dbae235cf63e3a9a0121141b726968e051d2b7ef076b11f3c9964b4fee0acfb93777fbd37d94dfdecfdd6836af39ebaaff58c07995706352fdf9259b773cfd42e0ed168914542c54ca28147969b18b7987ef233fcd41c1cde44ac79150700010000fffff649400701]
celestia block height: 3114; tx index: 0
-----------------------------------------
optimism block data on celestia: [00191cef8fb52cf322b77694ff5a92149800000000020b78dadae1c7f0c37b015fdd84970dfbe3ff4ab7abe8b9083c94aebe7df77e705bba47f8e72b762fadcecd6b62695920e9eee3e5369b3fd265726ebcfbfcbf3f5fcde3bd6960f53b7da1c147ae4fefe689b724ff54c83a0031ef93479f5a75f08e6a9bbd0b755c220e4ed8b3fd5c9cfc1b9ed0ca69dcabbf5cbd274aac793950f38ef6bd59e551e56d77fcf7aabd9287abd8af7b9de39cb3235732c58be7034774bf54134beb828c19b15f3553a74b64ffbd3a2fe0e8cbb77b0217dccb4f68de9774fbac5efaed040190797950f3e22bafc9d7884cf616d87db6a46ace99b277252dd36f9c7d5ebabfd46d5a71bec9872696b605173ccc153d4a7befbd69f64f6db25cc7dd59f86d5de586b457f7d759f73fe57fde0c32af006a5eebdcfb85d385b3ef3d158fbccaf263cb8b35cb2a58cc0f083f5cf3b742d555f3fe2362cd2b829a37c9c9446fedbf8d911f3f86cc79c335e960f26d5eef25e735f7dd9b926019dcf1ed5b134bfb02416e36be3b277635b757f36f2bff9260ddcf1f20132e5071afe8bcdd9ccdcffda440e69540cddbb548ecdd73863673ab122e2d36d69dfc8bd71be61dbae235cf63e3a9a0121141b726968e051d2b7ef076b11f3c9964b4fee0acfb93777fbd37d94dfdecfdd6836af39ebaaff58c07995706352fdf9259b773cfd42e0ed168914542c54ca28147969b18b7987ef233fcd41c1cde44ac79150700010000fffff649400701]