하드포크 이후에 발생한 이슈인지는 확실하지는 않습니다.
현재 일부 컨트랙트에서 estimate gas 를 하는데 에러가 나고 있습니다.
(같은 estimate 호출 코드로 일부 컨트랙트는 estimate 가 되고, 일부는 안됩니다.)
오류에 대한 자세한 내용은 아래에 있습니다
아직 많은 분들이 못본거 같아 링크를 첨부합니다
estimate gas 에 어려움이 있어 여러가지를 테스트해보고 있는데, 아래에 정리된 질문을 남깁니다.
estimate gas 는 실제로 어떻게 작동하는지 궁금합니다. 실제 소모된 fee history 를 기반으로 측정하나요? 아니면 컨트랙트 코드를 기반으로 결정되나요? 컨트랙트 배포 후 첫 컨트랙트에서는 estimated 된 만큼 가스를 주면 out of gas 오류가 나고, 그 이후에는 괜찮았던 경험이 있어서 여쭙습니다.
estimate gas 가 컨트랙트의 코드에 따라서 실패할 수 있는 가능성이 있나요? 현재 일부 컨트랙트에서만 estimate gas 가 실패하고 있어서 여쭙습니다. 같은 estimate gas 호출 코드로 일부 컨트랙트에서는 오류가 나고, 일부 컨트랙트에서는 오류가 나지 않고 있기 때문에 컨트랙트 또는 배포과정 또는 설정 등에 오류가 있다고도 볼 수 있을까요? (컨트랙트의 작동에는 문제가 없습니다)
현재 겪고 있는 오류 메세지인 gas required exceeds allowance 의 정확한 의미가 궁금합니다. allowance 의 개념이 정확히 무엇을 의미하는지요?
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번에 대한 내용은 컨트랙트 코드를 확인해봐야 알 수 있을 거 같습니다.
컨트랙트 코드에 따라서 실패할 수 있습니다. 예를 들어, owner만 실행시킬 수 있는 function인데 owner가 아닌 계정이 해당 컨트랙트 함수를 실행시키는 경우가 그 경우 중 하나에 속합니다.
질문자 분의 케이스는 이어서 나오는 문구인 “always failing transaction” 케이스에 속하는 거 같습니다. 노드에 설정하는 값 중 gasCap 이라는 설정값이 있습니다. 해당 gasCap보다 많은 양의 gas를 기입했을 경우에도 해당 에러메시지를 만날 수 있습니다. 이 때의 allowance는 요청하는 노드에 설정되어 있는 gas 상한선을 의미합니다.