본문으로 건너뛰기

메시지 TL-B 체계

이 섹션에서는 메시지에 대한 TL-B 체계에 대해 자세히 설명합니다.

메시지 TL-B

TL-B

여러 중첩 구조의 조합으로 선언된 주요 메시지 TL-B 체계

message$_ {X:Type} info:CommonMsgInfo
init:(Maybe (Either StateInit ^StateInit))
body:(Either X ^X) = Message X;

message$_ {X:Type} info:CommonMsgInfoRelaxed
init:(Maybe (Either StateInit ^StateInit))
body:(Either X ^X) = MessageRelaxed X;

_ (Message Any) = MessageAny;

여기서 메시지 X는 일반적인 메시지 구조, 메시지 릴랙스드 X는 CommonMsgInfoRelaxed 본문이 있는 추가 유형, 메시지 애니는 이 둘의 합체입니다. X:Type으로 통합된 메시지 구조, 즉 셀입니다. TL-B에 따르면 모든 데이터를 하나의 셀에 결합하거나(1023비트에 맞을 경우) 캐럿 ^로 선언된 참조를 사용할 수 있습니다.

스마트 컨트랙트가 이 액션과 메시지 전송을 실행하는 것보다 FunC 메서드 send_raw_message()를 사용하여 액션 목록에 직렬화된 메시지 X를 배치합니다.

명시적 직렬화의 정의

TL-B 구조에 따라 유효한 바이너리 데이터를 구축하려면 각 유형에 대해 반복적으로 정의된 직렬화를 수행해야 합니다. 즉, 메시지 X를 직렬화하려면 StateInit, CommonMsgInfo 등을 직렬화하는 방법을 알아야 합니다.

최상위 구조에 대한 직렬화가 명시적일 때까지 링크에 따라 다른 TL-B 체계에서 가져와야 하는 모든 중첩 구조는 부울 또는 비트 유사 유형(비트, uint, varuint)으로 정의된 모든 비트를 명시적으로 가져와야 합니다.

현재 일반 개발에서 사용하지 않는 구조는 유형 열에 *로 표시합니다(예: *애니캐스트는 일반적으로 직렬화에서 생략됨).

메시지$_

최상위 TL-B 체계 전체 메시지 '메시지 X'가 있습니다:

message$_ {X:Type} info:CommonMsgInfo
init:(Maybe (Either StateInit ^StateInit))
body:(Either X ^X) = Message X;
구조유형필수설명
메시지$_생성자생성자 눈금자에 따라 정의됩니다. 빈 태그 $_는 처음에 비트를 추가하지 않음을 의미합니다.
정보공통메시지정보필수상세 메시지 속성은 대상과 해당 값을 정의합니다. 항상 메시지 루트 셀에 배치됩니다.
initStateInit선택 사항새 계약을 초기화하기 위해 톤에서 사용하는 일반적인 구조입니다. 셀 참조 또는 루트 셀에 쓸 수 있습니다.
bodyX필수메시지 페이로드. 셀 참조 또는 루트 셀에 쓸 수 있습니다.
nothing$0 {X:Type} = Maybe X;
just$1 {X:Type} value:X = Maybe X;
left$0 {X:Type} {Y:Type} value:X = Either X Y;
right$1 {X:Type} {Y:Type} value:Y = Either X Y;

어쩌면둘 중 하나`가 어떻게 작동하는지 기억해 두면 다양한 경우를 직렬화할 수 있습니다:

  • '[CommonMsgInfo][10][StateInit][0][X]- 하나의 셀에메시지 X`를 입력합니다.


  • '[CommonMsgInfo][11]StateInit[1][^X]-메시지 X` 참조 포함


CommonMsgInfo TL-B

공통메시지정보

