Libraの環境構築からコントラクトの実行まで

#はじめに

昨日、FacebookのLibraが発表されてから様々なな話題が広がっています。
業界団体、立場によって、かなり受け止め方が異なるのも面白いです。

「フェイスブックの仮想通貨「Libra」に米議会が激怒、開発停止を求める」
https://tech.nikkeibp.co.jp/atcl/nxt/column/18/00001/02423/

仮想通貨というよりもWhatsAppやメッセンジャーを通した、
スマートコントラクトのプラットフォームを目指しているような印象を受けるLibraですが、
今後の動向に注目です。


#Libraの概要

>ホワイトペーパー
https://libra.org/ja-JP/white-paper

>トピック
+ Libra Network
+ LibraBFTと呼ばれるBFTタイプのコンセンサス(LibraBFTは、HotStuffの進化系)
+ Moveという新たなスマコン言語
+ 単一通貨ペッグではなく様々な通貨や資産と連携

この中で気になるのは、basket担保というもの。
This cryptocurrency is backed by a basket of financial assets (Libra Reserve) provided by node operators

例えば100ドルを担保に、100ドルのstableコインを発行。ドルペッグのコインがあったとして、
バスケットの定義として、複数の通貨のレートを考慮した加重平均として、表現されるそうです。

(参考)
https://www.imf.org/ja/About/Factsheets/Sheets/2016/08/01/14/51/Special-Drawing-Right-SDR


#Development

開発という観点では、
すでにTestNetで動作が可能のようなので、実際に試してみました。

##Install

```
git clone https://github.com/libra/libra.git && cd libra
./scripts/dev_setup.sh
./scripts/cli/start_cli_testnet.sh
```

##Demo

###accountを2個作る

```
libra% account create
libra% account create

libra% account list
User account index: 0, address: c74b9e0e57a7b424fe1b8e6d7107482c2ad7e39c6f3266f09413053a5b206210, sequence number: 0, status: Local
User account index: 1, address: f92b0ca44fed8ef0927b6292710457e5a52724867ddba493f3138e891b77b165, sequence number: 0, status: Local
```

###1000コイン、mintして残高をみる
```
libra%  account mint 0 1000
libra% query balance 0
Balance is: 1000
```

###送金

```
libra% transfer 0 1 10

libra% query balance 0
Balance is: 990
libra% query balance 1
Balance is: 10
```

#LibraCoin

moveで実際に書かれた、コントラクトを実際にみてみると、
ERC20のような中身になっていて、mint,withdrawなどSolidityをみたことがあれば
おなじみの関数もあります。

https://github.com/libra/libra/blob/master/language/stdlib/modules/libra_coin.mvir



#Move IRでcontract操作

Libraで使われるコントラクトはMoveという言語が使われ、
これらをMove IRと呼び、ファイルの拡張子が「.mvir」となる。
基本的な動きは「Rust」と同じになります。

##MoveIRは、Transactionとmoduleの2つから構成

```
modules:
module M {
    foo() {
        return;
    }
}
 
script:
main() {
    return;
}
```

##sample code
libra/language/functional_tests/tests/testsuite/
の配下にいくつか参考になるscriptが置いてあるので、ざっと読んでみると良さげ。

```
builtins/
===>ビルトイン関数のsample
commands/
===>if文など基本的な制御構文のsample
examples/
===>シンプルな構文sample
global_ref_count/
===>リソース取得、格納など
modules/
===>モジュールのsample
move_getting_started_examples/
===>Getting Started With Moveのsample
operators/
===>加減乗除などsampel
payments/
===>送金のsample
```

##インストール
Rustを用意して、「cargo」コマンドなどを使えるようにしておく

```
curl https://sh.rustup.rs -sSf | sh

下記が.bash_profileに作成されるので
export PATH="$HOME/.cargo/bin:$PATH"

source ../../../.bash_profile
```

```
$ rustc --version
$ rustup --version
$ cargo --version
```

##コンパイル試す
```
hello.rs
fn main() {
    println!("Hello World!");
}
rustc hello.rs
./hello
Hello World!
```

##Libra内で新しくプログラムを作る
libra/language/functional_tests/tests/testsuite/
の配下に新しく、ディレクトリを掘って作る。
例)
libra/language/functional_tests/tests/testsuite/demogame/demogame.mvir

```
//実行
cargo test -p functional_tests demogame.mvir
```



##demoコード
paymets/の中のコードを見ながら、A->Bに送金するサンプルを作ってみる

```
import 0x0.LibraAccount;

main() {

  let address_A: address;
  let address_B: address;
  let init_balance_A: u64;
  let balance_A: u64;
  let balance_B: u64;

  //Aがtransactionの実行者
  address_A = get_txn_sender();
  address_B = 0xb0b;

  init_balance_A = LibraAccount.balance(copy(address_A));

  //100をA->Bに支払い
  LibraAccount.pay_from_sender(copy(address_B), 100);

  balance_A = LibraAccount.balance(copy(address_A));
  balance_B = LibraAccount.balance(copy(address_B));

  assert(copy(balance_A) == copy(init_balance_A) - 100, 42);
  assert(copy(balance_B) == 100, 42);
  assert(true, 42);
  return;
}
```

##copyとかmoveとか

Rust初心者としては、copyとかmoveがちょっと大変に感じるのですが、
この辺りを参考にさせてもらいつつ...
https://qiita.com/myhr47/items/262b8b8f1edd8097d03c


#おしまい



#参考

「Official Document」
https://libra.org/en-US/
https://developers.libra.org/docs/my-first-transaction
https://github.com/libra/libra

「Facebook has finally revealed the details of its cryptocurrency」
https://techcrunch.com/2019/06/18/facebook-libra/

「How to run Facebook’s Libra Testnet」
https://medium.com/@NYSam/how-to-run-facebooks-libra-testnet-3f9c226a13e1

「Facebook、新仮想通貨「Libra」でSMSのように送金できる世界を目指す」
https://www.watch.impress.co.jp/docs/news/1191258.html