본문으로 건너뛰기

TL

TL(타입 언어)은 데이터 구조를 설명하는 언어입니다.

통신 시 유용한 데이터를 구조화하기 위해 TL 스키마가 사용됩니다.

TL은 32비트 블록에서 작동합니다. 따라서 TL의 데이터 크기는 4바이트의 배수여야 합니다. 객체의 크기가 4의 배수가 아닌 경우 필요한 수의 0 바이트를 배수까지 더해야 합니다.

숫자는 항상 리틀 엔디안 순서로 인코딩됩니다.

TL에 대한 자세한 내용은 텔레그램 문서에서 확인하실 수 있습니다.

인코딩 바이트 배열

바이트 배열을 인코딩하려면 먼저 그 크기를 결정해야 합니다. 크기가 254바이트 미만이면 1바이트를 크기로 하는 인코딩이 사용됩니다. 그 이상이면 0xFE가 큰 배열의 표시로 첫 번째 바이트로 쓰여지고 그 뒤에 3바이트의 크기가 이어집니다.

예를 들어 [0xAA, 0xBB] 배열을 인코딩하고 그 크기는 2입니다. 1바이트 크기를 사용한 다음 데이터 자체를 쓰면 [0x02, 0xAA, 0xBB]가 되고 완료되지만 최종 크기가 4바이트의 배수가 아닌 3이라는 것을 확인하므로 1바이트의 패딩을 추가하여 4가 되도록 해야 합니다. 결과: [0x02, 0xAA, 0xBB, 0x00].

예를 들어 크기가 396인 배열( )을 인코딩해야 하는 경우 이렇게 합니다: 396 >= 254이므로 크기 인코딩에 3바이트와 1바이트 초과 크기 표시기를 사용하여 을 얻습니다: [0xFE, 0x8C, 0x01, 0x00, 배열 바이트], 396+4 = 400으로, 4의 배수이므로 정렬할 필요가 없습니다.

명확하지 않은 직렬화 규칙

스키마 자체 앞에 4바이트 접두사, 즉 ID가 쓰이는 경우가 많습니다. 스키마 ID는 스키마 텍스트에서 ; 및 대괄호 ()와 같은 기호는 이전에 텍스트에서 제거된 반면, IEEEE 테이블이 있는 CRC32입니다. ID 접두사가 있는 스키마의 직렬화를 boxed라고 하며, 이를 통해 구문 분석기는 여러 옵션이 있는 경우 앞에 오는 스키마를 결정할 수 있습니다.

박스형으로 직렬화할지 여부를 결정하는 방법은 무엇인가요? 스키마가 다른 스키마의 일부인 경우 필드 유형이 명시적으로 지정된 경우 접두사 없이 직렬화하고, 명시적으로 지정되지 않은 경우(이러한 유형이 많이 있음) 박스형으로 직렬화해야 합니다. 예시:

pub.unenc data:bytes = PublicKey;
pub.ed25519 key:int256 = PublicKey;
pub.aes key:int256 = PublicKey;
pub.overlay name:bytes = PublicKey;

이러한 유형은 스키마에 'PublicKey'가 명시적으로 지정되지 않은 경우, 예를 들어 adnl.node id:PublicKey addr_list:adnl.addressList = adnl.Node와 같이 명시적으로 지정되어 있지 않고 ID 접두사(박스형)로 직렬화해야 하는 경우입니다. 그리고 다음과 같이 지정한 경우 adnl.node id:pub.ed25519 addr_list:adnl.addressList = adnl.Node와 같이 지정하면 명시적이므로 접두사가 필요하지 않습니다.

참조

여기 Oleg Baranov원본 기사 링크가 있습니다.