Facebookの仮想通貨 Libraを動かしてみたよ

#はじめに
Facebookが独自の暗号通貨**「Libra」**を発表しました。

VisaやMastercardなどのクレジット会社、UberやSpotifyなど流行りの会社、Coinbaseなど30社程度がパートナーとして参加されているようです。Libraは、法定通貨と一定比率で交換可能なStable Coin として使われるので、ビットコインなどと比べて、価格の安定化も見込めます。

Facebookを使っている（いた）人も多いので、ユーザに馴染みが出て来そうですね。

2020年に開始するようで、今はテストネットが公開されました。
Developerサイトを確認して、Transactionを生成してみました。（下記のサイトを参考）
https://developers.libra.org/docs/my-first-transaction

#1. Libra Coreのclone作成と構築
##Libra Coreリポジトリをcloneする
```
git clone https://github.com/libra/libra.git
```
##Libra Coreセットアップ

Libra Coreをセットアップします。
ディレクトリに移動し、セットアップスクリプトを実行して依存関係をインストールします。

```
cd libra
./scripts/dev_setup.sh
```

セットアップスクリプトは次のことを行います。

- rustupをインストールする - rustupは、Libra Coreが実装されているRustプログラミング言語のインストーラーです。
- 必要なバージョンのrust-toolchainをインストールします。
- CMakeをインストールします - ビルドプロセスを管理します。
- プロトコルバッファ用のコンパイラprotocをインストールします。
- プロトコルバッファを構築するためにGoをインストールします。

#2. Libra CLIクライアントを構築してテストネットに接続する

Libraテストネットで実行されている validator node に接続するには、以下に示すようにクライアントを実行します。

```
./scripts/cli/start_cli_testnet.sh
```

10分くらいすると、ここで下記のようなエラーが出ました。

```
     Running `target/debug/client --host ac.testnet.libra.org --port 80 -s ./scripts/cli/trusted_peers.config.toml`
Not able to connect to validator at ac.testnet.libra.org:80, error RpcFailure(RpcStatus { status: Unavailable, details: Some("OS Error") })

     Running `target/debug/client --host ac.testnet.libra.org --port 80 -s ./scripts/cli/trusted_peers.config.toml`
Not able to connect to validator at ac.testnet.libra.org:80, error RpcFailure(RpcStatus { status: DeadlineExceeded, details: Some("Deadline Exceeded") })
```

テストネットに繋がらず困ってしまいましたが、しばらくしたら直りました><
考えても仕方ないので、次へ進みます。（知っている方、教えてくださいm(_ _)m）

このコマンドは、cargo（Rustのパッケージマネージャ）を利用するクライアントを構築して実行し、そのクライアントをテストネット上の検証ノードに接続します。

クライアントがテストネット上のノードに接続すると、次のような出力が表示されます。クライアントを終了するには、このquitコマンドを使用します。

```
usage: <command> <args>

Use the following commands:

account | a
  Account operations
query | q
  Query operations
transfer | transferb | t | tb
  <sender_account_address>|<sender_account_ref_id> <receiver_account_address>|<receiver_account_ref_id> <number_of_coins> [gas_unit_price (default=0)] [max_gas_amount (default 10000)] Suffix 'b' is for blocking.
  Transfer coins from account to another.
help | h
  Prints this help
quit | q!
  Exit this client


Please, input commands:

libra%
```

#3. アカウントを作成する
アリスとボブのアカウントを作成して、Transactionを生成してみます。

##CLIクライアントが実行してされているかを確認する。

`account`と入力すると、下記のようになります。

```
libra% account
usage: account <arg>

Use the following args for this command:

create | c
  Create an account. Returns reference ID to use in other operations
list | la
  Print all accounts that were created or loaded
recover | r <file path>
  Recover Libra wallet from the file path
write | w <file name>
  Save Libra wallet mnemonic recovery seed to disk
mint | mintb | m | mb <receiver account> <number of coins>
  Mint coins to the account. Suffix 'b' is for blocking
```

##アカウントを作成する。

`account create`で作成できます。
2回コマンドを打って、アリス、ボブ用のアドレスを作りましょう。

```
libra% account create
>> Creating/retrieving next account from wallet
Created/retrieved account #0 address 700909c0e5fca4df3cc2389f939962d00018d9f55ca43d7d0882ebfbbdefe3ce

libra% account create
>> Creating/retrieving next account from wallet
Created/retrieved account #1 address de8b923d3ef98dc0561cf7dc231b63b1d55d3742406e53421b02d2f2769be00c
```

16進数の文字列がアリス、ボブのアドレスになります。
一覧を表示したい場合は`account list`でできます。

#4. Libraコインをmint、残高確認する

## Libraコインをmintする

アリスとボブに、Libraコインをmintしてみます。

```
//account mint インデックス番号　Libraコインの量

//アリス
libra% account mint 0　110
>> Minting coins
Mint request submitted

//ボブ
libra% account mint 1　52
>> Minting coins
Mint request submitted
```

## Libraコインの残高確認

アリスとボブの残高確認は、下記のようにできます。

```
//query balance インデックス番号

//アリス
libra% query balance 0
Balance is: 110

//ボブ
libra% query balance 1
Balance is: 52
```

#5. Transactionを送信する。

##アカウントのシーケンス番号を確認する
Transactionを送信する前に、アカウントのシーケンス番号を確認します。

```
//query sequence インデックス番号

//アリス
libra% query sequence 0
>> Getting current sequence number
Sequence number is: 0

//ボブ
libra% query sequence 1
>> Getting current sequence number
Sequence number is: 0
```

##送金
アリスからボブへ10Libraコイン送金します。

```
//transfer fromインデックス番号 toインデックス番号 Libraコインの量

libra% transfer 0 1 10
>> Transferring
Transaction submitted to validator
To query for transaction status, run: query txn_acc_seq 0 0 <fetch_events=true|false>
```

送金のトランザクション情報をみたい場合は下記で確認できます。

```
//query txn_acc_seq fromインデックス番号 シーケンス番号

libra% query txn_acc_seq 0 0
```

##送金後のシーケンス番号の確認

アリスのアカウントのシーケンス番号が1になっていることがわかります。

```
//query sequence インデックス番号

//アリス
libra% query sequence 0
>> Getting current sequence number
Sequence number is: 1

//ボブ
libra% query sequence 1
>> Getting current sequence number
Sequence number is: 0
```

##送金後のアドレスの残高を確認

アリスの残高が10減り、ボブの残高が10増えていることがわかります。

```
//query balance インデックス番号

//アリス
libra% query balance 0
Balance is: 100

//ボブ
libra% query balance 1
Balance is: 62
```

#おわりに

Libraを使って、送金できることを確認できました。

毎回テストネットに繋ぐのは確認が大変なので、EthereumのGethのようにローカルで確認できるようにしたいですね。