Tezos を動かしてみる

Tezos というブロックチェーンがある。

https://tezos.com/

https://tezos.com/developer-portal

https://tezos.gitlab.io/index.html

ブロックチェーンとしての Tezos を詳しく知りたい人は、適当に検索してみて欲しい。
ここで大切なのは、 **Tezos は関数型言語勢によって開発されている** という点である。そもそも Tezos 自体が OCaml で開発されているし、 Tezos の上でスマートコントラクトを記述する為の言語にも、 LIGO や SCaml といった関数型っぽい言語を使うことができる。「関数型言語を使ってスマートコントラクトが記述できる」というのが Tezos の利点の一つとされている。ついでに開発者の中には定理証明勢もたくさんいるらしく、 Tezos のコードそのものを Coq で証明しよう、みたいな事もしているっぽい（詳しくは分からないが）。

### スマートコントラクト

スマートコントラクトというのは、ブロックチェーン上で自動で契約を実行する仕組みらしい。
正直私もあんまり理解できていないのだが、どうもブロックチェーン上にプログラムのコードを登録し、仮想通貨を送る事をキーとかにして動かす事ができる、というもののようだ。イーサリアム（多分ビットコインに次いで有名なブロックチェーン）とかで利用できる機能なのだけど、 Tezos もこの機能を持っている。

で、上に書いたように Tezos はこのスマートコントラクトを関数型言語で書けるというのがウリである。
一体どういう事ができるのかは正直まだよく分かっていないのだが、 OCaml っぽい言語でブロックチェーン上で動くプログラムを書ける、というのはちょっと楽しそうではないだろうか？

というわけで、簡単に触ってみる事にした。

### 注意事項

この記事についての注意事項を幾つか述べておく。

まず最初に、この記事では **Tezos で儲ける方法は一切紹介しない** 。そんな方法があるなら私に教えてくれ。
というか、 **Tezos の買い方すら説明しない** 。適当な仮想通貨の取引所を使えば買えるんじゃないの？
本記事ではあくまで、 Tezos でスマートコントラクトを使うにはどうするのか、を調べた記録である。それ以上のものはない。何か一発当てようと思ってこの記事を読んでいる人がいるなら、是非とも最後まで読んでから落胆して欲しい。

この記事を読んで Tezos を買ってみるのは本人の勝手だけど、自己責任でやってくださいね。

### 環境

私はこの作業を Windows10 + WSL2 + Ubuntu20.04 の環境で行っている。
多分大抵の Linux 系の環境で同じように動かせると思う。

## Tezos をビルドする

Tezos を使う方法は幾つかある。

- 自前でビルドする
- opam package として導入する
- 配布されたバイナリをダウンロードしてくる

今回は、 opam package として導入する方法を試してみる。

opam の入れ方についてはさすがに詳しく書かないので、入れてない人はこのあたりを見て欲しい。

https://opam.ocaml.org/doc/Install.html

### tezos を入れる

次に、 Tezos の公式サイトに従って Tezos を opam package として導入する。

https://tezos.gitlab.io/introduction/howtoget.html#building-from-sources-via-opam

……ここまでやっていて思ったのだけど、 opam package として導入する方法は中途半端なような気もする。
自前でビルドするなら、ソースからビルドしてしまえばいい。それなら自分でソースに変更を加えたりもできるし。
もし自前ビルドが面倒なら、配布されているバイナリを使ってしまえばいい。
一応、異なるバージョンの Tezos を同時に使いたい、みたいな場合に便利なのかな？

### Rust と Zcash params を入れる

tezos-node で `Failed to initialize Zcash parameters: cannot find Zcash params in any of` というエラーが出た。
Tezos を使うには Rust の環境と Zcash が必要らしい。

Rust のインストールはここを参照

https://www.rust-lang.org/ja/tools/install

Zcash はこれ

```bash
$ wget https://raw.githubusercontent.com/zcash/zcash/master/zcutil/fetch-params.sh
$ chmod +x fetch-params.sh
$ ./fetch-params.sh
```

割と巨大なファイルを落としてくるので注意

### Tezos のバージョン確認

```bash
> tezos-client --version
31e6641d (2021-04-30 16:58:29 +0200) (9.1)
```

## 動かしてみる

