본문으로 건너뛰기

외부 메시지

외부 메시지는 TON 블록체인에 상주하는 스마트 컨트랙트에 '외부에서 전송'되어 특정 작업을 수행하도록 합니다.

예를 들어, 지갑 스마트 콘트랙트는 지갑 소유자가 서명한 주문이 포함된 외부 메시지(예: 지갑 스마트 콘트랙트에서 전송할 내부 메시지)를 수신할 것으로 예상합니다. 이러한 외부 메시지를 지갑 스마트 콘트랙트가 수신하면 먼저 서명을 확인한 다음, TVM 프리미티브 '수락'을 실행하여 메시지를 수락한 다음 필요한 작업을 수행합니다.

위험

모든 외부 메시지는 리플레이 공격으로부터 '보호'되어야 한다는 점에 유의하세요. 일반적으로 검증자는 (네트워크에서 수신한) 제안된 외부 메시지 풀에서 외부 메시지를 제거하지만, 어떤 상황에서는 '다른 검증자'가 동일한 외부 메시지를 두 번 처리할 수 있습니다(따라서 동일한 외부 메시지에 대한 두 번째 트랜잭션을 생성하여 원래 작업이 중복될 수 있음). 더 나쁜 경우, '악의적인 행위자'가 처리 트랜잭션이 포함된 블록에서 외부 메시지를 추출하여 나중에 다시 전송할 수도 있습니다. 예를 들어 지갑 스마트 콘트랙트가 결제를 반복하도록 할 수 있습니다.

외부 메시지와 관련된 리플레이 공격으로부터 스마트 컨트랙트를 보호하는 가장 간단한 방법은 스마트 컨트랙트의 영구 데이터에 32비트 카운터 cur-seqno를 저장하고 인바운드 외부 메시지에서 (서명된 부분의) req-seqno 값을 기대하는 것입니다. 그러면 서명이 유효하고 req-seqnocur-seqno와 같은 경우에만 외부 메시지가 수락됩니다. 처리에 성공하면 영구 데이터의 cur-seqno 값이 1 증가하므로 동일한 외부 메시지는 다시는 수락되지 않습니다.

또한 외부 메시지에 `expire-at` 필드를 포함하고, 현재 유닉스 시간이 이 필드 값보다 작은 경우에만 외부 메시지를 수락할 수도 있습니다. 이 접근 방식은 `seqno`와 함께 사용할 수 있으며, 또는 수신 스마트 콘트랙트는 최근 수락된 모든 (만료되지 않은) 외부 메시지 집합(해시)을 영구 데이터에 저장하고 저장된 메시지 중 하나와 중복되는 경우 새 외부 메시지를 거부할 수 있습니다. 이 세트에서 만료된 메시지의 일부 가비지 수집도 수행하여 퍼시스턴트 데이터의 부풀림을 방지해야 합니다.
노트

일반적으로 외부 메시지는 256비트 서명(필요한 경우), 32비트 req-seqno(필요한 경우), 32비트 expire-at(필요한 경우), 32비트 opop에 따라 기타 필수 파라미터로 시작됩니다. 외부 메시지는 서로 다른 스마트 콘트랙트(다른 개발자가 작성하고 다른 소유자가 관리) 간의 상호작용에 사용되지 않기 때문에 외부 메시지 레이아웃은 내부 메시지만큼 표준화할 필요가 없습니다.