Tezos実践: TezosのスマートコントラクトをMichelson modeを使って書こう


少しずつTezosのコントラクト例を書いて紹介していきたいと思います。 が、まずはMichelsonを書く下準備の話。

Michelsonを書こう

暗号通貨TezosのスマートコントラクトVM言語はMichelsonといいます。 EthereumにおけるEVMに対応する位置にあって、MichelsonもスタックVMなのですが、 型付きで、リストなどのデータ型やmap,iterなどがあり、 実は人間が書ける言語です。(実は中の人はLiquidityはほとんど使っていません。)

Michelson emacs mode

えっ無理無理、と言う人のために、Michelsonプログラムを編集する時に便利な Emacsモード、Michelsonモードがあります:

http://tezos.gitlab.io/alphanet/introduction/various.html?highlight=emacs#environment-for-writing-michelson-contracts

このセクションを読んでインストールしてみてください。(和訳はしません。)

Michelson の型情報インスペクション

Michelsonは型付きスタック言語です。つまりスタックに積まれた各要素に型がついています。 これは静的型付きの関数型言語に慣れ親しんだ人でも初めであればちょっと変に見えるかもしれませんが、 なに、大したことはないです。

MichelsonモードではMichensonプログラムを型検査して、各オプコード実行前と後のスタックの型を見ることができます。これがあるのとないのとではMichelsonコードの書きやすさが違うのでぜひ使ってみてください。

たとえば、次の画像では COMPARE がスタックから二つの mutez を消費して結果として int をスタックに積んでいることがわかります。

Michelson モードを使うには Tezos ノードが必要

今の所Michelsonモードはプログラムの型検査にTezosノードを必要とします。これは、Michelsonモードからtezos-clientコマンドを使ってプログラムコードをノードに送り、その型検査結果をもらうためです。

ノードを建てたばかりでbootstrapが全く始まっていない時点ではMichelsonモードの型インスペクションは動きません。 なぜならノードが立ち上がったばかりの時点では、ノードはGenesisブロックしか知らず、そこでのプロトコルはGenesisプロトコルといってほとんど何もないものだからです。 これがalphanetなどのMichelsonを知っているプロトコルに差し代わった状態になるまで同期に少しかかります。 同期されると、Michelsonモードが使うtezos-clientの型検査関連のコマンドが利用可能になり、Michelsonモードもちゃんと動き出します。

Sandboxed node を使う

Michelsonの型検査のために、外部とP2P通信するノードを建てるというのはヘビーウェイトだなあという方もあると思うので、sandboxed nodeを使った方法も紹介します:

http://tezos.gitlab.io/alphanet/introduction/various.html?highlight=sandboxed#use-sandboxed-mode

$ ./src/bin_node/tezos-sandboxed-node.sh 1 --connections 1 &  # ノード#1を建てる
$ eval `./src/bin_client/tezos-init-sandboxed-client.sh 1`    # tezos-activate-alpha を定義
$ tezos-activate-alpha                                        # alphanetプロトコルを挿入
$ fg

Sandboxed nodeもはじめはGenesisプロトコルで動いているので、alphanetのものに差し替える必要があります。

さて、これで外界とは通信しないノードが立ち上がりましたが、これだけではMichelsonモードがうまく動きません。なぜなら、sandboxed nodeはRPCポートが通常とは違うからです。(一つのマシンで複数のsandboxed nodeを動かすため、また、正式なノードと誤認しない/されないため)

Sandboxed node #1 の RPC ポート番号は 18731 なので、これをmichelson-client-commandに加える必要があります:

(setq michelson-client-command "ディレクトリ/tezos/tezos-client -P 18731")

そんな感じです。

Vimは?

自分で作るしかないですね…

これからは

少しずつTezosのコントラクト例を書いて紹介していきたいと思います。

comments powered by Disqus