[このマニュアル](https://tezos.gitlab.io/introduction/howtouse.html)にそって動かしていくと、スマートコントラクトを登録したり実行する所までできそうなので、これを上からやってみる。

しかしいきなりなのだが、このコマンドは怒られた。

```bash
$ tezos-client transfer
Error:
  Unrecognized command.
  Try using the man command to get more information.
```

バージョンの変化にマニュアルが追いついてないっぽい。

### テストネットワークに繋ぐ

本番ネットワークに繋ぐのは怖いので、テストネットワークに繋いでみる。
というか今回は、基本的に本番ネットワークには繋がないようにしている。

```bash
$ tezos-node config init --data-dir ~/.tezos-node-florencenet --network florencenet

$ tezos-node identity generate --data-dir ~/.tezos-node-florencenet

$ tezos-node run --data-dir ~/.tezos-node-florencenet --rpc-addr 127.0.0.1
```

上のコマンドでノードがテストネットワークにつながるのだが、立ち上げの際に全ての取引データを持ってこようとする。これは、テストネットワークであってもかなりの時間がかかる。
よって、今回はスナップショットを利用した。
ここから取ってくる。

https://snapshots-tezos.giganode.io/


```bash
$ wget https://snapshots-tezos.giganode.io/snapshot-testnet_xxxxx.full

$ tezos-node snapshot --data-dir ~/.tezos-node-florencenet import --block xxxxxx ./snapshot-testnet_xxxxx.full
```

今回はテストネットワークなので雑にネット上に落ちているスナップショットを使ったが、もし本番ネットワークを動かすつもりなら、安全性に注意してデータを扱う方が良いと思う。

### クライアントを確かめる

node の準備ができている事を確認する。

```bash
$ tezos-client bootstrapped
```

次に、 chain の head の timestamp を確認してみる。

```bash
$ tezos-client get timestamp
```

何となく正しそうである。

### テスト用の Tezos をもらう

テストネットワークの場合、挙動確認や実験などに使うために、無料で Tezos をもらうことができる。
（無料で、とか書いているが別に換金などはできないので変な気を起こさないように。）

https://faucet.tzalpha.net/ 

ここアクセスして、 JSON ファイルをダウンロードしてくる。
その JSON ファイルを使い、

```bash
$ tezos-client activate account alice with "tz1__xxxxxxxxx__.json"
```

とやると、 faucet （蛇口）から Tezos をもらう事ができる。
もらった Tezos は次のコマンドで確認できる。

```bash
$ tezos-client get balance for alice
```

この JSON ファイルは、テストネットワークのマイグレーションが行われた際に再度利用する事になるので大切に取っておくこと、と書いてある。

### 財布を作る

client にはウォレット機能が付いている。キーペアによって表現され、わかりやすい名前を付ける事ができる。
先ほど alice という名前で Tezos を受け取ったので、今度は bob というウォレットを作ってみる。

```bash
$ tezos-client gen keys bob
$ tezos-client list known contracts
```

ちなみにこの時生成されたキーは暗号化されずにローカルファイルに保存されているらしい。
`--encrypted` オプションを付ける事で、暗号化されたキーペアを生成できる。

```bash
$ tezos-client gen keys tom --encrypted
```

### 送金と受け取り

では、 Tezos の転送をしてみよう。
まずは dry-run モードで。

```bash
$ tezos-client transfer 1 from alice to bob --dry-run
```

これは失敗する。
送金の際、チェーンに取引を記録する事になるのだが、その手数料を払わないといけない。手数料はベイカー（ビットコインでいうマイナーみたいな人達だけど、ちょっと違う）に渡すか、あるいは一部の Tezos を破棄（焼却）する事で支払う事ができる。クライアントの初期設定では Tezos の burn 上限値が0になっているので、手数料が足りないぞという事で処理が失敗したのだ。
……と書いてあるのだけど、 Tezos をベイカーに渡さず破棄するってあるんだろうか？　必ずベイカーに渡っているような気がする。この辺の仕組みは、正直よく分かっていない。

burn キャップは引数として明示的に渡す事ができる（この辺はエラーメッセージでも丁寧に説明されている）。

```bash
$ tezos-client transfer 1 from alice to bob --dry-run --burn-cap 0.257
```

エラーが出なければ、 `--dry-run` を外して実際に送金してみよう。
ちょっと時間がかかる。

そして、 bob の財布を確認する。

```bash
$ tezos-client get balance for bob
```

ちゃんと1ꜩ増えている！

## まとめ

これで、 Tezos の node と client を動かし、財布の間で Tezos を送受する事ができた。
ブロックチェーンの基本的な動きを確かめる事ができたと思う。

「スマートコントラクトが Tezos の特徴！」って最初に言っているのにスマートコントラクトの利用に入らず記事を終えるのはどうかと思うのだが、スマートコントラクト（と Michelson ）の説明は大変そうなので、書くとすれば別記事にしたい。

最後にもう一度だけ。

**Tezos の購入は自己責任で行ってください。**