본문으로 건너뛰기

메시지 효과 수락

'accept_message` 및 'set_gas_limit'은 stdlib 참조에서 설명하는 대로 정확하게 실행하면 간단하지 않은 결과를 초래할 수 있습니다.

외부 메시지

외부 메시지는 다음과 같이 처리됩니다:

  • 가스 제한가스 크레딧`(구성 매개변수 20 및 구성 매개변수 21)으로 설정되어 있으며, 이는 10k 가스와 동일합니다.
  • 이러한 크레딧을 사용하는 동안 컨트랙트는 메시지 처리에 대한 수수료를 지불할 준비가 되었음을 나타내는 accept_messageset_gas_limit으로 호출해야 합니다.
  • 가스 크레딧에 도달하거나 계산이 완료되고 수락 메시지`가 호출되지 않으면 메시지는 완전히 폐기됩니다(마치 처음부터 없었던 것처럼).
  • 그렇지 않으면 '계약 잔액/가스 가격'(수락 메시지의 경우) 또는 사용자 지정 숫자(설정 가스 한도의 경우)와 같은 새로운 가스 한도가 설정되며, 거래가 종료되면 계약 잔액에서 전체 계산 수수료가 공제됩니다(이러한 방식으로 가스 크레딧은 실제로 무료 가스가 아닌 크레딧이 됩니다).

'accept_message' 이후 ComputePhase 또는 ActionPhase에서 오류가 발생하면 트랜잭션이 블록체인에 기록되고, 트랜잭션 잔액에서 수수료가 공제됩니다. 그러나 오류 종료 코드가 있는 트랜잭션의 경우와 마찬가지로 스토리지는 업데이트되지 않으며 작업도 적용되지 않습니다.

결과적으로 컨트랙트가 외부 메시지를 수락한 후 메시지 데이터의 오류 또는 잘못 직렬화된 메시지 전송으로 인해 예외가 발생하면 처리 비용은 지불하지만 메시지 재생을 방지할 방법이 없습니다. **동일한 메시지가 전체 잔액을 소진할 때까지 컨트랙트에 의해 계속 수락됩니다.

내부 메시지

기본적으로 컨트랙트가 내부 메시지를 수신하면 가스 한도는 message_balance/gas_price로 설정됩니다. 즉, 메시지는 처리 비용을 지불합니다. 'accept_message/set_gas_limit`을 사용하면 컨트랙트가 실행 중에 가스 한도를 변경할 수 있습니다.

가스 한도의 수동 설정은 반송 동작을 방해하지 않으며, 반송 가능 모드로 전송되고 처리 및 반송 메시지 생성 비용을 지불하기에 충분한 금액이 포함된 경우 메시지가 반송된다는 점에 유의하세요.

예제

같은 예에서 계산 비용이 0.005가 아닌 0.5이면 반송이 발생하지 않으며(메시지 잔액은 0.1 - 0.5 - 0.001 = -0.401이므로 반송이 없음), 컨트랙트 잔액은 1 + 0.1 - 0.5 = 0.6 톤이 됩니다.