외부 메시지
외부 메시지는 TON 블록체인에 상주하는 스마트 컨트랙트에 '외부에서 전송'되어 특정 작업을 수행하도록 합니다.
예를 들어, 지갑 스마트 콘트랙트는 지갑 소유자가 서명한 주문이 포함된 외부 메시지(예: 지갑 스마트 콘트랙트에서 전송할 내부 메시지)를 수신할 것으로 예상합니다. 이러한 외부 메시지를 지갑 스마트 콘트랙트가 수신하면 먼저 서명을 확인한 다음, TVM 프리미티브 '수락'을 실행하여 메시지를 수락한 다음 필요한 작업을 수행합니다.
모든 외부 메시지는 리플레이 공격으로부터 '보호'되어야 한다는 점에 유의하세요. 일반적으로 검증자는 (네트워크에서 수신한) 제안된 외부 메시지 풀에서 외부 메시지를 제거하지만, 어떤 상황에서는 '다른 검증자'가 동일한 외부 메시지를 두 번 처리할 수 있습니다(따라서 동일한 외부 메시지에 대한 두 번째 트랜잭션을 생성하여 원래 작업이 중복될 수 있음). 더 나쁜 경우, '악의적인 행위자'가 처리 트랜잭션이 포함된 블록에서 외부 메시지를 추출하여 나중에 다시 전송할 수도 있습니다. 예를 들어 지갑 스마트 콘트랙트가 결제를 반복하도록 할 수 있습니다.
외부 메시지와 관련된 리플레이 공격으로부터 스마트 컨트랙트를 보호하는 가장 간단한 방법은 스마트 컨트랙트의 영구 데이터에 32비트 카운터 cur-seqno
를 저장하고 인바운드 외부 메시지에서 (서명된 부분의) req-seqno
값을 기대하는 것입니다. 그러면 서명이 유효하고 req-seqno
가 cur-seqno
와 같은 경우에만 외부 메시지가 수락됩니다. 처리에 성공하면 영구 데이터의 cur-seqno
값이 1 증가하므로 동일한 외부 메시지는 다시는 수락되지 않습니다.
일반적으로 외부 메시지는 256비트 서명(필요한 경우), 32비트 req-seqno
(필요한 경우), 32비트 expire-at
(필요한 경우), 32비트 op
및 op
에 따라 기타 필수 파라미터로 시작됩니다. 외부 메시지는 서로 다른 스마트 콘트랙트(다른 개발자가 작성하고 다른 소유자가 관리) 간의 상호작용에 사용되지 않기 때문에 외부 메시지 레이아웃은 내부 메시지만큼 표준화할 필요가 없습니다.