はじめに
昨日、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をみたことがあれば
おなじみの関数もあります。
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