Solidity vs FunC
스마트 컨트랙트 개발에는 이더리움을 위한 Solidity, TON을 위한 FunC와 같은 미리 정의된 언어의 사용이 포함됩니다. Solidity는 C++, Python, JavaScript의 영향을 받은 객체 지향적, 고수준, 엄격한 타입의 언어로, 이더리움 블록체인 플랫폼에서 실행되는 스마트 컨트랙트를 작성하기 위해 특별히 설계되었습니다.
FunC 또한 TON 블록체인에서 스마트 컨트랙트를 프로그래밍하는 데 사용되는 고수준 언어로, 도메인 특화된, C와 유사한, 정적 타입의 언어입니다.
아래 섹션에서는 이러한 언어들의 데이터 타입, 저장소, 함수, 흐름 제어 구조, 그리고 딕셔너리(해시맵)와 같은 측면들을 간단히 분석할 것입니다.
저장소 레이아웃
Solidity는 평면적 저장소 모델을 제공하는데, 이는 모든 상태 변수가 저장소라고 불리는 단일의 연속적인 메모리 블록에 저장된다는 것을 의미합니다. 저장소는 키-값 저장소로, 각 키는 저장소 슬롯 번호를 나타내는 256비트(32바이트) 정수이며, 각 값은 해당 슬롯에 저장된 256비트 워드입니다. 슬롯은 0부터 시작하여 순차적으로 번호가 매겨지며, 각 슬롯은 단일 워드를 저장할 수 있습니다. Solidity는 프로그래머가 storage 키워드를 사용하여 상태 변수를 정의함으로써 저장소 레이아웃을 지정할 수 있게 합니다. 변수가 정의되는 순서가 저장소에서의 위치를 결정합니다.
TON 블록체인에서 영구 저장소 데이터는 cell로 저장됩니다. Cell은 스택 기반 TVM에서 메모리 역할을 합니다. Cell은 slice로 변환될 수 있으며, 그런 다음 slice로부터 데이터 비트와 다른 cell에 대한 참조를 로딩하여 cell로부터 얻을 수 있습니다. 데이터 비트와 다른 cell에 대한 참 조는 builder에 저장될 수 있으며, 그런 다음 builder는 새로운 cell로 최종화될 수 있습니다.
데이터 타입
Solidity는 다음과 같은 기본 데이터 타입을 포함합니다:
- Signed/Unsigned integers
- 불리언
- Addresses - 이더리움 지갑이나 스마트 컨트랙트 주소를 저장하는 데 사용되며, 일반적으로 20바이트입니다. 주소 타입은 "payable" 키워드를 접미사로 가질 수 있으며, 이는 지갑 주소만 저장하고 transfer와 send 암호화폐 함수를 사용하도록 제한합니다.
- Byte arrays - "bytes" 키워드로 선언되며, 키워드와 함께 선언된 최대 32까지의 미리 정의된 수의 바이트를 저장하는 데 사용되는 고정 크기 배열입니다.
- Literals - 주소, 유리수와 정수, 문자열, 유니코드, 16진수와 같은 변수에 저장될 수 있는 불변의 값들입니다.
- Enums
- Arrays (정적/동적)
- Structs
- Mappings
FunC의 경우, 주요 데이터 타입은 다음과 같습니다:
- Integers
- Cell - TON의 기본적인 불투명 데이터 구조로, 최대 1,023비트와 최대 4개의 다른 cell에 대한 참조를 포함합니다
- Slice와 Builder - cell에서 읽고 쓰기 위한 특별한 객체들
- Continuation - 실행 가능한 TVM 바이트코드를 포함하는 cell의 또 다른 형태
- Tuples - 최대 255개의 구성 요소를 가진 순서가 있는 컬렉션으로, 임의의 값 타입을 가질 수 있으며, 가능한 한 구별됩니다.
- Tensors - (int, int) a = (2, 4)와 같이 대량 할당이 가능한 순서가 있는 컬렉션입니다. 텐서 타입의 특별한 경우는 단위 타입 ()입니 다. 이는 함수가 어떤 값도 반환하지 않거나 인자가 없다는 것을 나타냅니다.
현재 FunC는 사용자 정의 타입 정의를 지원하지 않습니다.
참고
변수 선언과 사용
Solidity는 정적 타입 언어로, 이는 각 변수가 선언될 때 그 타입이 지정되어야 함을 의미합니다.
uint test = 1; // Declaring an unsigned variable of integer type
bool isActive = true; // Logical variable
string name = "Alice"; // String variable
FunC는 더 추상적이고 함수 지향적인 언어로, 동적 타입과 함수형 프로그래밍 스타일을 지원합니다.
(int x, int y) = (1, 2); // A tuple containing two integer variables
var z = x + y; // Dynamic variable declaration