note: มาลองรัน L2 chain ด้วย OP Stack กัน (Part 2: มาแก้ bug ต่อกัน)

Nattawat Songsom
3 min readAug 5, 2023

--

โอเค มีคนมาช่วยแก้ bug แล้ว 555 มาต่อกัน

จาก part ที่แล้วเราติด bug l1 block time เป็น 0 ตลอด

ในที่สุดก็มีคนมา guide ให้

โอเค งั้นมาเริ่มใหม่กัน

fork Goerli

anvil --block-time 12 --fork-url $GOERLI_RPC

หาข้อมูลของ latest filnalized block

cast block finalized --rpc-url http://localhost:8545 | grep -E "(timestamp|hash|number)"

จะได้แบบนี้


hash 0x17e66f6f575dbdb0c846db17f7db4d1c259a9679ada95dce2c53ba8dc14c5fc5
number 9466829
timestamp 1691242236

config ค่าของ L1 ให้กับ OP stack

nano ~/optimism/packages/contracts-bedrock/deploy-config/getting-started.json

โดยเพิ่ม

l1BlockTime : 12

l1StartingBlockTag: hash ของ finalized block

l2OutputOracleStartingTimestamp: timestamp ของ finalized block

จากนั้น deploy contract ที่ต้องใช้บน L1

cd ~/optimism/packages/contracts-bedrock
rm -rf deployments/getting-started
mkdir deployments/getting-started
forge script scripts/Deploy.s.sol:Deploy --private-key $PRIVATE_KEY --broadcast --rpc-url $ETH_RPC_URL
forge script scripts/Deploy.s.sol:Deploy --sig 'sync()' --private-key $PRIVATE_KEY --broadcast --rpc-url $ETH_RPC_URL

แล้วทำการ generate genesis.json และ rollup.json

cd ~/optimism/op-node
go run cmd/main.go genesis l2 --deploy-config ../packages/contracts-bedrock/deploy-config/getting-started.json --deployment-dir ../packages/contracts-bedrock/deployments/getting-started/ --outfile.l2 genesis.json --outfile.rollup rollup.json --l1-rpc http://localhost:8545

โอเค ในที่สุด ขั้นนี้ไม่ error แล้ว !!

ไปต่อกัน

ต่อมาเราจะ copy genesis.json และสร้าง jwt ให้กับ op-geth เพื่อไว้คุยกับ op-node ในภายหลัง

openssl rand -hex 32 > jwt.txt
cp genesis.json ~/op-geth
cp jwt.txt ~/op-geth

โอเค ต่อมา เราจะเอา genesis ไฟล์ที่ copy มา มาใช้ในการ initialize ตัว op-geth ที่เราจะใช้เป็น Sequencer

cd ~/op-geth
mkdir datadir
build/bin/geth init --datadir=datadir genesis.json

จากนั้นเราจะทำการ set environment variables

โดยเราต้อง set ตามนี้

โดยคำสั่งในการ set environment variables แต่ละตัวคือ

export key=value

โอเค มารัน op-geth node กัน

cd ~/op-geth
./build/bin/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=archive \
--nodiscover \
--maxpeers=0 \
--networkid=42069 \
--authrpc.vhosts="*" \
--authrpc.addr=0.0.0.0 \
--authrpc.port=8551 \
--authrpc.jwtsecret=./jwt.txt \
--rollup.disabletxpoolgossip=true

เจอ error port ไปชนกับ L1 แหะ

โอเค คงต้องมาลองเสี่ยงเปลี่ยน port ของ Sequencer กัน อาจจะต้องแก้ script ของ tutorial เยอะหน่อย แต่มาลองดูกัน

มาเริ่มจากการ re initialized op-geth กันก่อน

cd ~/op-geth
rm -rf datadir/geth
build/bin/geth init --datadir=datadir genesis.json

ต่อมาก็รัน node op-geth โดยรอบนี้เราจะเติม rpc url option เป็น 8599 ลงไป

cd ~/op-geth
./build/bin/geth \
--datadir ./datadir \
--http \
--http.corsdomain="*" \
--http.vhosts="*" \
--http.addr=0.0.0.0 \
--http.api=web3,debug,eth,txpool,net,engine \
--http.port=8599 \
--ws \
--ws.addr=0.0.0.0 \
--ws.port=8546 \
--ws.origins="*" \
--ws.api=debug,eth,txpool,net,engine \
--syncmode=full \
--gcmode=archive \
--nodiscover \
--maxpeers=0 \
--networkid=42069 \
--authrpc.vhosts="*" \
--authrpc.addr=0.0.0.0 \
--authrpc.port=8551 \
--authrpc.jwtsecret=./jwt.txt \
--rollup.disabletxpoolgossip=true

โอเค ไม่ error แล้ว !

ต่อมาเราจะมา run op-node ซึ่งทำหน้าที่เป็น consensus client กัน

ซึ่งพอเราเปิด terminal ใหม่ environment variables ที่ set ไว้ก็จะหาย

งั้นมา set environment variables กันใหม่แบบถาวรกัน

sudo -H gedit /etc/environment

โอเค ตอนนี้เราจะได้ environment variables มาละ

แต่พอไปรัน op-node

cd ~/optimism/op-node
./bin/op-node --l2=http://localhost:8551 --l2.jwt-secret=./jwt.txt --sequencer.enabled --sequencer.l1-confs=3 --verifier.l1-confs=3 --rollup.config=./rollup.json --rpc.addr=0.0.0.0 --rpc.port=8547 --p2p.disable --rpc.enable-admin --p2p.sequencer.key=$SEQ_KEY --l1=$L1_RPC –l1.rpckind=$RPC_KIND --l1.trustrpc

ดันเจอ error แหะ

ซึ่ง error เกิดที่ block หลังจากการ fork

โอเค มีคนบอกว่าเค้าใช้ hardhat environment ที่คล้ายๆกับ Anvil ของเราแล้วรันได้อยู่

ไหนๆแล้ว เรามารัน Anvil ใหม่ โดยไม่ต้อง fork chain มาละกัน รอบนี้จะได้เปลี่ยน rpc port ให้ไม่ชนกับ sequencer ด้วย

จริงๆแล้ว เราน่าจะลองใช้ hardhat network แทน Anvil ดู

แต่เหมือน hardhat network จะ setup blocktime ไม่ได้

โอเคพักไว้แค่นี้ ไว้เรามาลอง test Anvil แบบไม่ต้อง fork goerli ไม่ก็ใช้ hardhat network ไปเลยกัน

--

--

No responses yet