LoginSignup
1
1

More than 3 years have passed since last update.

Libraの環境構築からコントラクトの実行まで

Last updated at Posted at 2019-06-20

はじめに

昨日、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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1