Move는 페이스북의 리브라 화폐 프로젝트를 위해서 개발된 스마트컨트랙트 프로그래밍 언어입니다.
Rust에서 영감을 받아서 설계된 부분이 많고, 특히 메모리 안전성, 자원관리, 소유권 개념 등에서 유사한 점이 많습니다.
Move는 특히 블록체인 상에서 디지털 자산의 안전한 이동과 소유권 관리에 특화된 언어로, 스마트 컨트랙트를 작성하기 위해서 처음부터 설계되었습니다. 이로 인해서, Move는 Rust 보다도 더 엄격한 자원관리 시스템과 보안성을 제공합니다.
1. 자원 Resource 타입과 소유권 관리
Move는 자산을 자원타입(resource type)으로 선언하고, 이 자원은 복사할 수 없으며 단 하나의 소유자만 가질 수 있습니다.
이것은 블록체인에서 자산의 중복과 무단 사용을 방지하기 위한 특화된 기능이라 볼 수 있습니다.
Rust의 소유권 개념과 유사하지만, Move에서는 자원의 이동과 소멸이 더욱 엄격하게 적용됩니다.
struct Coin has key{
value : u64,
}
public func create_coin(amount : u64) : Coin{
Coin{ value : amount }
}
위 예시에서, Coin이라는 자원은 한번 생성되면 다른 객체로 복사할 수 없고, 오직 하나의 소유자만 가질 수 있습니다.
조금 더 살펴볼까요?
Move에서 가장 독특하고 중요한 특성 중 하나는 자원 Resource 타입입니다. 자원은 디지털 자산을 모델링하는데 사용되며, 이러한 자산이 복사되거나 무단으로 공유될 위험을 원천적으로 차단합니다. 이 자원 특성 덕분에 Move에서 작성된 스마트 컨트랙트는 자산 소유와 관련된 복잡한 규칙을 코드에 내재화할 수 있습니다.
- 자원은 단일 소유권을 가집니다. 특정 계정에만 소유될 수 있으며, 복사나 복제는 불가능합니다.
- 이동성이 강제됩니다. 자원은 함수 호출을 통해서만 이동할 수 있으며, 사용이 끝나면 자동으로 소멸됩니다.
struct Coin has key, store{
value : u64,
}
예를 들어서, 토큰 같은 자산을 모델링할 때, 복사될 수 없는 특성을 적용하여 토큰이 중복으로 사용되지 않도록 합니다.
위에서 Coin 구조체는 key와 store 속성을 통해 특정 계정의 자산으로만 존재할 수 있고, 복제할 수 없습니다.
2. 반복문 미지원
Move는 블록체인에서의 계산 자원 절약을 위해서 반복문 ( 예를 들어 for나 , while문 )을 지원하지 않습니다. 이것은 스마트 컨트랙트가 무한 루프에 빠지는 것을 방지하고, 모든 함수가 항상 완료되도록 보장하기 위함입니다.
3. 상속과 다형성 미지원
Move는 Rust와 달리 상속을 지원하지 않으며, 타입 간 다형성 ( polymorphism )도 제한적입니다. 이러한 제한은 주로 스마트 컨트랙트의 보안성을 높이기 위한 것으로, 예상치 못한 동작을 줄여 코드 안정성을 보장하기 위한 설계입니다.
4. 언어 생태계와 목적의 차이
Rust는 일반적인 시스템 프로그래밍 언어로 광범위한 분야에서 사용될 수 있지만, Move는 주로 블록체인과 스마트 컨트랙트에 최적화된 언어입니다. Move는 자산 이동과 보안성이 매우 중요한 어플리케이션 개발에 적합하도록 설계되었습니다.
5. 명확한 소유권과 이동
Move 언어의 이름은 데이터 이동 ( Move Semantics )에서 유래되었을 정도로, 데이터의 이동과 소유권이 핵심적인 역할을 합니다. 소유권은 항상 한 객체가 갖고, 데이터가 이동 move 되면 원래 위치에는 더이상 데이터가 남아있지 않습니다. 이러한 방식은 데이터의 중복과 비정상적인 접근을 방지하여 스마트 컨트랙트의 안전성을 높여줍니다.
fun transfer_coin (to: &signer, coin : Coin):Coin {
coin // coin 자산이 to 계정으로 이동됨.
}
위 코드에서 coin은 transfer_coin 함수 호출 시 to에게 이동하고, 기존 위치에는 남지 않게 됩니다.
6. 모듈 Module 시스템과 가시성 제어
Move에서는 모듈을 통해 코드를 구조화하고, 가시성 제어를 통해 함수와 자원에 대한 접근을 제어할 수 있습니다. 모듈은 다른 모듈에서 정의된 함수와 자원을 가져올 수 있지만, 모듈 외부에서는 public으로 선언된 함수만 접근할 수 있습니다.
- public : 외부에서 접근할 수 있는 함수
- public(script) : 스크립트에서만 호출 가능한 함수
- public (friend): 같은 모듈 그룹에서만 접근가능한 함수
module ExampleModule{
public fun transfer(to: &signer, amount: u64){
// transfer 기능
}
fun internal_logic(){
// 내부로직, 모듈 외부에서 호출 불가
}
}
위 코드에서 transfer 함수는 public으로 선언되어 외부에서 접근 가능하지만, internal_logic은 외부 접근이 불가능한 내부함수입니다.
7. 불변성과 결정적 동작
Move는 불변성과 결정적 동작을 강조합니다. 반복문을 지원하지 않고, 모든 함수는 무조건 종료되도록 설계됩니다. 이는 블록체인 스마트 컨트랙트의 무한 루프를 방지하고, 계산 자원을 효율적으로 관리하는데 도움을 줍니다.
- Move에서 반복문이 없기 때문에, 재귀와 조건문만 사용하여 필요한 작업을 수행해야 합니다.
- 블록체인의 결정적 결과를 보장하기 위해 함수 호출의 결과가 항상 예측 가능하도록 합니다.
8. 타입 시스템과 제네릭 지원
Move는 강력한 정적 타입 시스템을 갖추고 있으며, 제네릭을 통해 여러 타입을 처리할 수 있도록 지원합니다. 이는 스마트 컨트랙트가 다루는 다양한 자산 유형에 대해 확장성 높은 코드를 작성할 수 있게 해줍니다.
public fun swap<T> (x: T, y: T):(T,T){
(y,x)
}
9. 암호화와 서명검증기능
Moves는 블록체인 환경을 위해 설계된 언어이기 때문에, 암호화 기능과 서명 검증을 위한 기본 라이브러리를 제공합니다. 특히 signer 타입을 통해 트랜잭션의 서명을 검증하고, 이를 통해 계정 인증 및 접근 제어를 할 수 있습니다.
public fun transfer_with_signature(from : &signer, to: address, amount: u64){
// from 서명자를 이용해 to 주소로 금액을 전송
}
signer 타입을 사용하면 from 서명자가 실제 트랜잭션의 서명자인지 확인할 수 있습니다.
Rust와 Move는 그럼 어떠한 점에서 유사할까요?
1. 메모리 안전성
- Rust 처럼 Move도 메모리 안전성을 보장합니다.
2. 소유권 개념
- 자원의 소유권을 추적하며, 이로 인해 예기치 않은 데이터 접근을 방지합니다.
'Blockchain > Move' 카테고리의 다른 글
자료형에 대해서 알아볼까요 (0) | 2024.10.27 |
---|---|
반복문을 쓸 수 없다면, 반복 작업을 어떻게 하나요? (0) | 2024.10.27 |