Blockchain/Move

자료형에 대해서 알아볼까요

잘먹는 개발자 에단 2024. 10. 27. 22:46

Move 언어는 자산 관리와 보안을 중시하는 블록체인 환경에 맞추어서 다양한 자료형을 제공합니다. Move의 자료형은 크게 기본 자료형과 복합 자료형으로 나눌 수 있습니다.

 

1. 기본 자료형 Primitive Types

 

1.1 정수형 Unsigned Integer

Move는 다음과 같은 부호없는 정수형을 지원합니다.

- u8 : 8비트 정수, 값 범위는 0부터 255

- u64 :  64비트 정수, 값 범위는 0부터 2^64 -1 

- u128 : 128비트 정수, 값 범위는 0부터 2^128-1

 

Move의 정수형은 모두 부호가 없기 때문에, 음수 값은 사용할 수 없으며, 정수만 사용해야 합니다. 자산의 개수나 특정 값들을 나타내기 위해 주로 사용되며, 산술 오버플로우는 Move의 검증 시스템에서 자동으로 체크됩니다.

let small_number : u8 = 10;
let medium_number : u64 = 1000;
let large_number : u128 = 1000000;

 

 

1.2 논리형 Boolean

Move는 true와 false 두가지 값만을 갖는 Boolean 타입을 제공합니다. 

주로 조건문에서 조건을 확인하거나 상태 플래그를 설정할 때 사용합니다.

let is_active : bool = true;
if(is_active){
	// is_active가 true일 때 실행되는 코드
}

 

 

1.3 주소형 Address

Move의 address 타입은 블록체인 상의 계정 주소를 나타내는데 사용됩니다.

주소형은 트랜잭션의 발신자나 특정 계정과 관련된 데이터 및 권한을 관리하는데 중요한 역할을 합니다.

let account_address : address = 0x1; 
// 예시로 주소를 0x1로 설정

 

 

1.4 서명자형 Signer

signer는 Move에서 특정 트랜잭션의 서명자를 나타내는 특수 타입입니다.

signer는 주소형과 유사하지만, 트랜잭션을 보낸 계정을 특정할 때 주로 사용합니다. 블록체인 네트워크 상에서 트랜잭션을 검증하거나 접근 권한을 부여할 때 필수적인 역할을 합니다.

public fun only_owner(signer: &signer){
	// 트랜잭션 서명자만 실행할 수 있는 함수
}

 

 

 

2. 복합 자료형 Complex Types

 

2.1 벡터형 (vector) (리스트)

vector는 Move의 동적 배열 타입입니다. vector는 동일한 자료형의 여러 개의 값을 하나의 리스트로 관리할 수 있도록 해줍니다.

Move에서 유일하게 제공되는 컬렉션 자료형으로, vector<u8>, vector<u64> 등 다양한 타입의 벡터를 사용할 수 있습니다.

use std::vector;

let numbers: vector<u64> = vector::empty<u64>(); // 빈 벡터 생성
vector::push_back(&mut numbers, 10); // 벡터에 값 추가
vector::push_back(&mut numbers, 20);

&mut는  Move에서 가변 참조 mutable reference를 나타냅니다. 가변 참조는 참조한 값이 수정될 수 있음을 나타내며, 변수에 대한 읽기 뿐만 아니라 쓰기도 가능하게 합니다. 이는 &vec처럼 불변참조 immutable reference 를 사용하는 경우와 대비됩니다. 불변참조는 참조한 값을 읽기만 가능하고 변경은 불가능합니다.

 

&mut와 &의 차이

- &mut 가변참조 : 참조된 값이 수정 가능하며, 함수 내에서 변경할 수 있습니다.

- & 불변참조 : 참조된 값을 읽기만 가능하며, 값을 수정할 수 없습니다.

module ExampleModule {
    use std::vector;

    public fun add_elements() {
        let mut numbers = vector::empty<u64>(); // 빈 벡터 생성
        vector::push_back(&mut numbers, 10); // 벡터 끝에 10 추가
        vector::push_back(&mut numbers, 20); // 벡터 끝에 20 추가
    }
}

 

 

 

2.2 구조체형 Struct

Move의 구조체는 여러 필드를 하나의 그룹으로 묶는데 사용됩니다.

구조체는 주로 자원을 나타내는데 사용되며, has key, has store 속성을 지정해 블록체인 상에서 자산으로 사용할 수 있습니다.

struct Coin has key {
	value : u64,
}

let my_coin = Coin{ value:100 };

 

 

 

3. 사용자 정의 타입과 자원 Resource

Move에서 가장 중요한 개념인 Resource 타입입니다.

자원 타입은 has key, has store 속성을 갖는 구조체로 정의됩니다.

자원은 복사나 삭제가 불가능하며, 단 하나의 소유자만 가질 수 있습니다. 블록체인에서 자산의 소유권을 보장하기 위해 특별히 설계된 특성입니다.

struct Token has key, store{
	balance : u64,
}

public fun create_token(balance : u64) : Token{
	Token{ balance }
}

위에서 Token이라는 자원 타입을 정의했고, create_token 함수를 통해 balance 값으로 초기화된 Token 자원을 생성할 수 있습니다.