에러

Transaction exceeded the current CPU usage limit imposed on the transaction billed CPU time (1045 us) is greater than the maximum billable CPU time for the transaction (608 us)

error 2019-10-24T04:33:15.566 thread-0  http_plugin.cpp:649 handle_exception] 
FC Exception encountered while processing chain.push_transaction 
debug 2019-10-24T04:33:15.566 thread-0  http_plugin.cpp:650 handle_exception]  
Exception Details: 3080004 tx_cpu_usage_exceeded: Transaction exceeded the current CPU usage limit imposed on the transaction billed CPU time (1045 us) is greater than the maximum billable CPU time for the transaction (608 us) 
{"billed":1045,"billable":608} 
thread-0  transaction_context.cpp:519 validate_cpu_usage_to_bill

[ 에러 화면 ]

 

 

환경

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

Blockchain : EOS

 

 

상황

현재, EOS 블록체인 내에 사용자A 계정이 사용가능한 cpu 시간은 (available) 136 us이고, network 대역폭은 (available) 23.36 MiB이다. (아래 사진을 참고) 이때, 사용자A가 어떤 컨트랙트(contracT)의 특정 액션(action)을 수행하려고할 때 위와 같은 에러가 발생했다. 참고로 수행하려는 액션은 토큰 컨트랙트를 사용해서 사용자A 계정의 토큰 일부를 사용자B 계정에게 옮기려고 시도한 것이며, 이때, 에러가 발생했으며 옮기려고 시도한 토큰은 전달되지 않았다.


※ 참고, 아래 사진에서 사용자 A 계정의 리소스(cpu, net)는 직접 스테이킹(stacking)한 것이 아닌 작성자가 보유하고 있는 타 계정으로부터 위임(delegate)받아서 만들어진 것이기 때문에, 리소스가 staked가 아닌 delegated에 출력되고 있는 것이다. 만약 직접 리소스를 위해 스테이킹을 했다면 delegate 외에 stake라는 필드가 하나 더 출력될 것이다.

 

[ 사용자 A 계정의 리소스 상태 ]

 

 

원인

사용자 A 계정이 현재 시도하려고 하는 액션이 필요한 cpu는 1045 us이다. 그런데, 사용자 A 계정이 사용가능한 cpu는 136 us이다. 사용자 A 계정이 사용할 수 있는 크기 이상의 액션을 실행하려고 시도했기 때문에 발생한 것이다.

 

 

해결

해결하기 위한 방법은 여러가지가 있을 수 있다. 아래 3가지 방법을 제시했지만, 상황에 따라 소개하지 않은 다른 방법으로 해결할 수도 있다. 현재 테스트 중인 환경이기 때문에 아래의 [방법2]처럼 스테이킹을 추가해서 위 에러가 나오지 않도록 하였다.

 

방법1. 

cpu 시간은 다시 되돌아오기 때문에 일정시간이 지난 후, 사용할 수 있는 cpu가 줄어들면 트랜잭션을 재시도한다.

 

방법2. 

cpu를 추가로 스테이킹(stacking)해서, 사용할 수 있는 cpu양을 늘린다.

 

방법3. 

사용할 수 있는 cpu 보다 낮은 트랜잭션을 만들어서 재시도한다.

 

 

참고

(Stack Overflow) 원인
https://github.com/EOSIO/eos/issues/6347
(Stack Overflow) 해결방법
https://eosio.stackexchange.com/questions/1609/how-to-increase-billable-cpu-time