Libraの環境構築をしてMoveでHelloWorldしようとしてみた

こんにちは、バレットグループ シニアアーキテクトの菊山 (id:syl-k) です。 今回は、Facebookが先日公開した金融基盤Libraについて調べてみました。

libra.org

Facebookという世界中のユーザーを抱えるプラットフォームを用いて、流通する仮想通貨ができるのではと、今界隈で話題のようです。

そのLibraで使用されるスマートコントラクトなどを実装する新しいプログラミング言語Moveをちょっと触ってみました。

Rustを基盤に作られているみたく、知見者の情報を検索してみてもRustを知っていれば問題ないとのこと。

ただ自身はRustを触ったことがないので、まだまだ慣れない感じですね。

環境構築

まずGitHubのページへ行き、READMEを読んでみると、どうやらこのコード内にコンパイラとかライブラリとかすべて入っているようです。

github.com  

なので、ひとまずこのままcloneしてみます。

ただこの時、PCのホームディレクトリ( $HOME )にcloneしないと、下記で実行するスクリプトが実行できないので注意が必要。

$ git clone https://github.com/libra/libra.git
$ cd libra
$ ./scripts/dev_setup.sh

このあたりはLibraのリファレンスにも書かれてますね。

$ ./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, protobuf, go (for building protobuf)

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

Proceed with installing necessary dependencies? (y/N) > y

...

Finished installing all dependencies.

You should now be able to build the project by running:
    source ~/.cargo/env
    cargo build

私の環境ではRustなどがインストールされていなかったので、完了までに数分かかりました。

その後、Libraのtestnetへの接続をやってみます。

$ ./scripts/cli/start_cli_testnet.sh

このスクリプトはコンパイルを行うみたく、ここでも数分時間がかかりました。

Move 含む依存管理として cargo を用いているため、プログラム実行は cargo を通します。

Rustと同じですね。

今回は軽くHello Worldだけ出してみようかと思います。

ただMoveでの文字列出力はできない(?)ようなので、結局Rust書いているのと同じことになりました。

ひとまずその方法が下記となります。

まず下記ディレクトリに helloworld.mvir ファイルを作成します (* 拡張子はどうやら .mvir)

$ touch ~/libra/language/functional_tests/helloworld.mvir

本来ならテストコードを書くディレクトリだが、一旦ここで作業します。

そしてプログラムを記述

fn main() {
    println!("hello world");
    return;
}

その後、どう階層にある Cargo.toml ファイルの一番下に追記します。

[[bin]]
name = "helloworld"
path = "helloworld.mvir"

これで作業完了

そしたらターミナルからlibraのディレクトリに移動し、下記コマンドを実行

$ cargo run -p functional_tests --bin helloworld

そうするとターミナルに Hello World が表示されます。

そもそもこの下記から自体がRustであり、Libraではprintする必要がないのかもしれないが、printをするのに半日かけてあれこれソースコードを確認することができました。

本当に基本的なところはまだRustで書かれており、Moveで書かれているプログラムもテストコードしか見当たりませんでした。

テストコードもバイトコードを扱うものが多かったが、徐々に増えていくだろうと思われるので、今後もアップデートに期待してきたいです。