베를린 하드포크 이후 토카막 스테이킹 시스템의 가스 최적화

Jason Hwang
May 10 · 11 min read

Introduction

이번 베를린 하드포크를 통해 도입된 EIP 중 가장 주목 받는 EIP는 EIP 2929와 EIP 2930이 아닐까 싶습니다. 해당 EIP에서는 몇몇 옵코드들의 가스비가 조정됨과 함께 새로운 트랜잭션 유형이 추가 되었는데, 이번 포스팅에서는 이에 대해 간단히 알아보겠습니다. 그 다음, 이로인해 토카막 네트워크의 스테이킹 서비스를 이용하는데 어떤 영향이 있을지 알아보고, 가스비를 최적화 하는 과정을 소개해 드리도록 하겠습니다.

EIP 2929

비탈릭이 제안한 EIP 2929를 살펴보면 트랜잭션에서 처음 사용하는 SLOAD , *CALL , BALANCE , EXT* 옵코드와 SELFDESTRUCT 옵코드에 대한 가스비가 상승한다는 내용입니다.

각 옵코드별 변경 내용을 살펴보자면, SLOAD(0x54)의 가스 소모량을 2100으로, *CALL(0xf1, f2, f4, fA), BALANCE(0x31)EXT*(0x3b, 0x3c, 0x3f)의 가스 소모량을 2600으로 상향 조정한다고 되어 있습니다. 이 내용만 보면 트랜잭션 전송에 필요한 가스양이 대폭 상승하여 사용자들의 부담이 가중되는 것 같지만 precompile된 코드나 같은 트랜잭션에 이미 액세스한 주소 및 스토리지 슬롯은 해당 비용을 적게 소모하게하여 트랜잭션 전송 비용이 절감되는 측면도 있을 것 같습니다.

옵코드마다 책정되어 있는 가스 소모량은 해당 옵코드를 처리하는데 필요한 시간들을 추정하기 위함입니다. 이를 변경했을 때 얻을 수 있는 이점은 블록처리 시간을 안정적으로 만들 수 있다는 점 입니다. 즉, 가스 리밋과 블록을 처리하는데 필요한 시간을 어느정도 일치 시켜 블록 처리 시간을 안정적으로 만들어야 하는데, 그 동안 스토리지에 접근하는 옵코드들의 가격이 너무 저렴한 탓에 이러한 부분에 대해 취약했던 문제를 해결할 수 있을것으로 기대 됩니다.

해당 EIP의 두 번째 이점은 stateless witness의 크기를 이더리움에서 수용할 수 있는 수준으로 만들 수 있다는 점 입니다. Merkle 트리에서 이진 trie로 전환을 가정 했을때 이론적인 witness의 최대크기는 14.3MB에서 3.85MB로 축소 될 것이라고 했습니다. 그 외에도 이더리움에서 영지식 증명을 사용할 때 발생했던 문제점인 witness 생성시간도 줄일 수 있다고 합니다. 이와 관한 자세한 내용은 다른 포스팅에서 다루도록 하겠습니다.

그럼 이제 가스비가 어떻게 변할지 알아보도록 하겠습니다. 먼저 베를린 하드포크의 영향을 가장 많이 받는 SLOADSSTORE 옵코드를 중점적으로 알아보겠습니다.

Gas costs before EIP 2929

EIP-2929 이전의 SLOAD 비용 측정 방식은 매우 간단합니다. SLOAD 는 항상 800 가스를 소비했습니다. 반면에, SSTORE 에 소모되는 가스량은 스토리지 슬롯의 현재 값에 따라 달라지기 때문에 가장 복잡한 가스 계산 방식을 갖고 있습니다. 간단한 예시를 통해 SSTORE 에 소모되는 가스 량이 어떻게 달라지는지 확인해 보겠습니다.

  • 스토리지 슬롯 값이 0에서 1(혹은 0이 아닌 값)로 변경되는 경우 20000 가스가 소모됩니다.
  • 스토리지 슬롯 값이 1에서 2(혹은 0과 1이 아닌 다른 값)로 변경되는 경우 5000 가스가 소모 됩니다.
  • 스토리지 슬롯의 값이 1(또는 0이 아닌 값)에서 0으로 변경되면 5000 가스가 소모 되지만 트랜잭션의 끝 부분에서 환불 받습니다. 환불에 대한 내용은 베를린 하드포크의 영향을 받지 않기 때문에 이 포스팅에서는 다루지 않겠습니다.
  • 스토리지 슬롯 값이 하나의 트랜잭션을 통해 같은 스토리지 슬롯에 여러번 접근할 수 있는데, 한 번 접근한 이후에 같은 스토리지 슬롯에 접근할 경우 가스 소모량은 800 입니다.

