TVM 개요
모든 TON 스마트 컨트랙트는 자체 TON 가상 머신(TVM)에서 실행됩니다. TVM은 스택 원리를 기반으로 구축되어 효율적이고 쉽게 구현할 수 있습니다.
이 문서는 TVM이 트랜잭션을 실행하는 방법을 한눈에 볼 수 있도록 설명합니다.
- TVM 소스 - TVM C++ 구현 :::
TON 코스: TVM
톤 블록체인 코스](https://stepik.org/course/176754/)는 톤 블록체인 개발을 위한 종합 가이드입니다.
모듈 2는 TVM, 거래, 확장성 및 비즈니스 사례에 대해 자세히 다룹니다.
TON 블록체인 코스 확인
트랜잭션 및 단계
TON 체인 중 하나의 계정에서 어떤 이벤트가 발생하면 트랜잭션이 발생합니다. 가장 일반적인 이벤트는 "어떤 메시지의 도착"이지만 일반적으로 '틱톡', '병합', '분할' 및 기타 이벤트가 있을 수 있습니다.
각 트랜잭션은 최대 5단계로 구성됩니다:
- 보관 단계 - 이 단계에서는 체인 상태의 일부 공간 점유로 인해 계약에 의해 누적된 보관 수수료가 계산됩니다. 자세한 내용은 스토리지 수수료에서 확인하세요.
- 신용 단계 - 이 단계에서는 (가능한) 수신 메시지 값에 대한 계약 잔액과 징수된 보관 수수료가 계산됩니다.
- 계산 단계 - 이 단계에서는 TVM이 컨트랙트를 실행하며(아래 참조), 컨트랙트 실행 결과는
exit_code
,actions
(직렬화된 작업 목록),gas_details
,new_storage
및 기타 몇 가지의 집계입니다. - 액션 단계 - 계산 단계가 성공했다면, 이 단계에서는 계산 단계의 '액션'을 처리합니다. 특히 액션에는 메시지 전송, 스마트 컨트랙트 코드 업데이트, 라이브러리 업데이트 등이 포함될 수 있습니다. 일부 작업은 처리 중에 실패할 수 있으며(예를 들어, 컨트랙트가 가진 것보다 많은 TON으로 메시지를 보내려고 하는 경우), 이 경우 전체 트랜잭션이 되돌리거나 이 작업을 건너뛸 수 있습니다(작업 모드에 따라, 즉 컨트랙트가 '보내기 또는 되돌리기' 또는 '보내기 시도-없음 무시' 유형의 메시지를 보낼 수 있습니다).
- 바운스 단계 - 계산 단계가 실패한 경우(
exit_code >= 2
를 반환한 경우), 이 단계에서는 수신 메시지에 의해 시작된 트랜잭션에 대해 바운스 메시지가 형성됩니다.
계산 단계
이 단계에서 TVM 실행이 이루어집니다.
TVM 상태
주어진 순간에 TVM 상태는 6가지 속성에 의해 완전히 결정됩니다:
- 스택(아래 참조)
- 제어 레지스터 - (아래 참조) 간단히 말해서, 실행 중에 직접 설정하고 읽을 수 있는 최대 16개의 변수를 의미합니다.
- 현재 연속 - 현재 실행 중인 명령어 시퀀스를 설명하는 객체입니다.
- 현재 코드 페이지 - 간단히 말해서 현재 실행 중인 TVM의 버전을 의미합니다.
- 가스 한도 - 4개의 정수 값(현재 가스 한도gl, 최대 가스 한도 gm, 남은 가스gr 및 가스 크레딧 gc)의 집합입니다.
- 라이브러리 컨텍스트 - TVM에서 호출할 수 있는 라이브러리의 해시맵입니다.
TVM은 스택 머신입니다.
TVM은 마지막 입력-최초 출력 스택 머신입니다. 스택에 저장할 수 있는 변수는 총 7가지 유형이며, 이 중 셀이 아닌 유형은 3가지입니다:
- 정수 - 부호화된 257비트 정수
- 튜플 - 임의의 값 유형을 가진 최대 255개 요소의 정렬된 컬렉션으로, 고유할 수 있습니다.
- Null
그리고 네 가지 다른 맛의 셀도 있습니다:
- 셀 - TON 블록체인이 모든 데이터를 저장하는 데 사용하는 기본(중첩 가능) 불투명 구조
- 슬라이스 - 셀에서 읽을 수 있는 특수 개체입니다.
- 빌더 - 새 셀을 만들 수 있는 특별한 개체입니다.
- 연속 - 셀을 TVM 명령의 소스로 사용할 수 있는 특수 개체입니다.
제어 레지스터
c0
- 다음 연속 또는 반환 연속을 포함합니다(기존 설계의 서브루틴 반환 주소와 유사). 이 값은 연속이어야 합니다.c1
- 대체(반환) 연속을 포함하며, 이 값은 연속이어야 합니다.c2
- 예외 핸들러를 포함합니다. 이 값은 예외가 트리거될 때마다 호출되는 연속입니다.c3
- 지원 레지스터, 현재 사전, 즉 프로그램에서 사용되는 모든 함수의 코드가 포함된 해시맵을 포함합니다. 이 값은 컨티뉴이션이어야 합니다.c4
- 영구 데이터의 루트 또는 단순히 컨트랙트의데이터
섹션을 포함합니다. 이 값은 셀입니다.c5
- 출력 동작을 포함합니다. 이 값은 셀입니다.c7
- 임시 데이터의 루트를 포함합니다. 튜플입니다.
TVM 초기화
TVM은 트랜잭션 실행이 계산 단계에 도달하면 초기화되고, 더 이상 실행할 명령이 없을 때까지(그리고 반환 점프의 경우 연속이 없을 때까지) 현재 연속에서 명령(옵코드)을 실행합니다.
초기화 과정에 대한 자세한 설명은 여기에서 확인할 수 있습니다: TVM 초기화
TVM 지침
TVM 지침 목록은 여기에서 확인할 수 있습니다: TVM 지침.
TVM 실행 결과
출구_코드와 소비된 가스 데이터 외에도 TVM은 다음 데이터를 간접적으로 출력합니다:
- C4 레지스터 - 스마트 컨트랙트의 새로운 '데이터'로 저장될 셀입니다(이 단계 또는 이후 단계에서 실행이 되돌리지 않을 경우).
- c5 등록 - (출력 작업 목록) 목록에서 마지막 작업이 있는 셀과 이전 작업이 있는 셀에 대한 참조 (재귀 적으로)
다른 모든 레지스터 값은 무시됩니다.
최대 셀 깊이 <1024
에 제한이 있고, 특히 c4 및 c5 깊이 <=512
에 제한이 있으므로, 하나의 tx <=255
에서 출력 작업의 수에 제한이 있다는 점에 유의하세요. 컨트랙트가 그 이상을 보내야 하는 경우, continue_sending
요청이 포함된 메시지를 스스로에게 보내고 후속 트랜잭션에서 필요한 모든 메시지를 보낼 수 있습니다.