2019/06/18にFacebook製仮想通貨「Libra」が正式発表されIT界隈を賑わせています。今のところ2020年リリース予定だそうです。
公開されたwhite paper他から、銀行インフラが整っていない国々への普及を目指していること、資産として裏付けのある準紙幣を目指していること、Libraブロックチェーンに参加するには当面の間はグローバルに認知された企業(市場価値10億ドル、年間アクティブユーザ2000万人など)でないと無理であること等々が分かってきました。
日本での決済にLibraが使えるようになるのかどうか以前に、米下院での反対や金融機関との摩擦が予想されていてリリースまでの壁の高さが気になりますが、技術者の端くれとしてはwhite paperの「Section 07 How to Get Involved(参加する方法)」に以下の記述があることが気になりました。
If you are a researcher or protocol developer, an early preview of the Libra testnet is available under the Apache 2.0 Open Source License, with accompanying documentation.
「あなたが研究者かプロトコル開発者の場合、Libraテストネットのアーリープレビューを、付属文書と共にApache 2.0 オープンソースライセンスの元利用することが出来ます」
LibraのブロックチェーンはOSSとして使えるようです。まぁ構築してみても今のところネットワークに参加することなど出来ませんが、将来的にはLibraブロックチェーン参加の障壁は下がるとザッカーバーグ氏も言っています。折角公開してくれているので手順に従って環境構築をしてみました。
目次
構築環境
CentOS7.6。
(Linux or Macが対象。WindowsではCygwinありでもシェル実行に失敗します。)
構築手順
以下の公式文書に従います。
epel-release有効化
goが必要になる為有効にしておきます。
# yum -y install epel-release
c++インストール
途中のコンパイルで必要になるので入ってなければgcc-c++を入れておきます。
# yum -y install gcc-c++
Libraをgithubからcloneしてくる
Rust(.rs)ファイルが山ほど落ちてきます。
# git clone https://github.com/libra/libra.git && cd libra
Cloning into 'libra'...
remote: Enumerating objects: 2004, done.
remote: Total 2004 (delta 0), reused 0 (delta 0), pack-reused 2004
Receiving objects: 100% (2004/2004), 1.85 MiB | 663.00 KiB/s, done.
Resolving deltas: 100% (604/604), done.
dev_setup.shを実行
rustやgoが自動でインストールされます。通信はProtocol Buffersを使う模様。
$ ./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) >
(snip)
完了しました!
Installing Protobuf......
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 164 0 164 0 0 209 0 --:--:-- --:--:-- --:--:-- 209
0 0 0 619 0 0 599 0 --:--:-- 0:00:01 --:--:-- 599
100 1513k 100 1513k 0 0 472k 0 0:00:03 0:00:03 --:--:-- 789k
Archive: protoc-3.8.0-linux-x86_64.zip
inflating: /usr/local/bin/protoc
Archive: protoc-3.8.0-linux-x86_64.zip
creating: /usr/local/include/google/
creating: /usr/local/include/google/protobuf/
inflating: /usr/local/include/google/protobuf/api.proto
inflating: /usr/local/include/google/protobuf/type.proto
inflating: /usr/local/include/google/protobuf/wrappers.proto
creating: /usr/local/include/google/protobuf/compiler/
inflating: /usr/local/include/google/protobuf/compiler/plugin.proto
inflating: /usr/local/include/google/protobuf/timestamp.proto
inflating: /usr/local/include/google/protobuf/duration.proto
inflating: /usr/local/include/google/protobuf/descriptor.proto
inflating: /usr/local/include/google/protobuf/any.proto
inflating: /usr/local/include/google/protobuf/source_context.proto
inflating: /usr/local/include/google/protobuf/field_mask.proto
inflating: /usr/local/include/google/protobuf/struct.proto
inflating: /usr/local/include/google/protobuf/empty.proto
protoc is installed to /usr/local/bin/
Finished installing all dependencies.
You should now be able to build the project by running:
source /root/.cargo/env
cargo build
rust 1.35.0、go 1.11.5がインストールされました。
# which rustc
/root/.cargo/bin/rustc
# rustc --version
rustc 1.35.0 (3c235d560 2019-05-20)
# go version
go version go1.11.5 linux/amd64
start_cli_testnet.shを実行
ダウンロードとコンパイルが始まりましたが・・・途中でcmakeがエラー。
# ./scripts/cli/start_cli_testnet.sh
(snip)
--- stderr
CMake Warning at cmake/protobuf.cmake:48 (message):
gRPC_PROTOBUF_PROVIDER is "module" but PROTOBUF_ROOT_DIR is wrong
Call Stack (most recent call first):
CMakeLists.txt:140 (include)
CMake Warning at cmake/gflags.cmake:26 (message):
gRPC_GFLAGS_PROVIDER is "module" but GFLAGS_ROOT_DIR is wrong
Call Stack (most recent call first):
CMakeLists.txt:142 (include)
CMake Error at CMakeLists.txt:738 (target_compile_options):
Error evaluating generator expression:
$<COMPILE_LANGUAGE:CXX>
Expression did not evaluate to a known generator expression
(snip)
cmakeがProtocol Buffersのビルドに対応出来てないご様子です。インストールされているcmakeのバージョンは2.8系です。
# cmake --version
cmake version 2.8.12.2
cmakeを3系に上げると解決しました。ソースから入れるか、cmake3コマンドとしてyum installします。後者で入れてcmakeにシンボリックリンクを張って暫定対処。
# yum install cmake3
# cd /bin
# mv cmake cmake.bak
# ln -s cmake3 cmake
# file cmake
cmake: symbolic link to `cmake3'
# cmake --version
cmake3 version 3.13.5
CMake suite maintained and supported by Kitware (kitware.com/cmake).
改めてテストネット起動。
# ./scripts/cli/start_cli_testnet.sh
(snip)
Compiling vm_validator v0.1.0 (/root/src/libra/vm_validator)
Compiling stdlib v0.1.0 (/root/src/libra/language/stdlib)
Compiling vm_genesis v0.1.0 (/root/src/libra/language/vm/vm_genesis)
Compiling client v0.1.0 (/root/src/libra/client)
Finished dev [unoptimized + debuginfo] target(s) in 2m 04s
Running `target/debug/client --host ac.testnet.libra.org --port 8000 -s ./scripts/cli/trusted_peers.config.toml`
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%
libraのコンソールが起動しました。まだコマンドはaccount、query、transfer、help、quitの5種類しか無くシンプルですね。
送金を体験してみる
1ノードですが環境構築が出来たので、公式文書の「My First Transaction」に従ってlibraコンソールを操作してみます。AliceとBobというユーザを仮想的に作ってLibraを与え、AliceからBobに10 Libra送金する手順になっています。
AliceとBobのアカウントを作成
「account create」で作成。#0インデックスがAlice、#1インデックスがBobであるという設定です。
libra% account create
>> Creating/retrieving next account from wallet
Created/retrieved account #0 address 2ef800bec5bbf0d01ac7d05b9a1969d8362658b83c77dd37fc0b51869db5daf4
libra% account create
>> Creating/retrieving next account from wallet
Created/retrieved account #1 address c9f05fa95de07872fd8fdc9001496971c2e5b20547d291a554b423e28b86aedf
アカウントが作成されているか、「account list」で一応確認。
libra% account list
User account index: 0, address: 2ef800bec5bbf0d01ac7d05b9a1969d8362658b83c77dd37fc0b51869db5daf4, sequence number: 0, status: Local
User account index: 1, address: c9f05fa95de07872fd8fdc9001496971c2e5b20547d291a554b423e28b86aedf, sequence number: 0, status: Local
LibraコインをAliceとBobに与える
マイニングはFaucet(蛇口?)というサービスによって行われるそうで、Faucetはtestnetのみに存在し、本番環境であるmainnetには存在しないそうです。そりゃあこのコマンド一発でコインを与えられたら価値なんてなくなるでしょうしね。
「account mint」コマンドで、Alice(インデックス0)に110 Libraコイン、Bob(インデックス1)に52 Libraコインを与えます。
libra% account mint 0 110
>> Minting coins
Mint request submitted
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
AliceからBobに10コイン送金
「transfer」コマンドでAlice(インデックス0)からBob(インデックス1)へ10コイン送金してみます。
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>
再度残高を確認してみると、10コイン移動されていることが確認出来ました。
libra% query balance 0
Balance is: 100
libra% query balance 1
Balance is: 62
「query sequence」でトランザクションシーケンスを見てみると、Aliceだけインクリメントされています。Libraでは送金した側だけこのシーケンスが増えていくそうです。
libra% query sequence 0
>> Getting current sequence number
Sequence number is: 1
libra% query sequence 1
>> Getting current sequence number
Sequence number is: 0
ブロックチェーン基盤としては魅力
まだノードとして繋がりを持たせていないのもありますが、Hyperledgerの黎明期より操作がシンプルなイメージを持ちました。
コイン以外の用途でこのブロックチェーン基盤が使われるとしたら、OSSブロックチェーン基盤はHyperledgerだけが選択肢では無くなりそうです。
もしLibraが日本でも準紙幣としての立場で流通されるとしたら、加盟企業に決済代行してくれるStripeが居るのが楽しみです。
開発したアプリの決済代行をStripeのAPIにしておいて、ユーザはLibraで支払いしてくれる、とか将来は当たり前になったりするのかも。
日本は銀行インフラが異常なほど発達していて仮想通貨で決済や預金する必要は無いかも知れませんが、InstagramやWhatsAppでLibraを増やす為の仕組みをFacebookが今後投入してくるとしたら・・・ちょっと目が離せなくなりそうです。