여기서 알아두어야 할 부분은 SSTORE 옵코드가 많은 가스를 소모하고, 몇 가지 요인에 의해 소모량이 좌우된다는 점입니다.

Gas costs after EIP 2929

EIP 2929가 적용되면 이러한 값들이 전부 변경됩니다. 하지만 위에서 언급했던 것 처럼 트랜잭션 비용이 절감되는 측면도 있는데, 지금 소개해드릴 accessed_addressaccessed_storage_keys 를 통해 이러한 것들이 가능해 집니다.

이더리움 주소 또는 스토리지의 키가 트랜잭션에서 사용되면 접근(Access)된 것으로 간주 되는데 이렇게 된다면 SSLOAD , SSTORE 와 같은 옵코드를 사용하는데 소모되는 가스의 양이 감소합니다. 그럼 간단한 예시를 통해 EIP 2929 후에 가스 소모량 변화에 대해 알아보도록 하겠습니다.

베를린 하드포크 이전에 SLOAD 의 가스 소모량은 800으로 고정되어 있었습니다. 하지만 하드포크 이후에는 스토리지에 접근했는지 여부에 따라 달라집니다. 접근한 적이 없다면 SLOAD 는 2100의 가스를 소모하게되고 접근한 적 있다면 100 만큼의 가스를 소모합니다.

그 다음은 SSTORE 와 관련된 예제를 살펴보겠습니다.

슬롯 값이 0에서 1(또는 0이 아닌 값)로 변경되는 경우 비용은 다음과 같습니다.

  • 스토리지 키에 접근한 적 없는 경우 22100
  • 접근한 적 있다면 20000

슬롯 값이 1에서 2(또는 0이 아닌 다른 값)로 변경되는 경우 비용은 다음과 같습니다.

  • 스토리지 키에 접근한 적 없는 경우 5000
  • 접근한 적 있다면 2900

슬롯의 값이 1(또는 0이 아닌 값)에서 0으로 변경되면 비용은 베를린 하드포크 이전과 동일하고 여기에 환불되는 가스가 추가 됩니다. 동일한 트랜잭션을 통해 스토리지 슬롯 값이 수정 되었다면, 그 이후의 모든 SSTORE는 100의 가스를 소모합니다.

이러한 내용을 표로 정리하면 다음과 같습니다.

EIP 2930

EIP 2930은 위에서 언급한 트랜잭션이 접근하려는 접근 목록(Access List)을 포함하는 새로운 트랜잭션 유형을 추가하는 것에 대한 내용 입니다.

접근 목록은 지정된 이더리움 주소들과 스토리지 키들 이며, 이 주소와 키들은 각각 accessed_addressesaccessed_storage_keys 에 추가 됩니다.

EIP2930을 통해 제안되는 새로운 유형의 트랜잭션은 트랜잭션이 실행되기 전에 접근한 것으로 간주해야하는 주소와 스토리지 슬롯을 미리 선언할 수 있게합니다.(접근목록에 포함되지 않은 슬롯의 SLOAD가스 소모량은 2100이지만, 접근 목록에 포함되어 있는 슬롯이라면 SLOAD 는 100만큼의 가스만 소모합니다.)

접근 목록에 포함되어 있을 경우 SLOAD, SSTORE 와 같은 옵코드를 사용할 때 각각 100이나 200 정도의 가스 밖에 소모하지 않는다면 접근 목록에 모든 것을 저장해두는 방식으로 가스비를 절약할 수 있을까요? 정답은 아니오 입니다. 각 주소와 스토리지 키를 추가하려고 할 때 마다 각각 2400과 1900만큼의 가스가 소모되기 때문입니다. 예를 들어 접근 목록과 함께 트랜잭션을 보내고, 0x0 슬롯을 사용하는 첫 번째 옵코드가 SLOAD 라면, 가스 소모량은 2100이 아니라 100이 됩니다. 하지만 트랜잭션 접근 목록에 포함된 각 스토리지 키의 가스 소모량이 1900이기 때문에 실제로 절약되는 가스 소모량은 100입니다.

