본문 바로가기
프로그래밍/solidity

[220526] 스마트 컨트랙트 배포 에러 이슈 / 해결, RPC, 가스한도 초과

by 한코코 2022. 5. 18.

1.   이슈 발생

어제 잘만 실행되던 프로그램에 이슈가 터졌다.

배포를 하려고하면 다음 메세지가 뜬다.

다음 메시지와 함께 가스 추정 오류가 발생했습니다(아래 참조).
트랜잭션 실행이 실패할 가능성이 있습니다. 강제로 보내시겠습니까?
가스에서 계약 생성 코드 저장

 

뭔소리여.. 어제 저장하고 방금 막 켰구만.

어제까지만해도 잘만 거래해주던 메타마스크가 에러를 띄웠다.

Send Transaction을 클릭하면 다음과 같은 에러를 리믹스에 띄워준다.

creation of MintAnimalToken pending...

creation of MintAnimalToken errored:
[ethjs-query] while formatting outputs from RPC
'{"value":{"code":-32000,"message":"exceeds block gas limit"}}'


MintAnimalToken 생성 보류 중...
MintAnimalToken 생성 오류: [ethjs-query] RPC
'{"value":{"code":-32000,"message":"차단 가스 한도 초과"}}'의 출력 형식 지정 중

 

 

 

 

 

 

2.   이슈 분석

2-1.    RPC가 뭔데

원격 프로시저 호출(영어: remote procedure call, 리모트 프로시저 콜, RPC)

별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 함수나 프로시저를 실행할 수 있게하는 프로세스 간 통신 기술이다. 다시 말해, 원격 프로시저 호출을 이용하면 프로그래머는 함수가 실행 프로그램에 로컬 위치에 있든 원격 위치에 있든 동일한 코드를 이용할 수 있다.

일반적으로는 프로세스는 자신의 주소공간 안에 존재하는 함수만 호출하여 실행 가능하다. 하지만, RPC를 이용하면 다른 주소공간에서 동작하는 프로세스의 함수를 실행할 수 있게 된다. 위에도 언급했듯, 분산 컴퓨팅 환경에서 프로세스 간 상호 통신 및 컴퓨팅 자원의 효율적인 사용을 위해서 발전된 기술이다

( 참고 사이트 : https://velog.io/@jakeseo_me/RPC%EB%9E%80 )

 

 

2-2.   차단 가스 한도 초과라니.

테스트용 이더는 4ETH를 보유 중이고 가스비는 끽해봐야 0.007정도인데 모자랄 수가 없다.

해당 키워드로 검색하던 중에 다음 결과를 발견해서 내 gas limit을 찾아봄.

( 참고 사이트 :  https://ethereum.stackexchange.com/questions/1832/cant-send-transaction-exceeds-block-gas-limit-or-intrinsic-gas-too-low )

21,000 가스는 거래를 보내기 위한 최소 금액입니다.
폴백 기능이 있는 계약에 이더를 보내는 경우 해당 기능을 실행하려면 추가 가스가 필요합니다.
사용하지 않은 가스는 자동으로 환불되므로 가스 값이 더 높은 다음과 같이 코드를 변경하십시오.

eth.sendTransaction(
    {	
        from:eth.accounts[0], to:'0x[ADDRESS_HERE]',
        value: web3.toWei(5, "ether"), gas:100000}
    );

많으면 많았지 절대 부족하지는 않은 양임.

 

 

2-3.   브라우저 에러메세지

혹시나 싶어서 실행한 브라우저에 뜬 에러메세지를 체크해봤다

MetaMask - RPC Error:
TxGasUtil - Trying to call a function on a non-contract address
{code: -32603,
message: 'TxGasUtil - Trying to call a function on a non-contract address',
data: {…}}

Error: TxGasUtil - Trying to call a function on a non-contract address
{
  "originalError": {
    "errorKey": "transactionErrorNoContract",
    "getCodeResponse": "0x"
  }
}

메타마스크 - RPC 오류:
TxGasUtil - 비계약 주소에서 함수 호출 시도
{코드: -32603, 메시지: 'TxGasUtil - 비계약 주소에 대한 함수 호출 시도', 데이터: {…}}

오류: TxGasUtil - 비계약 주소에서 함수 호출 시도
   "원본 오류": {
     "에러키": "거래 오류 계약 없음",
     "코드 응답 받기": "0x"

어제 이미 아무런 문제없이 돌아가는 코드인걸 몇십번 확인했기때문에 비계약 주소라는게 말이 안되므로 패스.

 

 

 

 

 

 

 

3.   이슈 파악 완료

뭐가 문젠데.... 하다가 교수님이 에러를 찾아주심.

미쳤다 교수님 검색능력 최고시다.

 

Ropsten 네트워크의 가스 한도 문제

Ropsten 네트워크가 최근 거래하는 가스량을 40K로 줄였다는 소식을 들었다.

나는 이미 몇십번의 거래로 한도량을 초과해버렸기때문에 더이상 거래가 안 되는 것이었다.

즉, 위에서 띄운 가스 한도 초과가 내가 가진 가스량이 아니라 누적된 사용량이었던것.

( 참고 사이트 : https://ethereum.stackexchange.com/questions/89758/ropsten-exceeds-block-gas-limit )

 

 

 

 

 

 

4.   해결책

GANECHE 네트워크를 사용하기로 했다.

한도도 ropsten보다 사용방법도 쉽다고 교수님이 추천해주심.

설치방법도 상당히 쉽고, 로컬에서 돌리는거라 한도도 걱정하지 않아도 되고, 기존에 사용하던 리믹스 이더리움과도 연계가 가능하다.

댓글