FacebookのLibra clientをdockerで動かして送金してみる

# はじめに

Facebookの仮想通貨[Libra](https://developers.libra.org/)が話題になっているのでチュートリアルでもやっておこうと思った。おなじみAliceとBobの送金のチュートリアルは[My First Transaction](https://developers.libra.org/docs/my-first-transaction)に記載されていて、すでにQiitaでもいくつか記事が上がってるみたいだが、レポジトリをみると[Client構築用のDockerfile](https://github.com/libra/libra/tree/master/docker/client)もあった。これを使った記事はまだないようなので書いておきます

# Dociker imageをビルドする

まずレポジトリをcloneしてディレクトリに入ります

```shell
git clone https://github.com/libra/libra.git

cd libra
```

ビルド用のスクリプトを実行します。シェル内のパス指定の関係上 `./libra` 下でスクリプトを実行してください 

```shell
./docker/client/build.sh
```

以下のようにビルドプロセスが走ります。rustパッケージのダウンロードとコンパイルにけっこう時間がかかりました

```shell
Step 1/22 : FROM debian:stretch as builder
 ---> e1de74e67cc7
Step 2/22 : RUN echo "deb http://deb.debian.org/debian stretch-backports main" > /etc/apt/sources.list.d/backports.list && apt-get update && apt-get install -y protobuf-compiler/stretch-backports cmake golang curl && apt-get clean && rm -r /var/lib/apt/lists/*
 ---> Running in 00f85886bbc5
Get:1 http://security-cdn.debian.org/debian-security stretch/updates InRelease [94.3 kB]
Ign:2 http://cdn-fastly.deb.debian.org/debian stretch InRelease

...中略...

Step 21/22 : LABEL org.label-schema.vcs-ref=$GIT_REV
 ---> Running in adc05cec2283
Removing intermediate container adc05cec2283
 ---> 3c808c6bb4a9
Step 22/22 : LABEL vcs-upstream=$GIT_UPSTREAM
 ---> Running in c19717b2ec5e
Removing intermediate container c19717b2ec5e
 ---> 58d2f41cf45d
Successfully built 58d2f41cf45d
Successfully tagged libra_client:latest
```

完了後`docker images`でみてみると`libra_client`の他に`<none>`なイメージができてました。[client.Dockerfile](https://github.com/libra/libra/blob/master/docker/client/client.Dockerfile)をみるかぎりこれは`builder`のほうでしょう

```shell
docker images

REPOSITORY                                                                  TAG                 IMAGE ID            CREATED             SIZE
libra_client                                                                latest              58d2f41cf45d        3 minutes ago       497MB
<none>                                                                      <none>              3f0911b2eef6        3 minutes ago       5.13GB
```

# Clientを起動する

```shell
docker run -it libra_client
```

いきなりtestnetにつながったクライアントのプロンプトが表示されます。これは便利

```shell
Connected to validator at: ac.testnet.libra.org:8000
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_in_micro_libras (default=0)] [max_gas_amount_in_micro_libras (default 10000)] Suffix 'b' is for blocking. 
	Transfer coins (in libra) from account to another.
help | h 
	Prints this help
quit | q! 
	Exit this client


Please, input commands: 

libra% 
```

# 送金してみる

もうセットアップは必要ないので、チュートリアルの[Create Alice’s and Bob’s Account](https://developers.libra.org/docs/my-first-transaction#create-alice-s-and-bob-s-account)からやります

```shell
libra% account create
>> Creating/retrieving next account from wallet
Created/retrieved account #0 address 0793206214112fc26cf8e0c830132f58487252eefc3e90791a7f91fee40cbe31


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

libra% account list
User account index: 0, address: 0793206214112fc26cf8e0c830132f58487252eefc3e90791a7f91fee40cbe31, sequence number: 0, status: Local
User account index: 1, address: 36b50257fd39825fec54f1b0534096a4dbd3f5fdbb64258d64c217296fd11a46, sequence number: 0, status: Local

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

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

libra% query balance 0
Balance is: 110

libra% query balance 1
Balance is: 52

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>

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

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

libra% query balance 0
Balance is: 100

libra% query balance 1
Balance is: 62

libra% transferb 1 0 10
>> Transferring
[waiting Transaction completed, found sequence number 1]
Finished transaction!
To query for transaction status, run: query txn_acc_seq 1 0 <fetch_events=true|false>

libra% query balance 0
Balance is: 110

libra% query balance 1
Balance is: 52

libra% 
CTRL-C
```

問題なくできました

# 後片付け

これは任意だけど、コンテナを終了してイメージを削除する。また使う場合はやる必要はありません

```shell
docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y

docker image rm 3f0911b2eef6

docker image rm 58d2f41cf45d
```

# おわりに

dockerだとセットアップが楽でいいですね