TVM vs EVM
이더리움 가상 머신(EVM)과 TON 가상 머신(TVM)은 모두 스마트 컨트랙트 코드를 실행하기 위해 개발된 스택 기반 가상 머신입니다. 공통된 특징이 있지만, 그들 사이에는 주목할 만한 차이점들이 있습니다.
데이터 표현
이더리움 가상 머신(EVM)
- 기본 데이터 단위
- EVM은 주로 256비트 정수로 작동하며, 이는 이더리움의 암호화 함수(예: Keccak-256 해싱과 타원 곡선 연산)를 중심으로 한 설계를 반영합니다.
- 데이터 타입은 주로 정수, 바이트, 때로는 이러한 타입의 배열로 제한되지만, 모두 256비트 처리 규칙을 준수해야 합니다.
- 상태 저장소
- 이더리움 블록체인의 전체 상태는 256비트 주소를 256비트 값에 매핑한 것입니다. 이 매핑은 머클 패트리시아 트라이(MPT)라고 알려진 데이터 구조에서 유지됩니다.
- MPT는 이더리움이 암호화 검증을 통해 블록체인 상태의 일관성과 무결성을 효율적으로 증명할 수 있게 해주며, 이는 이더리움과 같은 탈중앙화 시스템에서 매우 중요합니다.
- 데이터 구조 제한
- 256비트 워드 제약으로의 단순화는 EVM이 복잡하거나 사용자 정의 데이터 구조를 직접 처리하도록 설계되지 않았음을 의미합니다.
- 개발자들은 종종 더 복잡한 데이터 구조를 시뮬레이션하기 위해 스마트 컨트랙트 내에 추가 로직을 구현해야 하며, 이는 가스 비용과 복잡성 증가로 이어질 수 있습니다.
TON 가상 머신(TVM)
- 셀 기반 아키텍처
- TVM은 데이터를 표현하기 위해 독특한 "셀의 가방" 모델을 사용합니다. 각 셀은 최대 128 데이터 바이트를 포함할 수 있으며, 다른 셀에 대한 최대 4개의 참조를 가질 수 있습니다.
- 이 구조는 TVM이 임의의 대수적 데이터 타입과 트리나 방향성 비순환 그래프(DAG)와 같은 더 복잡한 구조를 저장소 모델 내에서 직접 기본적으로 지원할 수 있게 합니다.
- 유연성과 효율성
- 셀 모델은 상당한 유연성을 제공하여 TVM이 EVM보다 더 자연스럽고 효율적으로 다양한 데이터 구조를 처리할 수 있게 합니다.
- 예를 들어, 셀 참조를 통해 연결된 구조를 생성하는 능력은 탈중앙화 소셜 네트워크나 복잡한 탈중앙화 금융(DeFi) 프로토콜과 같은 특정 유형의 애플리케이션에 중요한 동적이고 잠재적으로 무한한 데이터 구조를 가능하게 합니다.
- 복잡한 데이터 처리
- VM 아키텍처 내에서 복잡한 데이터 타입을 본질적으로 관리하는 능력은 스마트 컨트랙트에서 우회 구현의 필요성을 줄여, 잠재적으로 실행 비용을 낮추고 실행 속도를 증가시킵니다.
- TVM의 설계는 복잡한 상태 관리나 상호 연결된 데이터 구조가 필요한 애플리케이션에 특히 유리하며, 개발자들이 정교하고 확장 가능한 탈중앙화 애플리케이션을 구축할 수 있는 강력한 기반을 제공합니다.
스택 머신
이더리움 가상 머신(EVM)
- EVM은 연산을 관리하기 위해 후입선출(LIFO) 스택을 사용하는 전통적인 스택 기반 머신으로 작동합니다.
- 스택의 모든 요소에 대한 표준 크기인 256비트 정수를 푸시하고 팝하여 연산을 처리합니다.
TON 가상 머신(TVM)
- TVM도 스택 기반 머신으로 작동하지만 중요한 차이가 있습니다: 257비트 정수와 셀에 대한 참조를 모두 지원합니다.
- 이를 통해 TVM은 이 두 가지 distinct 타입의 데이터를 스택에 푸시하고 팝할 수 있어, 직접적인 데이터 조작에서 향상된 유연성을 제공합니다.
스택 연산 예시
EVM에서 두 숫자(2와 2)를 더하고 싶다고 가정해보겠습니다. 이 과정은 숫자들을 스택에 푸시하고 ADD
명령어를 호출하는 것을 포함합니다. 결과(4)는 스택의 맨 위에 남게 됩니다.
TVM에서도 같은 방식으로 이 연산을 수행할 수 있습니다. 하지만 해시맵과 셀 참조와 같은 더 복잡한 데이터 구조를 포함하는 다른 예시를 살펴보겠습니다. 키는 정수이고 값은 정수나 셀 참조인 키-값 쌍을 저장하는 해시맵이 있다고 가정해보겠습니다. 우리의 해시맵이 다음과 같은 항목들을 포함한다고 해보겠습니다:
{
1: 10
2: cell_a (which contains 10)
}
키 1과 2에 연결된 값 들을 더하고 결과를 키 3에 저장하고 싶습니다. 스택 연산을 살펴보겠습니다:
- 키 1을 스택에 푸시:
stack
= (1) - 키 1에 대해
DICTGET
호출(스택 맨 위의 키와 연결된 값을 검색): 값 10을 검색.stack
= (10) - 키 2를 스택에 푸시:
stack
= (10, 2) - 키 2에 대해
DICTGET
호출: Cell_A에 대한 참조를 검색.stack
= (10, Cell_A) - Cell_A에서 값 로드: 셀 참조에서 값을 로드하는 명령어가 실행됨.
stack
= (10, 10) ADD
명령어 호출:ADD
명령어가 실행되면, TVM은 스택의 맨 위 두 요소를 팝하여 더하고 결과를 스택에 다시 푸시합니다. 이 경우, 맨 위 두 요소는 10과 10입니다. 더하기 후, 스택은 결과를 포함합니다:stack
= (20)- 키 3을 스택에 푸시:
stack
= (20, 3) DICTSET
호출: 키 3으로 20을 저장. 업데이트된 해시맵:
{
1: 10,
2: cell_a,
3: 20
}
EVM에서 동일한 작업을 수행하려면 키-값 쌍을 저장하는 매핑을 정의하고 매핑에 저장된 256비트 정수와 직접 작업하는 함수를 정의해야 합니다. EVM이 Solidity를 활용하여 복잡한 데이터 구조를 지원한다는 점에 주목하는 것이 중요하지만, 이러한 구조들은 EVM의 더 단순한 데이터 모델 위에 구축되며, 이는 TVM의 더 표현력 있는 데이터 모델과 근본적으로 다릅니다.
산술 연산
이더리움 가상 머신(EVM)
- 이더리움 가상 머신(EVM)은 256비트 정수를 사용하여 산술 연산을 처리하며, 이는 덧셈, 뺄셈, 곱셈, 나눗셈과 같은 연산이 이 데이터 크기에 맞춰져 있음을 의미합니다.
TON 가상 머신(TVM)
- TON 가상 머신(TVM)은 64비트, 128비트, 256비트 정수를 포함하여 더 다양한 범위의 산술 연산을 지원하며, 부호 있는 것과 없는 것 모두, 그리고 모듈로 연산도 지원합니다. TVM은 또한 곱하기-후-시프트와 시프트-후-나누기와 같은 연산으로 산술 기능을 더욱 향상시키며, 이는 고정 소수점 산술을 구현하는 데 특히 유용합니다. 이러한 다양성은 개발자들이 스마트 컨트랙트의 특정 요구사항에 기반하여 가장 효율적인 산술 연산을 선택할 수 있게 하여, 데이터 크기와 타입에 기반한 잠재적 최적화를 제공합니다.