Move 튜토리얼 (5) — BasicCoin 모듈 구현

공식 튜토리얼 Step4: Implementing my BasicCoin module

Yiedw
3 min readOct 4, 2022

이전글 - Move 튜토리얼 (4) — BasicCoin 모듈 설계하기 (링크)

안녕하세요, CC Lab 입니다. 이번에는 본격적으로 BasicCoin 모듈 구현을 해보겠습니다. 해당 글은 Move 공식 깃허브를 참고하여 작성되었습니다.

이번에는 BasicCoin.move 의 내부 메소드 구현에 대해 알아보겠습니다.

publish_balance : 지정된 주소에 Balance 리소스를 게시합니다. Balance는 민팅이나 이체를 통해 코인을 받기 위해 꼭 필요하므로 모듈 소유자를 포함하여 지정된 주소에 이 메소드를 꼭 호출해야 합니다.

mint : 주어진 계정에 코인을 발행합니다. 이 메소드는 모듈 소유자만 가능합니다. 이 단계를 assert 문을 사용하여 확인합니다.

assert!(signer::address_of(&module_owner) == MODULE_OWNER, errors::requires_address(ENOT_MODULE_OWNER));

Move에서 Assert문은 다음과 같은 방법으로 사용합니다.
assert!(<predicate>, <abort_code>);
predicate 가 거짓이면 abort_code 를 리턴하고 트랜잭션을 중단합니다.
여기서 MODULE_OWNER, ENOT_MODULE_OWNER 둘 다 모듈 시작부분에 정의된 상수입니다. 그리고 errors 모듈은 우리가 사용할 수 있는 일반적인 오류 범주를 정의합니다. Move는 실행 시 트랜잭션을 수행한다는 점에 유의하는 것이 중요합니다. 따라서 중단 이 발생하면 해당 트랜잭션의 변경 사항이 블록체인에 유지되지 않으므로 상태 해제를 수행할 필요가 없습니다.

// mint_addr 로 amout 만큼의 코인을 발행(입금)합니다.
deposit(mint_addr, Coin { value: amount });

balance_of : 특정 주소의 잔액을 가져옵니다.
글로벌 스토리지 연산자를 사용하여 코인의 Balance를 가져옵니다. (링크)

borrow_global<Balance>(owner).coin.value
| | \ /
resource type address field names

transfer : 특정 주소(from) 에서 특정 주소(to) 로 코인을 이동합니다.
withdraw함수 를 자세히 살펴보겠습니다 .


fun withdraw(addr: address, amount: u64) : Coin acquires Balance {
// 출금 계정 잔액 가져오기
let balance = balance_of(addr);
// 출금 계정에 잔액이 충분한지 확인
assert!(balance >= amount, EINSUFFICIENT_BALANCE);
// 변경 가능한 참조로 balance 를 가져옴
let balance_ref = &mut borrow_global_mut<Balance>(addr).coin.value;
// 출금하고 남은 잔액으로 수정
*balance_ref = balance - amount;
Coin { value: amount }
}

**acquires : acquires 는 함수 반환 값 뒤에 위치합니다. 이 키워드는 이 함수로 획득한 모든 리소스를 명시적으로 정의합니다. 중첩으로 호출된 함수 안에서도 이 키워드를 호출하여야 합니다. 코드 상위에는 이 리소스가 존재하여야 합니다. (링크1, 링크2)

--

--