공통메시지정보`는 TON 블록체인에서 메시지가 전달되는 방식을 정의하는 매개변수 목록입니다.

//internal message
int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool
src:MsgAddressInt dest:MsgAddressInt
value:CurrencyCollection ihr_fee:Grams fwd_fee:Grams
created_lt:uint64 created_at:uint32 = CommonMsgInfo;

//external incoming message
ext_in_msg_info$10 src:MsgAddressExt dest:MsgAddressInt
import_fee:Grams = CommonMsgInfo;

//external outgoing message
ext_out_msg_info$11 src:MsgAddressInt dest:MsgAddressExt
created_lt:uint64 created_at:uint32 = CommonMsgInfo;

int_msg_info$0

int_msg_info`는 내부 메시지의 경우입니다. 즉, 컨트랙트 간에, 그리고 컨트랙트 간에만 전송할 수 있습니다. 사용 사례 - 일반적인 교차 컨트랙트 메시지.

nanograms$_ amount:(VarUInteger 16) = Grams;
//internal message
int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool
src:MsgAddressInt dest:MsgAddressInt
value:CurrencyCollection ihr_fee:Grams fwd_fee:Grams
created_lt:uint64 created_at:uint32 = CommonMsgInfo;
구조유형필수설명
int_msg_info$0생성자필수0 태그는 직렬화에서 0비트로 시작하는 CommonMsgInfo가 내부 메시지를 설명한다는 의미입니다.
ihr_disabledBool필수하이퍼 큐브 라우팅 플래그.
bounceBool필수처리 중 오류가 있는 경우 메시지를 반송해야 합니다. 메시지가 플랫 반송 = 1이면 반송 가능이라고 합니다.
바운스Bool필수플래그는 해당 메시지 자체가 반송의 결과임을 설명합니다.
srcMsgAddressInt필수메시지를 보낸 스마트 컨트랙트 발신자의 주소입니다.
destMsgAddressInt필수메시지의 스마트 컨트랙트 대상 주소입니다.
[통화 컬렉션](#통화 컬렉션)필수메시지에서 이체된 총 금액을 포함한 통화 정보를 설명하는 구조입니다.
ihr_feeVarUInteger 16필수하이퍼 라우팅 배송 수수료
fwd_feeVarUInteger 16필수유효성 검사자가 지정한 메시지 전달에 대한 수수료
created_ltuint64필수검증자가 지정한 메시지 전송 논리 시간입니다. 스마트 컨트랙트에서 오더링 작업에 사용합니다.
created_atuint32필수유닉스 시간

EXT_IN_MSG_INFO$10

'EXT_IN_MSG_INFO$10'은 외부에서 들어오는 메시지의 경우입니다. 이는 컨트랙트에서 오프체인 공간으로 전송되는 메시지 유형을 의미합니다.\ 사용 사례 - 지갑 컨트랙트에 대한 지갑 애플리케이션 요청.

nanograms$_ amount:(VarUInteger 16) = Grams;
//external incoming message
ext_in_msg_info$10 src:MsgAddressExt dest:MsgAddressInt
import_fee:Grams = CommonMsgInfo;
구조유형필수설명
EXT_OUT_MSG_INFO$10생성자필수10태그는 직렬화에서10` 비트로 시작하는 CommonMsgInfo가 외부 수신 메시지를 설명한다는 의미입니다.
ihr_disabledBool필수하이퍼 라우팅 플래그. (현재 항상 true)
srcMsgAddressExt필수메시지를 보낸 외부 발신자의 주소입니다.
destMsgAddressInt필수메시지의 스마트 컨트랙트 대상 주소입니다.
import_feeVarUInteger 16필수메시지 실행 및 전달에 대한 수수료입니다.

EXT_OUT_MSG_INFO$11

'EXT_OUT_MSG_INFO$11'은 외부 발신 메시지의 경우입니다. 이는 컨트랙트에서 오프체인 공간으로 전송될 수 있음을 의미합니다. 사용 사례 - 로그.

//internal message
ext_out_msg_info$11 src:MsgAddressInt dest:MsgAddressExt
created_lt:uint64 created_at:uint32 = CommonMsgInfo;
구조유형필수설명
EXT_OUT_MSG_INFO$11생성자필수11태그는 직렬화에서11` 비트로 시작하는 CommonMsgInfo가 외부 발신 메시지를 설명한다는 의미입니다.
srcMsgAddressInt필수하이퍼 라우팅 플래그.
destMsgAddressExt필수새 컨트랙트를 초기화하기 위해 톤에서 사용하는 일반적인 구조입니다. 셀 참조 또는 루트 셀에 쓸 수 있습니다.
created_ltuint64필수검증자가 지정한 메시지 전송 논리 시간입니다. 스마트 컨트랙트에서 오더링 작업에 사용합니다.
created_atuint32필수유닉스 시간

StateInit TL-B

StateInit은 초기 데이터를 계약에 전달하고 계약 배포에 사용하는 역할을 합니다.

_ split_depth:(Maybe (## 5)) special:(Maybe TickTock)
code:(Maybe ^Cell) data:(Maybe ^Cell)
library:(HashmapE 256 SimpleLib) = StateInit;
구조유형필수설명
분할_뎁스(## 5)선택 사항고부하 컨트랙트에 대한 매개변수로, 다른 샤드에서 여러 인스턴스로 분할하는 동작을 정의합니다. 현재 StateInit은 이 매개변수 없이 사용됩니다.
특별TickTock*선택 사항블록체인의 모든 새 블록에서 스마트 컨트랙트를 호출하는 데 사용됩니다. 마스터체인에서만 사용할 수 있습니다. 일반 사용자의 컨트랙트는 이 없이 사용됩니다.
코드선택 사항계약의 직렬화된 코드.
데이터선택 사항계약 초기 데이터.
라이브러리해시맵E 256 SimpleLib*선택 사항라이브러리 없이 현재 사용되는 StateInit

[해시맵에 대한 일반적인 상세 설명](../데이터 형식/tl-b#해시맵)

MsgAddressExt TL-B

addr_none$00 = MsgAddressExt;
addr_extern$01 len:(## 9) external_address:(bits len)
= MsgAddressExt;

MsgAddress`는 주소에 대한 다양한 직렬화 체계입니다. 어떤 참여자(오프체인 또는 스마트 컨트랙트)가 메시지를 전송하느냐에 따라 다른 구조를 사용합니다.

addr_none$00

addr_none$00 - 오프체인 참가자의 널 주소를 정의할 때 사용합니다. 즉, 발신자의 고유 주소 없이 컨트랙트에 외부 메시지를 보낼 수 있습니다.

addr_none$00 = MsgAddressExt;
구조유형필수설명
addr_none$00생성자필수00태그는 직렬화에서 MsgAddressExt가00비트로 시작한다는 의미입니다. 즉, 전체 외부 주소가00`이라는 뜻입니다.

addr_external$01

addr_extern$01 len:(## 9) external_address:(bits len)
= MsgAddressExt;
구조유형필수설명
addr_external$01생성자필수01태그는 직렬화에서01`로 시작하는 MsgAddressExt의 비트가 외부 주소를 설명한다는 의미입니다.
len## 9필수uintN과 동일 - 부호 없는 N비트 숫자를 의미합니다.
외부_주소(비트 길이)필수주소는 이전 len과 동일한 렌의 비트 문자열입니다.

MsgAddressInt TL-B

addr_std$10 anycast:(Maybe Anycast)
workchain_id:int8 address:bits256 = MsgAddressInt;

addr_var$11 anycast:(Maybe Anycast) addr_len:(## 9)
workchain_id:int32 address:(bits addr_len) = MsgAddressInt;

addr_std$10

addr_std$10 anycast:(Maybe Anycast)
workchain_id:int8 address:bits256 = MsgAddressInt;
구조유형필수설명
addr_std$10생성자필수10태그는 직렬화에서10`으로 시작하는 MsgAddressExt의 비트가 외부 주소를 설명한다는 의미입니다.
애니캐스트애니캐스트*선택 사항추가 주소 데이터, 현재 일반 내부 메시지에는 사용되지 않습니다.
워크체인_IDint8필수대상 주소의 스마트 컨트랙트가 위치한 워크체인. 현재는 항상 0과 같습니다.
주소(비트256)필수스마트 컨트랙트 계정 ID 번호

addr_var$11

addr_var$11 anycast:(Maybe Anycast) addr_len:(## 9)
workchain_id:int32 address:(bits addr_len) = MsgAddressInt;
구조유형필수설명
addr_var$11생성자필수11태그는$11`로 시작하는 MsgAddressInt 직렬화에서 내부 컨트랙트 주소를 설명하는 비트임을 의미합니다.
애니캐스트애니캐스트*선택 사항추가 주소 데이터, 현재 일반 내부 메시지에는 사용되지 않습니다.
addr_len## 9필수uintN과 동일 - 부호 없는 N비트 숫자를 의미합니다.
워크체인_IDint32필수대상 주소의 스마트 컨트랙트가 위치한 워크체인. 현재는 항상 0과 같습니다.
주소(비트256)필수페이로드 주소(계정 ID일 수 있음)

기본 사용 유형

통화 컬렉션

nanograms$_ amount:(VarUInteger 16) = Grams;
currencies$_ grams:Grams other:ExtraCurrencyCollection
= CurrencyCollection;
구조유형필수설명
통화$_생성자필수$_` 빈 태그는 직렬화 CurrencyCollection에서 처음에 비트를 추가하지 않음을 의미합니다.
그램(VarUInteger 16)필수나노톤 단위의 메시지 값
기타추가 통화 컬렉션선택 사항추가 통화 컬렉션은 일반적으로 비어 있는 추가 통화용으로 설계된 딕셔너리입니다.
  • 일반적으로 메시지에서 빈 딕셔너리로 작성되는 ExtraCurrencyCollection 복합 유형입니다.

VarUInteger n

var_uint$_ {n:#} len:(#< n) value:(uint (len * 8))
= VarUInteger n;
var_int$_ {n:#} len:(#< n) value:(int (len * 8))
= VarInteger n;
구조유형필수설명
varuint$생성자필수var_uint$_ 빈 태그는 직렬화 CurrencyCollection에서 처음에 비트를 추가하지 않음을 의미합니다.
lenuintN필수다음 값에 대한 비트 LEN 매개변수
(UINT (LEN * 8))선택 사항(len * 8) 비트로 쓰여진 정수에 대한 uint 값

메시지 예시

일반 함수 내부 메시지

  var msg = begin_cell()
.store_uint(0, 1) ;; tag
.store_uint(1, 1) ;; ihr_disabled
.store_uint(1, 1) ;; allow bounces
.store_uint(0, 1) ;; not bounced itself
.store_slice(source)
.store_slice(destination)
;; serialize CurrencyCollection (see below)
.store_coins(amount)
.store_dict(extra_currencies)
.store_coins(0) ;; ihr_fee
.store_coins(fwd_value) ;; fwd_fee
.store_uint(cur_lt(), 64) ;; lt of transaction
.store_uint(now(), 32) ;; unixtime of transaction
.store_uint(0, 1) ;; no init-field flag (Maybe)
.store_uint(0, 1) ;; inplace message body flag (Either)
.store_slice(msg_body)
.end_cell();

짧은 형식의 일반 기능 메시지

유효성 검사기에 의해 항상 덮어쓰는 메시지 부분은 건너뛸 수 있습니다(0비트로 채움). 여기서 메시지의 발신자도 건너뛰고 addr_none$00으로 직렬화됩니다.

  cell msg = begin_cell()
.store_uint(0x18, 6)
.store_slice(addr)
.store_coins(amount)
.store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
.store_slice(message_body)
.end_cell();