Cell에 몇 개의 주소가 들어갈 수 있나요?

발행: (2026년 1월 17일 오전 03:15 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

Introduction

스마트 컨트랙트를 개발하면서 여러 주소를 영구 저장소에 저장해야 했습니다.
TON 저장소는 비트와 셀 단위로 측정되며, 저장 및 메시지‑전송 모두 가스 비용을 발생시키기 때문에, 하나의 셀에 정확히 몇 개의 주소를 넣을 수 있는지 아는 것이 중요합니다. 이를 답하기 위해서는 주소가 TL‑B 레벨에서 어떻게 정의되고 직렬화되는지를 살펴봐야 합니다.

TL‑B address definitions

addr_none$00 = MsgAddressExt;

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

anycast_info$_ depth:(#= 1 }
    rewrite_pfx:(bits depth) = Anycast;

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;

_ _:MsgAddressInt = MsgAddress;
_ _:MsgAddressExt = MsgAddress;

주소 생성자는 정확히 네 가지가 있습니다:

  • addr_none
  • addr_extern
  • addr_std
  • addr_var

다음 섹션에서는 TL‑B 정의에만 근거하여 각 생성자의 정확한 비트 크기를 계산합니다.

Address constructors size analysis

addr_none

  • 생성자 태그 $002 비트

정확한 크기: 2 비트.

addr_extern

  • 생성자 태그 $01 → 2 비트
  • len:(## 9) → 9 비트 (길이 필드)
  • external_address:(bits len)len 비트, 여기서 len ∈ [0, 511]

정확한 크기 공식: 2 + 9 + len = 11 + len 비트

  • 최소 크기 (len = 0): 11 비트
  • 최대 크기 (len = 511): 522 비트

addr_std

  • 생성자 태그 $10 → 2 비트
  • anycast:(Maybe Anycast) → 존재 플래그 1 비트
    • 존재할 경우: depth:(#<=30) → 5 비트, rewrite_pfx:(bits depth)depth 비트 (depth ∈ [1, 30])
  • workchain_id:int8 → 8 비트
  • address:bits256 → 256 비트

정확한 크기 공식:

2 + 1 + (anycast ? (5 + depth) : 0) + 8 + 256
  • anycast가 없을 때 (존재 = 0): 267 비트
  • anycast가 있고 최대 depth = 30인 경우: 302 비트

addr_var

  • 생성자 태그 $11 → 2 비트
  • anycast:(Maybe Anycast) → 존재 플래그 1 비트
    • 존재할 경우: depth:(#<=30) → 5 비트, rewrite_pfx:(bits depth)depth 비트
  • addr_len:(## 9) → 9 비트 (주소 필드 길이)
  • workchain_id:int32 → 32 비트
  • address:(bits addr_len)addr_len 비트, 여기서 addr_len ∈ [0, 511]

정확한 크기 공식:

2 + 1 + (anycast ? (5 + depth) : 0) + 9 + 32 + addr_len
  • anycast가 없고 최대 주소 길이 (addr_len = 511)인 경우: 555 비트
  • anycast가 있고 최대 depth = 30 및 최대 주소 길이인 경우: 590 비트

Practical considerations (TVM ≥ 10)

  • TVM 버전 10부터 anycast 주소는 메시지 목적지, 계정 주소로 사용할 수 없으며, 주소‑파싱 및 rewrite 명령에서도 지원되지 않습니다. 따라서 Maybe Anycast 플래그는 항상 0이며, anycast 페이로드는 절대 나타나지 않습니다.
  • addr_var는 향후 확장을 위해 정의되어 있지만 현재 실제 컨트랙트에서는 사용되지 않습니다.
  • 현재 활성화된 워크체인(마스터체인 및 베이스체인)은 addr_std를 사용하며:
    • 256‑비트 계정 ID
    • 작은 워크체인 ID

Real‑world address size on mainnet

  • Anycast는 사용되지 않음.
  • addr_var는 사용되지 않음.
  • 모든 내부 주소는 addr_std임.

따라서 실제 내부 주소 크기는 고정적으로 267 비트입니다.

이 정확한 값을 아는 것은 컴팩트한 저장 레이아웃을 설계하고, 가스 비용을 추정하며, 하나의 셀에 몇 개의 주소를 넣을 수 있는지 결정할 때 필수적입니다.

Back to Blog

관련 글

더 보기 »

Solana Devnet: 알아야 할 모든 것

소개 솔라나에서 빌드하시겠습니까? Devnet이 필요합니다 – 실제 돈을 위험에 빠뜨리지 않고 테스트하고, 실험하고, 배울 수 있는 무료 샌드박스입니다. Devnet이란? De...