Cell에 몇 개의 주소가 들어갈 수 있나요?
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_noneaddr_externaddr_stdaddr_var
다음 섹션에서는 TL‑B 정의에만 근거하여 각 생성자의 정확한 비트 크기를 계산합니다.
Address constructors size analysis
addr_none
- 생성자 태그
$00→ 2 비트
정확한 크기: 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 비트입니다.
이 정확한 값을 아는 것은 컴팩트한 저장 레이아웃을 설계하고, 가스 비용을 추정하며, 하나의 셀에 몇 개의 주소를 넣을 수 있는지 결정할 때 필수적입니다.