note: มาลองรัน L2 chain ด้วย OP Stack กัน (Part 2: มาแก้ bug ต่อกัน)
โอเค มีคนมาช่วยแก้ 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 ไปเลยกัน