여기까지 읽어보셨다면 접근 목록을 포함한 트랜잭션을 사용하는 것이 나은지, 실제로 가스 소모량이 얼마나 감소하는지에 대한 궁금증이 생길 것 같습니다. 토카막 네트워크의 스테이킹 시스템을 통해 실제로 가스 소모량이 어떻게 바뀌는지 알아보도록 하겠습니다.

Comparison Gas Consumption in Tokamak Network Staking

go-ethereum 1.10.2 버전부터 접근 목록을 생성하는데 사용할 수 있는 새로운 rpc 메소드인 eth_createAccessList 가 추가 되었습니다. eth_createAccessListeth_estimateGas 와 같이 해당 트랜잭션을 전송하는데 필요한 가스 소모량을 측정해 반환하며 그외에도 아래와 같이 접근 목록 또한 반환 합니다.

토카막 네트워크 스테이킹 시스템에서 많이 활용하는 기능은 delegate, undelegate, withdrawal, commit 이렇게 4가지가 있습니다. 이 다섯 가지 함수를 통해 트랜잭션이 전송 될때 소모되는 실제 가스량의 차이를 알아보도록 하겠습니다. 방식은 go-ethereum의 console에 접근해 아래 그림과 같이 각 함수에 estimateGascreateAccessList 를 실행시켜보고 가스 소모량을 비교해 볼 것입니다.

첫 번째는 delegate 입니다. delegateestimateGas 함수와 createAccessList 함수에 넣었을때 결과는 각각 다음과 같습니다.

estimateGas

createAccessList

  • estimateGas: 455,782
  • createAccessList: 361,738

각 가스 사용량을 비교해 결과 createAccessList 를 사용했을때 94,144 정도의 가스가 절약된 것을 확인할 수 있었습니다.

undelegate의 가스 소모량을 비교해본 결과는 다음과 같습니다.

  • estimateGas: 224,662
  • createAccessList: 220,753

undelegate의 경우 3,909 만큼의 가스가 덜 소모된 것을 확인할 수 있었습니다.

withdrawalundelegate 한 후 약 2주가 지나야 실행할 수 있기 때문에 테스트를 수행하지 못 했습니다.

다음은 commit을 비교해보도록 하겠습니다.

  • estimateGas: 432,829
  • createAccessList: 418,192

commit을 비교해본 결과 14,637 가스가 절약되는 것을 확인할 수 있었습니다.

Conclusion

Gas consumption change

한 눈에 볼수 있도록 테스트 결과를 표로 정리해 보았습니다. 각 기능마다 절약되는 가스양은 달랐지만, 접근 목록을 포함하는 트랜잭션을 전송할 경우 접근 목록을 사용하는 것 보다 가스 소모량이 줄어들었음을 확인할 수 있었습니다.

하지만 아직 접근 목록을 실제로 활용하는데 어려움이 있습니다. web3.js 와 ethers.js에서 아직 eth_createAccessList 함수를 지원하지 않기 때문입니다. 해당 기능을 지원하게 된다면 다음 수도 코드와 같은 형식으로 컨트랙트를 전송하는 함수를 변경하여 가스비를 절약 할 수 있을 것으로 추정됩니다.

토카막 네트워크의 스테이킹 시스템에서 활용하는 함수를 통해 확인한 결과 각 함수별 가스 사용량의 변화는 각각 차이가 있었습니다. delegate 같은 경우는 약 20% 이상 절약되는 것으로 보였지만 undelegate같은 경우는 약 2% 정도 밖에 절약되지 않았습니다. 이를 통해 짐작할 수 있는 점은 어떤 함수는 접근 목록을 사용했을 때 오히려 가스 소모량이 증가하는 경우도 생길 수 있을 것입니다. 그런 상황을 방지하기 위해 위 수도 코드와 같은 방식으로 가스 사용량을 비교해보고 가스를 더 적게 사용하는 방식을 택한다면 가스를 더 효율적으로 사용할 수 있을것으로 보입니다.

Reference

https://hackmd.io/@fvictorio/gas-costs-after-berlin

https://eips.ethereum.org/EIPS/eip-2930

https://eips.ethereum.org/EIPS/eip-2929

Onther

Building an Ethereum Blockchain ECO system to Change the…

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store