에러

Error 3080006: Transaction took too long

Error Details :

deadline exceeded

 

[ 에러 화면 ]

 

 

환경

OS : macOS Mojave

IDE : EOS Studio v0.11.0 (CDT v1.6.1 / Node : Local-Single Node)

Blockchain : EOS

 

 

상황

아래 cleos 명령을 사용해서 EOS 시스템 컨트랙트인 eosio.system 컨트랙트를 노드에 배포하려고 한다. 참고로, 아래 경로에는 컨트랙트를 빌드해서 .wasm 파일과 .abi 파일이 위치해있다. 이때 "Transaction took too long"이라는 에러 메시지가 출력되면서 트랜잭션 명령이 처리가 되지 않았다.

 

$ cleos set contract eosio /Users/joker/.eosio/contracts_build/eosio.system/

 

 

원인

EOS 노드는 트랜잭션을 처리하는데 필요한 최대(max) 시간을 설정해두고, 이 시간 내에 처리하도록 하고 있다. 그런데, 앞에서 실행시키려는 명령은 해당 시간 내에 처리할 수 없기 때문에 에러가 발생된 것이다. 현재, 위 에러는 "eosio.system" 컨트랙트를 배포할 때 발생했지만, 다른 어떤 특정 트랜잭션(transaction)을 실행할 때도 발생할 수 있는 에러라는 것을 알아두자.

 

 

해결

EOS 노드가 트랜잭션을 처리할 수 있는 시간을 충분히 가질 수 있도록 하면 된다. 아래 처럼 몇가지 방법이 있으며, 작성자의 경우 [solved 1] 방법을 사용해서 해결하였다.

 

[solved 1] config.ini 파일의 "--max-transaction-time" 내용을 수정해서 노드의 트랜잭션 처리시간을 늘린다. 참고로, 특별히 설정값을 변경하지 않았다면 가장 초기값은 30으로 되어 있다. 이 값을 조금 더 여유 있게 1000으로 수정한다.

--max-transaction-time=1000

 

[solved 2] 노드를 수정하지 않고, 트랜잭션을 실행시킬 때 -x 옵션을 사용해서 만료까지 걸리는 시간을 늘린다.

$ cleos set contract eosio /Users/joker/.eosio/contracts_build/eosio.system/ -x 1000

 

[solved 3] 시스템 계정인 eosio 계정으로 직접 실행시킨다. 

$ cleos set contract eosio /Users/joker/.eosio/contracts_build/eosio.system/ -p eosio

 

 

참고

Stack Overflow

https://github.com/EOSIO/eos/issues/3150

EOS Developer

https://developers.eos.io/eosio-cleos/reference#cleos-set-contract