Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

개발환경 구축

다른 개발 언어들과 마찬가지로 Move 역시, 편집, 컴파일, 실행 및 디버깅 할 수 있는 개발환경을 구성해야 한다. Move 언어는 블록체인을 위해서 만들어진 언어다. Shell, Python, C/C++ 처럼 우리가 일상적으로 사용하는 운영체제 위에서 실행하는 언어가 아니다. 블록체인 이라는 생소한 환경에서 실행하기 때문에 단지 실행하는 것 도 쉽지 않은 작업니다.

Move로 개발하기 위해서 Visual Studio Code를 사용 할 것이다. VS Code를 위한 Move IDE 확장을 사용 할 수 있기 때문이다. 이 툴은 Move 환경을 이해하고 구축하는데 도움을 준다.

Move 개발환경 빌드

이론적으로는 VS Code에 Move IDE 확장만 설치하면 개발환경 설정이 끝나야 한다. 이 확장은 컴파일러와 디버깅, 테스트 툴등을 제공할 테니까 말이다.

하지만 현실적으로 그렇지 않다. Libra 블록체인과 Move 가 모두 완성되지 않은 상태이기 때문이다. Move의 경우 문법자체가 다른데 이에 대한 문서화도 제대로 되어 있지 않아서 여기에서 컴파일 됐던 코드가 저쪽에서는 컴파일 되지 않는 사태가 발생한다.

나도 VS Code와 Move 확장으로 개발하려고 했는데, 아예 컴파일 조차(다른 곳에서는 컴파일 되던게) 안됐다.

그래서 어느 정도 수동으로 개발환경을 만들 수 밖에 없었다. 그 과정을 모두 포함한다. 오늘 현재(2020년 8월 1일)의 상황이고, 올해 말이면 개발환경이 깔끔해지지 않을까 기대해본다.

운영체제

우분투리눅스 20.04다. 다른 운영체제에서는 제대로 작동할지 장담 할 수 없다. Libra 코드를 clone 한다.
# git clone https://github.com/libra/libra.git

testnet을 checkout 한다.
# cd libra
# git checkout testnet

스크립트를 실행해서 종속성을 해결한다. Libra는 Rust를 중심으로 개발됐다.
# ./scripts/dev_setup.sh 
Welcome to Libra!

This script will download and install the necessary dependencies needed to
build Libra Core. This includes:
	* Rust (and the necessary components, e.g. rust-fmt, clippy)
	* CMake
      * Clang

If you'd prefer to install these dependencies yourself, please exit this script
now with Ctrl-C.

이제 각종 툴들을 빌드한다. 여기에서 얻어야 할 툴은 move 컴파일러인 move-build이다. move-build를 포함한 모든 툴을 빌드했다.
# cargo build --all
빌드된 파일들은 target/debug밑에 위치한다.

workspace 설정

아래와 같이 작업 디렉토리를 설정한다.
  • code/ : 모듈 소스코드가 저장되는 디렉토리
  • modules/ : 모듈이 소스코드가 저장되는 디렉토리.(위의 code와 중복되는 느낌이 들 것이다. 뒤에 설명하겠다.)
  • scripts/ : 트랜잭션 스크립트가 저장되는 디렉토리
  • out/
    # mkdir modules scripts out
workspace 디렉토리에 .mvconfig.json 파일을 배치한다.
{
    "network": "libra",
    "sender": "0x1"
}

move extension 설치

 MOVE IDE 설치

move extension을 설치한다.

첫번째 move 애플리케이션을 컴파일 되도록 해보자.

모든 모듈은 code 디렉토리 밑에서 개발한다.
// hello_module.move
address 0x1 {
    module HelloWorld {
        public fun gimme_five(): u8 {
            5
        }
    }
}

아래는 module을 실행 할 script다.
// run_hello.move
script {
    use 0x1::HelloWorld;
    use 0x1::Debug;

    fun main() {
        let five = HelloWorld::gimme_five();

        Debug::print<u8>(&five);
    }
}
그리고 move/ 디렉토리 밑에 비어있는 empty.move 파일을 하나 만들어 둔다. 왜 이런 쓸데 없는 짓을 하는지는 후술하겠다. 현재 파일 구조는 아래와 같다.
.
├── code
│   └── hello_world.move
├── modules
│   └── empty.move
├── out
└── scripts
    └── run_hello.move

module를 먼저 컴파일해보자. ctrl+shipt+p로 명령 팔렛트를 실행하고 move: compile를 실행하면 컴파일 된다.

 move compile

에러가 떨어질 것이다.(2020년 8월 1일 시점에서는 에러가 떨어졌다.)
터미널 프로세스 "/bin/zsh '-c', '/home/yundream/.vscode/extensions/damirka.move-ide-0.4.0/bin/move-build \
--out-dir /home/yundream/workspace/move/out --sender 0x1 \
--dependency /home/yundream/.vscode/extensions/damirka.move-ide-0.4.0/stdlib/libra/* \
/home/yundream/workspace/move/modules/* \
-- /home/yundream/workspace/move/code/hello_world.move'"을(를) 시작하지 못했습니다(종료 코드: 101).
에러를 잡기 전에, 컴파일 코드를 분석해볼 필요가 있겠다.
  • move-build : move 컴파일 소프트웨어다. vscode move ide extensions에서 제공한 컴파일러를 사용하고 있다.
  • --out-dir : 컴파일을 하면 바이트코드가 만들어진다. 바이트코드의 위치를 move/out 디렉토리르 솔정했다.
  • --sender : 이 모듈을 컴파일한 account address 다. 테스트가 목적이라서 기본 account address를 사용했다.
  • --dependency : 종속성 설정이다. C/C++의 library 링크라고 보면 되겠다. 종속성 디렉토리에 move/modules/* 가 있는데, 때문에 move/modules 밑에 hello_world.move 를 두면 "모듈 중복"에러가 떨어진다. 현재 소스 코드의 HelloWorld 모듈과 충돌나기 때문이다. extension 문서에 있는데로 하면 에러 발생한다. 실수로 이렇게 한건지, 처음엔 문제가 없다가 지금은 문제가 된건지 알 수 없다.
앞서 직접 빌드한 move-build로 컴파일을 해보자.
# $HOME/workspace/libra/target/debug/move-build --out-dir /home/yundream/workspace/move/out \
--sender 0x1 --dependency /home/yundream/.vscode/extensions/damirka.move-ide-0.4.0/stdlib/libra/* \
/home/yundream/workspace/move/modules/* -- /home/yundream/workspace/move/code/hello_world.move   
move-build 만 바꿔서 컴파일 성공했다. out/modules/0_HelloWorld.mv 바이트코드 파일을 확인 할 수 있었다. 개발 환경이 총체적인 난국이다. 나는 move-build 파일을 extention 에 복사하는 것으로 문제를 해결했다.
# cp $HOME/workspace/libra/target/debug/move-build $HOME/.vscode/extensions/damirka.move-ide-0.4.0/bin 
다시 컴파일하면 성공하는 걸 확인 할 수 있을 거다. 열 받는다. 이 거 때문에 반나절은 고생한 것 같다.