Facebook のブロックチェーン 環境、Libra のコマンドラインツールを試してみた


facebook が、新しいブロックチェーン環境、Libra を公開しました。[詳しくはこちら](https://libra.org/en-US/vision/)
Move という言語を使って独自のトランザクションロジックが作れるそうです。

現在テストネット環境が提供されており、トランザクションのテストができるCLIツールが公開されています。早速使ってみましたのでご紹介します。

基本的には、[ここ](https://developers.libra.org/docs/my-first-transaction#setup)の内容をなぞっただけです。

# セットアップ
まずは、Libra Core というコアライブラリをセットアップします。

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

途中で、依存ライブラリをインストールするか聞かれるので、y を押します。

Libra のテスト用環境に接続するための、CLIツールをインストールします。

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

<img width="766" alt="IMG_0590.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1399/09708bae-20a6-2b67-65fc-94a66e2bd5ed.jpeg">


インストールには結構時間がかかりました。

とりあえず、`quit` と入力すると、入力モードから戻ることができます。

# 太郎さんのアカウントを作る

インストールできたら、早速トランザクション用のアカウントを作ってみましょう。

CLI上で `create accounts` コマンドを実行すると、アカウントを作ることができます。

```
libra% create accounts
>> Creating/retrieving next account from wallet
Created/retrieved account #0 address 732fd95fd70caec7e5aef79fd0d8f3e8f0d0783355bbd6bf0340e08a98373b20
```

最初に現れる #0 は、このCLIからアカウントを操作する際のID、その次の hex 値はアカウントのアドレスです。
ブロックチェーンネットワーク上でやりとりをする場合には、この hex 値を使って相手を特定することになります。

トランザクションを実施をするにはもう一人必要ですので、花子さんのアカウントを別に作ります。

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

`account list` で、アカウントのリストを見ることができます。

```
libra% account list
User account index: 0, address: 732fd95fd70caec7e5aef79fd0d8f3e8f0d0783355bbd6bf0340e08a98373b20, sequence number: 0, status: Local
User account index: 1, address: f8a14c4d1bf64bca9328bdb684d650f0dbeb329e9a01a220d60f65a1a1b74e9c, sequence number: 0, status: Local
```

2人のアカウントができていることを確認できました。

まずは、それぞれのアカウントに Libra Coin を発行してみます。コインの発行には、`account mint` コマンドを実行します。

```
libra%  account mint 0 110
>> Minting coins
Mint request submitted
```

1つ目の引数、0 がアカウントの ID、2つ目が発行量です。
これで、太郎さんに110コインが発行されました。

次に、花子さんにも52コインを発行します。

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

さて、それぞれの残高を見てみましょう。残高を見るには、`query balance` コマンドを使います。

```
libra% query balance 0
Balance is: 110
libra% query balance 1
Balance is: 52
```

確かに発行されていますね。

いよいよ太郎さんから花子さんにコインを移動させてみます。その前に、シークエンスを確認しておきましょう。シークエンスとは、アカウントが実行したトランザクションの歴史のことです。過去に何回トランザクションが行われているかを確認できます。

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

太郎さんも花子さんもトランザクションが0で、何も実施されていないことがわかります。

コインの移動には、`transfer` コマンドを使います。

`transfer 送信元のID 送信先のID コインの量` という使い方です。

```
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 0 0 fetch_events=true で確認することがだきます。

トランザクションの発行と、ネットワーク側での処理は非同期に行われます。処理が終わるまで待ちたい場合は、`transferb` というコマンドもあるようです。

それでは、二人の残高を確認してみましょう。

```
libra% query balance 0
Balance is: 100
libra% query balance 1
Balance is: 62
```

無事、10コインが移動しているのがわかります。

非常に簡単に、コインの移動を試すことができました。

シークエンスの方をを見てみると、

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

太郎さんのシークエンスが1増えているのがわかります。

このように、手軽に Libra 環境を試すことができました。時間ができたら、カスタムロジッグなども試してみたいと思います。