Estimate gas 오류 / estimate gas 의 작동 원리가 궁금합니다

하드포크 이후에 발생한 이슈인지는 확실하지는 않습니다.
현재 일부 컨트랙트에서 estimate gas 를 하는데 에러가 나고 있습니다.
(같은 estimate 호출 코드로 일부 컨트랙트는 estimate 가 되고, 일부는 안됩니다.)
오류에 대한 자세한 내용은 아래에 있습니다
아직 많은 분들이 못본거 같아 링크를 첨부합니다

estimate gas 에 어려움이 있어 여러가지를 테스트해보고 있는데, 아래에 정리된 질문을 남깁니다.

  1. estimate gas 는 실제로 어떻게 작동하는지 궁금합니다. 실제 소모된 fee history 를 기반으로 측정하나요? 아니면 컨트랙트 코드를 기반으로 결정되나요? 컨트랙트 배포 후 첫 컨트랙트에서는 estimated 된 만큼 가스를 주면 out of gas 오류가 나고, 그 이후에는 괜찮았던 경험이 있어서 여쭙습니다.
  2. estimate gas 가 컨트랙트의 코드에 따라서 실패할 수 있는 가능성이 있나요? 현재 일부 컨트랙트에서만 estimate gas 가 실패하고 있어서 여쭙습니다. 같은 estimate gas 호출 코드로 일부 컨트랙트에서는 오류가 나고, 일부 컨트랙트에서는 오류가 나지 않고 있기 때문에 컨트랙트 또는 배포과정 또는 설정 등에 오류가 있다고도 볼 수 있을까요? (컨트랙트의 작동에는 문제가 없습니다)
  3. 현재 겪고 있는 오류 메세지인 gas required exceeds allowance 의 정확한 의미가 궁금합니다. allowance 의 개념이 정확히 무엇을 의미하는지요?

읽어주셔서 감사합니다.

@zn1

안녕하세요.
이전 문의글에 *.sol 파일 첨부를 부탁드렸으니 확인 부탁드립니다 :slight_smile:

EstimateGas 의 작동 원리는 DoEstimateGas 를 참고해보시면 확인해보실 수 있습니다.

  • 사용자가 EstimateGas 에 기재한 gas량을 상한선으로 설정 (만약 tx에 기재한 gas가 21,000보다 작다면 gas값을 높게 설정 - 약 9999억)
  • 하한선은 21,000 - 1로 설정
  • 상한선과 하한선을 두고 최적의 gas 값을 도출하기 위해 Binary Search를 시작. low >= hi 가 될 때까지
    • 상한선과 하한선의 중간 값 mid를 도출 (mid = (hi + low) / 2)
    • 도출한 mid 값을 gas로 DoCall 실행 (질문자 분의 상황에서는 내부적으로 컨트랙트 함수를 실행)
      • DoCall이 실패했다면 low 값을 mid로 설정하고 위 로직을 다시 진행.
      • DoCall이 성공했다면 hi 값을 mid로 설정하고 위 로직을 다시 진행.
  • 최종적으로 조정된 hi 값이 Binary search 이전과 동일하다면, DoCall이 계속 실패한 케이스이므로 에러를 반환.

EstimateGas는 내부적으로 호출하는 DoCall이 성공하기 위한 최적의 가스 값을 찾아주는 과정으로 해당 콜에 소요되는 gas는 얼마정도가 적절할지 시뮬레이션 해보며 맞춰가는 과정입니다. (상태변경은 발생하지 않음.)

  1. 1번에 대한 내용은 컨트랙트 코드를 확인해봐야 알 수 있을 거 같습니다.
  2. 컨트랙트 코드에 따라서 실패할 수 있습니다. 예를 들어, owner만 실행시킬 수 있는 function인데 owner가 아닌 계정이 해당 컨트랙트 함수를 실행시키는 경우가 그 경우 중 하나에 속합니다.
  3. 질문자 분의 케이스는 이어서 나오는 문구인 “always failing transaction” 케이스에 속하는 거 같습니다. 노드에 설정하는 값 중 gasCap 이라는 설정값이 있습니다. 해당 gasCap보다 많은 양의 gas를 기입했을 경우에도 해당 에러메시지를 만날 수 있습니다. 이 때의 allowance는 요청하는 노드에 설정되어 있는 gas 상한선을 의미합니다.

cc. @Aidan

1 Like

안녕하세요
자세한 답변 감사합니다
컨트랙트 코드를 올리기 전에 궁금한점이 있어 질문 남깁니다!

3번 답변중에 말씀하신 내용이 EN 에서의 gas cap 설정이 있다는 말씀으로 이해되는데,
문서에서 해당 내용을 못찾아서, 해당 내용의 문서 또는 가이드 부탁드려요!

또 2번에 답변에 대해 추가적인 보충 설명을 하자면,
해당 케이스는 아니라고 생각되는 점 중 하나는 가스값이 충분하다면 해당 컨트랙트의 작동에는 문제가 없었습니다.

감사합니다

@zn1

gas cap 설정 관련해서는 klaytn/flags.go at 1cef10ac7a2dd958324f92ea5460926b92bd0df8 · klaytn/klaytn · GitHub 를 확인해보시면 좋을 거 같습니다.

그렇다면 기재하신 값이 너무 낮아서 발생하는 문제일 수도 있습니다.

[정정]
위에 설명드렸듯 질문자분께서 21,000 이상의 가스를 설정하셨다면 해당 값이 hi 로 설정되고 로직이 돌게 됩니다.

좀 더 상세한 컨텍스트를 공유해주시면 저도 자세히 살펴볼 수 있을 거 같습니다.
감사합니다.

민감한 내용이 포함되어 있을 수 있어 Solidity 코드를 DM 으로 보내드렸습니다
DM 확인 부탁드립니다
해당 내용은 rpc call flag 설정으로 이해됩니다
caver 에서 해당 값을 설정할 수 있나요??

@Denver 코드 공유 이후 혹시 업데이트 된 내용이 있을까요~?

@zn1

아직 업데이트 된 내용은 없습니다.
시간이 좀 소요될 거 같아요.

주말 중에 한 번 살펴보겠습니다 :slight_smile:

1 Like