devops
Wemix3.0 Testnet L1, Arbitrum L2 연결 테스트 본문
아비트럼이 현재 옵티미즘 롤업 기반 L2 사이에서 높은 TPS를 자랑한다. 많은 Layer 1 프로젝트들이 Layer 2 연구에 옵티미즘을 많이 사용하는 만큼, 가장 빠른 아비트럼으로 테스트를 진행해봤다.
조만간 Orbit이 출시하면 더 친절한 자료들이 나오겠지만, 시급한 서비스 테스트를 위해 현재 Arbitrum Nitro를 L1인 위믹스3.0 테스트넷에 연결시켰다.
https://developer.arbitrum.io/node-running/local-dev-node
위 링크에 들어가면 Local 환경에서 docker-compose로 손쉽게 sequencer와 validator, redis, blockscout까지 올려볼 수 있다. L1은 이더리움 노드가 실행되는데, 설정을 통해서 외부의 wemix3.0 테스트넷으로 지정해야한다.
실행에 있어 모든 설정은 test-node.bash 파일에서 가능하다.
# nitro/test-node.bash
#!/usr/bin/env bash
set -e
NITRO_NODE_VERSION=offchainlabs/nitro-node:v2.0.10-73224e3-dev
BLOCKSCOUT_VERSION=offchainlabs/blockscout:v1.0.0-c8db5b1
mydir=`dirname $0`
cd "$mydir"
num_volumes=`docker volume ls --filter label=com.docker.compose.project=nitro -q | wc -l`
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker volume rm $(docker volume ls -q)
l1chainid=1111
tokenbridge=false
...
docker 컨테이너 실행을 위해, 전에 실행했던 컨테이너를 stop, rm, 이어서 디펜던시를 줄이기 위해 컨테이너 실행에서 사용된 volume도 한번에 지워야한다. l1chainid는 wemix3.0 테스트넷의 디폴트 chainId가 1111이므로 수정해주며, Ethereum L1과 호환되는 tokenbridge는 false로 설정한다.
docker-compose run --entrypoint /usr/local/bin/deploy poster --l1conn <L1_RPC_NODE> --l1keystore /home/user/l1keystore --sequencerAddress $sequenceraddress --ownerAddress $sequenceraddress --l1DeployAccount $sequenceraddress --l1deployment /config/deployment.json --authorizevalidators 10 --wasmrootpath /home/user/target/machines --l1chainid=<L1_ChainId>
시퀀서가 L1에 컨트랙트를 배포할 명령어를 위와같이 수정한다. L1의 RPC 노드 앤드포인트와 ChainId를 수정해준다.
추가로 bridgefund, l1, l2 command 실행을 위해 testnode-scripts/index.ts에서 아래 l1 엔드포인트를 설정해준다.
async function main() {
await Yargs(hideBin(process.argv))
.options({
redisUrl: { string: true, default: "redis://redis:6379" },
l1url: { string: true, default: "ws://geth:8546" }, // wemix endpoint로
l2url: { string: true, default: "ws://sequencer:8548" },
})
중요한 것은 배포과정에서 sequencer account에 WEMIX가 충분히 있어야한다. 미리 L1에서 WEMIX를 충분히 넣어줘야한다.
Funding Validator, Sequencer 과정에서 transaction underpriced 에러가 뜨는데, 이는 nitro/testnode-scripts/ethcommnads.ts에서 gasLimit과 gasPrice를 수정해주면 해결할 수 있다.
const response = await
account.sendTransaction({
to: namedAddress(argv.to, threadId),
value: ethers.utils.parseEther(argv.ethamount),
data: argv.data,
nonce: startNonce + index,
gasLimit: 300000,
gasPrice: 300000000000
})
나는 위와같이 gas 값을 설정했다.
아비트럼은 트랜잭션이 없을 경우 블록을 생성하지 않는다. 그럴만 한 것이 시퀀서는 l2 트랜잭션을 받아서 l1에 batch를 보내기 때문에 받은 L1에 올라간 트랜잭션이 없으면 벨리데이터도 블록 생성할 필요가 없다.
준비가 되면 트랜잭션을 시퀀서에 반복적으로 보내면 위와같이 정상적으로 트랜잭션이 submit되고 블록도 생성된다.
함께 생성된 blockscout에서도 BatchPostingReport를 확인할 수 있다.
시퀀서 account를 보면 L2에서는 트랜잭션 fee를 받기 때문에 잔고가 계속해서 증가하고, L1에서 계속해서 calldata를 전송하기 때문에 수수료가 사용되어 잔고가 줄어드는 것을 확인할 수 있다.
'DevOps > Chain' 카테고리의 다른 글
Arbitrum Transaction GasPrice 0 테스트 (0) | 2023.04.11 |
---|---|
아비트럼의 Arbos, Aggregator, Sequencer, Validator (0) | 2023.04.11 |
Arbitrum 아비트럼 트랜잭션 라이프사이클 (0) | 2023.03.19 |
Arbitrum 아비트럼 블록체인 구조 이해하기 (0) | 2023.03.19 |
Quorum 체인 enableGasPrice 가스비 설정하기 (0) | 2023.03.06 |