해당 글은 Sui Dev Workshop 밋업에서 배운 내용을 토대로 작성한 Sui Move 입문 글입니다.
배운 내용을 간단하게 정리하는 메모장 같은 글입니다.
(Week 1~2 까지의 내용을 다룹니다. 3,4 업데이트 예정)
🔆 스마트 컨트랙트 언어란 무엇인가
- 기존 프로그래밍 언어: CPU를 조작해 Memory 에 있는 상태(데이터)를 변경할 수 있도록 프로그램을 만들 수 있는 도구와 문법
- 시스템 프로세스(OS), 프로세스 관리, Network 통신, Disk 관리, 외부 장치 관리, 마우스/키보드/모니터, UI 등 조작 가능
- 기존 프로그래밍 언어에서는 엄청나게 많은 라이브러리와 도구를 지원
- 스마트 컨트랙트 언어: 블록체인 VM을 조작해 Global State/Storage(데이터)를 변경할 수 있는 도구와 문법
- 상태 변화(Tx) 실행 <- 이게 끝!
- 스마트 컨트랙트 언어에서는, 표현의 한계가 있으며 상대적으로 간단한 기능과 도구만 지원
🔆 Sui Move란?
- Rust의 Move 컨셉에서 따옴
- Move란 Resource-oriented 언어; 즉, 자산을 안전하게 다루기 위한 목적을 가진 언어
- 컴파일 단계에서 자산 데이터가 임의로 복사되거나 삭제되지 않도록 강제하는 언어
- Resource는 임의로 복사되거나 삭제되지 않아야 한다.
- 코드를 작성하다 보면 자연스레 자산을 안전하게 처리 (Move가 알아서 해주는 부분, 에러를 표시해서 강제하는 부분)
🔆 Solidity와 Move의 차이점
- Solidity는 Contract를 중심으로 State 변경을 실행하도록 설계된 언어,
Move는 Resource를 중심으로 Resource를 안전하게 다루도록 설계된 언어(제약 사항이 추가된 언어) - Solidity
- Object-oriented Smart Contract 언어; Ethereum 이라는 World Computer를 실행시키기 위한 언어
- 블록체인 위에서 계약을 코드로 표현하고, 전 세계가 동일한 방식으로 실행하게 만드는 것을 목적으로 탄생한 언어
- Solidity는 Contract를 프로그램의 기본 단위로 사용
- Contract = State(데이터) + Logic(함수) + Identity(주소)
- 배포 후에는 수정 불가, 네트워크 어디서나 호출 가능
- Move on Diem: Global Storage에서 Resource를 가져와 처리하도록 설계된 언어. 문법과 기본 제공하는 standard library 도 다름
- Move on Sui: Object 중심으로 Resource를 처리하도록 설계된 언어
- account based vs object based -> 3주차에
🔆 Sui Move
// module 정의 -> package::module
module mail_box::mailbox;
// 외부 패키지 import
use std::string::{String};
use sui::coin::{Self, Coin};
// 상수 정의
const CONSTANT_NUMBER: u64 = 1231231;
const CONSTANT_ADDRESS: address = @1231231;
// struct 정의
public struct Object has key {
id: UID
}
public struct NonObject has store, copy, drop {
name: String
}
// visibility에 따른 함수 정의
fun private_function() {}
public (package) fun public_package_function() {}
public fun public_funciton() {}
entry fun entry_function() {}
// parameter 형식
public fun function_with_reference_parameter(param1: &Object) {}
public fun function_with_mutable_reference_parameter(param1: &mut Object) {}
public fun funciton_with_value_parameter(param1: Object) {}


🔆 Object의 구성 요소와 유형
- Obejct는 key ability를 가진 모든 데이터
- Sui Object
- objectId
- version
- owner
- objectType
- content
- storageRebate
- digest
- prevTx
// Shared Object
public struct Auction has key, store {
id: UID,
item: Item,
bid: Option<Bid>,
}
public struct Item has key, store {
id: UID
}
- 이런 식으로 has "key" -> key ability를 가진 데이터는 모두 Object다
- Data에 대한 접근 권한 중심으로 분류하는 Object
- Shared Object
- 공유 object기 때문에 다른 곳에서 접근 가능
- Mutable Shared Object
- Immutable Shared Object
- Owned Object
- Owner가 소유하는 Object. 다른 곳에서 접근 불가.
- Owned by Account
- Owned by Object
- Shared Object



🔆 Sui cli
// Address 모두 리스트 하기
sui client addresses
// Fullnode 연결 환경 모두 리스트하기
sui client envs
// Sui coin의 잔액 총합 나타내기 (현재 active address의 잔액)
sui client balance
// 갖고 있는 모든 sui coin object 리스트하기 (현재 active address의 gas coin)
sui client gas
// object ID로 검색하기 [OBJECT_ID]
sui client object
// 소유하고 있는 모든 Object 리스트하기 (현재 active address가 소유한 objects, 필터링도 가능)
sui client objects
// private key export 하기
sui keytool export --key-identity arg1
// move package 생성하기
sui move new [package_name]
// 새 패키지 배포하기
sui client publish
🔆 Move Package의 기본구조 살펴보기
- Capability Pattern
- 권한을 객체로 표현함
- 권한 소유자는 객체(=권한)를 함수에 전달하여 특정 작업을 수행할 권한이 있음을 증명


- 장점
- Admin Migration 하기 쉬움
- Funciton이 훨씬 명시적이고, 체크하는 코드가 필요 없음
- AdminCap Object를 통해 Admin인지 아닌지 투명하게 알 수 있음
🔆 Sui Object-centric Model 이란
- 블록체인 네트워크? 동기화 프로토콜을 지키는 컴퓨터들의 모임
- 블록체인이란? 수백, 수천대의 컴퓨터가 동일한 상태로 동기화되는 것을 암호학적으로 보장해주는 프로토콜
- 모든 원장에 있는 거래 내역의 순서와 내용 동일
- 이중 지불 방지 (디지털 화폐의 최대 문제)
- 블록 제안자를 정하는 방식 -> 합의 알고리즘 (PoW, PoS, DPoS ...)
- 모든 원장에 있는 거래 내역의 순서와 내용 동일