devops

Rollup Layer 2를 위한 TPS 테스팅 툴 개발해보기 본문

Layer2

Rollup Layer 2를 위한 TPS 테스팅 툴 개발해보기

vata500 2023. 4. 18. 21:09
반응형

Rollup L2들은 L1에 트랜잭션 Batch를 전송하기 때문에 최적화를 위해선 Layer 1에 전송되는 batch와 state와 관련된 Tx도 체크해야 한다. 그래서 단순히 Tx가 전송되는 것만 체크해선 소용없다.

코드를 수정하고 체인을 다시 올리고 직접 log를 일일이 확인하면서 테스트했는데, 너무 비효율적이라 직접 테스팅 툴을 go언어로 개발하게 되었다. 개발하면서 고민했던 주요 기능은 다음과 같다.

- EVM Transaction : Dapp에 최적화된 Layer가 필요하기 때문에 단순히 value를 전송하기 보다 Contract를 사용하는 Tx가 필요하다.
- Layer Batch Post Log : L2에서 Tx가 처리됨과 동시에 L1에 정상적으로 Batch가 Post되었는지 확인할 수 있어야 한다.
- 병렬 Tx 처리 : 단일 account로 Tx를 많이 처리하는 것은 순서가 정해진 Nonce에 의해서 한계가 있다. 여러 Account가 동시다발적으로 Tx를 전송할 수 있어야 한다.

개발에 사용된 언어는 Go이며, 시간이 많지 않기 때문에 당장 테스트를 위해 간단하게 구현했다.


# config.toml

[host]
url = "http://localhost:8547"
address = ""
privatekey = ""

[sendeth]
value = 0.1
interval = 0.2
minute = 1

[transfererctoken]
value = 0.000005
interval = 0.1
minute = 1
tokenaddress = "0xB5Ecb114b3b8f025daa9ebe763812aD1658db9FB"
log_path = "nitro.log"
accounts = 10

위 config.toml은 go 빌드 파일을 실행하기 위한 설정 파일이다. 
- host는 Sequencer 노드의 endpoint와 Tx를 전송할 account의 address, privatekey를 설정한다.
- sendeth는 단순히 eth 전송 테스트를 위해서 사용하는 것으로 전송할 value와 시간간격(초), 전송할 시간(분)을 정한다.
- transfererctoken에는 전송할 erc20 토큰의 value와 시간간격(초), 전송할 시간(분), 그리고 토큰 어드레스와 Poster의 log 파일, 병렬로 transfer tx를 전송할 account 수를 설정한다.

erc20 토큰 전송을 하려면 -transfererctoken 이라는 플래그를 함께 넣고 빌드파일을 실행하면 된다. account를 10개로 설정했기 때문에 아래와 같이 10개의 account가 동적으로 생성되고 0x31... 이라는 Host account가 보유하고 있는 erc20을 10개의 account에게 전송한다. (10개의 account 모두에게 erc20 토큰이 있어야만 transfer tx를 전송할 수 있기 때문)

10개의 account 생성

이제 아래와 같은 go routine을 사용해서 생성된 account의 개수에 맞게 동시에 TransferErc20token 메소드를 실행하면서 10개의 account가 동시에 transfer하게 된다.

	for i := 0; i < n; i++ {
		host := a[i]
		go func() {
			for {
				select {
				case <-done:
					return
				default:
					TransferErc20token(host, Conf.Transfererctoken)
					time.Sleep(time.Duration(Conf.Transfererctoken.Interval*1000) * time.Millisecond)
				}
			}
		}()
	}

아래와 같이 0.1초 간격으로 동시다발적으로 tx가 생성되는 것을 확인할 수 있다. 

1분의 시간이 경과되면 총 발생한 tx 수(Total_Tx), 평균 TPS(Average_TPS), 경과시간(Testing_Time)이 출력되고, Tx가 생성한 시간부터 지금까지의 Poster의 Batch log만 출력된다. 

그리고 해당 log는 batch-날짜.log로 기록되어 생성된다. BatchPoster: batch post 로그라인에서 Segments는 시퀀서에 의해서 L1에 게시된 시퀀서 데이터다. 대체로 처리된 Tx보다 더 수가 많이 나온다. 그러나 10개의 account가 tx를 발생시켰더니, sequencer에 과부하되어 모두 처리되지 못한 것으로 추정된다.

일반적인 환경의 아비트럼이라면 가스비가 폭등하여 Tx를 조절하겠지만 가스비가 없기 때문에 발생한 문제다. 

아무튼, 계속 테스트해 보고 툴도 다듬어가야 한다. L1의 calldata와 tx 내역, batch의 사이즈도 확인할 수 있는 코드도 구현할 계획이다. 재밌당.

반응형
Comments