본문으로 건너뛰기

TVM 개요

모든 TON 스마트 컨트랙트는 자체 TON 가상 머신(TVM)에서 실행됩니다. TVM은 스택 원리를 기반으로 구축되어 효율적이고 쉽게 구현할 수 있습니다.

이 문서는 TVM이 트랜잭션을 실행하는 방법을 한눈에 볼 수 있도록 설명합니다.

TON 코스: TVM

톤 블록체인 코스](https://stepik.org/course/176754/)는 톤 블록체인 개발을 위한 종합 가이드입니다.

모듈 2는 TVM, 거래, 확장성 및 비즈니스 사례에 대해 자세히 다룹니다.

TON 블록체인 코스 확인

트랜잭션 및 단계

TON 체인 중 하나의 계정에서 어떤 이벤트가 발생하면 트랜잭션이 발생합니다. 가장 일반적인 이벤트는 "어떤 메시지의 도착"이지만 일반적으로 '틱톡', '병합', '분할' 및 기타 이벤트가 있을 수 있습니다.

각 트랜잭션은 최대 5단계로 구성됩니다:

  1. 보관 단계 - 이 단계에서는 체인 상태의 일부 공간 점유로 인해 계약에 의해 누적된 보관 수수료가 계산됩니다. 자세한 내용은 스토리지 수수료에서 확인하세요.
  2. 신용 단계 - 이 단계에서는 (가능한) 수신 메시지 값에 대한 계약 잔액과 징수된 보관 수수료가 계산됩니다.
  3. 계산 단계 - 이 단계에서는 TVM이 컨트랙트를 실행하며(아래 참조), 컨트랙트 실행 결과는 exit_code, actions(직렬화된 작업 목록), gas_details, new_storage 및 기타 몇 가지의 집계입니다.
  4. 액션 단계 - 계산 단계가 성공했다면, 이 단계에서는 계산 단계의 '액션'을 처리합니다. 특히 액션에는 메시지 전송, 스마트 컨트랙트 코드 업데이트, 라이브러리 업데이트 등이 포함될 수 있습니다. 일부 작업은 처리 중에 실패할 수 있으며(예를 들어, 컨트랙트가 가진 것보다 많은 TON으로 메시지를 보내려고 하는 경우), 이 경우 전체 트랜잭션이 되돌리거나 이 작업을 건너뛸 수 있습니다(작업 모드에 따라, 즉 컨트랙트가 '보내기 또는 되돌리기' 또는 '보내기 시도-없음 무시' 유형의 메시지를 보낼 수 있습니다).
  5. 바운스 단계 - 계산 단계가 실패한 경우(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 요청이 포함된 메시지를 스스로에게 보내고 후속 트랜잭션에서 필요한 모든 메시지를 보낼 수 있습니다.

참고 항목