KEVM on Cardanoで遊んでみよう

Yuya Sugano
14 min readJan 8, 2021

--

Ethereum Killerとして大変お騒がせしておりましたCardanoが2021年ついに牙をむき始めるようです。年末から立て続けにニュースがあり、オラクルのためのWolfram Alphaとの協業、スマートコントラクト開発ができるKEVMとIELEというテストネットの公開メタデータコネクターのリリースLitecoin/IOTAとの統合など話題豊富です。KEVMのローンチはその中でも注目です。KEVMは形式的検証のフレームワークであるKフレームワークを用いて検証されたEVM(Ethereum Virtual Machine)を使用できるテストネットで、現行のEthereumだけでなくEth 2.0のコードもCardano上へ移植することができるということです。CardanoはEthereumのオラクルやDeFiといったエコシステムおよびアプリたちをそのまま飲み込んでしまおうという目論みのようですね。ちなみにIELEというテストネットはどのアプログラミング言語でもスマートコントラクトが書けるそうです(例として挙げられているのはJava/C++/Python/Rust)。[1]

テストネットとしてはKEVMとIELEの2つがありますがEthereumからアプリを移植したいという人はKEVM上でEthereumの開発資産をそのまま活用できます。そこで今回はローンチされたテストネットであるKEVMを触ってみようという試みです。またEthereumではお馴染みのIDEであるTruffleの統合も計画されているとのこと。つまり開発も運用もTruffleやSolidityのスキルをそのまま生かせるよ、ということを言っておられます。情報量が多いですがCardanoはLitecoinとの相互接続(NiPoPoWs)やIOTAとのチェーンのブリッジも計画されており(IOTA 2.0レビュー中)全てが実現すると全体の規模感やトークン時価総額はすごいことになりそうです。[2]

Source: Aleksandra Sova — Shutterstock

本記事は公式デベロッパードキュメントに沿ってお試ししてみました。いま実際に使えるのはKEVMのみでIELEは使えないようです。[3]

  1. KEVMとは何か
  2. スマートコントラクトアーキテクチャ
  3. Mallet 2.0をインストールする
  4. Hello Worldをやってみる

KEVMとは何か

KEVMは簡単にKフレームワークの仕様によるEVM(Ethereum Virtual Machine)であると説明されています。それではKフレームワークとは何かですが、形式検証されたプログラミング言語やVMを作成するセマンティックプラットフォームであるとのこと。これだけでは意味が分かりませんが、プログラミング言語の形式意味を直感的かつモジュラー式に実装するためのフレームワークだと言われています。正式な仕様で『構築しながら正しい結果が得られる』実行可能なVMを生成することが可能です。[4]

Kフレームワークは形式検証されたソフトウェアを記述する手段で、作成されたコードの欠陥を自動的にチェックし期待通りに動作することを証明してくれます。とにかくこれはCardano上のEVMでスマートコントラクトをいいかんじに動かしてくれる、ぐらいの理解ですね。さらに読み進めるとKEVMはEVMのインタプリタでもありますとのこと。EVMのK仕様であるKEVMはインタプリタのソースコードです。

またKEVMはスマートコントラクトの正当性も証明できます。これはKフレームワークでコントラクトのプロパティーをKEVM仕様とコントラクトを合わせて検証することで可能になります。KEVMによって整数のオーバーフローやアンダーフロー、スタックオーバーフロー、Out of Gasなどなどスマートコントラクトのエラーをチェックすることができます。

テストネットのウォレットでコントラクトを走らせる場合には、トランザクションはKEVMのインタプリタで解釈されて実行されます。このインタプリタはKフレームワークに基づいていてテストネットだけの用途として用意されています。スマートコントラクトをネットワークへ投げる前にKフレームワークで検証ができます、とのことです。[5]

スマートコントラクトアーキテクチャ

デベロッパードキュメントでは3つのレベルから見たスマートコントラクトのアーキテクチャが紹介されています。コンテキストレベルは単純化した説明でユーザ、開発者、ブロックチェーンバリデータがどのようにスマートコントラクトと係るかという点を説明します。コンテイナーレベルはさらに登場人物が仕様するツールやそれらのツールで何を行うかについて、コンポーネントレベルは開発環境およびステークプールノードというコンポーネントというレベルに落として各コンポーネントの説明をしています。[6]

  1. コンテキストレベル
  2. コンテイナーレベル
  3. コンポーネントレベル

コンテキストレベルではユーザ、開発者、ブロックチェーンバリデータの役割についてです。コンテキストレベルだけ図を転載します。開発者はTruffleなどのIDEを使用してアプリ開発を行うことができます。ノードはMantisのフォークであるMantis-CardanoがKEVM/IELEのために提供されているようです。

  • 開発者 — スマートコントラクトを開発してデプロイします [1, 2]
  • ユーザ — スマートコントラクトとやり取りします [3, 4, 8]
  • ブロックバリデータ — スマートコントラクトの内容を実行してブロックへ情報を追加します [5, 6, 7]
Context Level View

Mallet 2.0インストールする

KEVMは形式検証の搭載されたEVMです。MantisというEthereum Classicのブロックチェーンに準拠したクライアントソフトウェアをMantis-Cardanoとして提供されています。Mallet 2.0を使用することでスマートコントラクトの記述とコンパイル、またKEVMネットへのデプロイが行えます。Linux/Macの推奨環境は Node.js 10.16.3、Python 2.7 とのこと。なんか古いですが。

手元の環境は n と pyenv で Node.js と Python のバージョンを切り替えています。以下のコマンドで対象のバージョンへと変更しました。

$ sudo n 10.16.3$ pyenv versions
* system (set by /home/user/work/mallet/.python-version)
3.6.0
3.7.3
$ pyenv local system
ether@www6083ui:~/work/javascript/mallet$ python -V
Python 2.7.12
n

さらにMallet 2.0をインストールするには nvm(node version manager)が必要なようです。以下の手順でインストールしました。デベロッパードキュメントと同じ 2.1.0 のバージョンが入っている状態です。

$ curl -s -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash
$ export NVM_DIR="$HOME/.nvm"
$ [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
$ nvm --version
0.37.2
$ git clone https://github.com/input-output-hk/mallet
$ cat .nvmrc
10.16.3
$ nvm use
Found '/home/ether/work/javascript/mallet/mallet/.nvmrc' with version <10.16.3>
N/A: version "10.16.3 -> N/A" is not yet installed.
$ npm install --silent
$ ./mallet --version
2.1.0

Malletが正常にインストールされていれば準備は完了です。SolidityのコードをKEVMのバイトコードへコンパイルしてデプロイしていきましょう。

Hello Worldをやってみる

HelloWorld.solという『Hello, World!』とだけ表示するスマートコントラクトを開発します。繰り返しですがSolidityで開発できるのでこの単純なプログラムのコードは以下の通りです。ファイル名を HelloWorld.sol としてください。

solcでバイトコードへコンパイルしましょう。Dockerイメージを使って以下のように指示できます。コンパイルが成功するとローカルに HelloWorld.abi 1HelloWorld.bin の2つのファイルが生成されます。

$ docker run --rm -v $(pwd):/sources ethereum/solc:0.5.1 -o /sources --bin --abi /sources/HelloWorld.solCompiler run successful. Artifact(s) can be found in directory /sources.

Malletを使ってKEVMへ接続します。 ./mallet kevm -d ./data コマンドを使用してください。このインタラクティブなセッションは Repl(read-eval-print-loop)という Node.js の環境で疑似的に Javascript が使用できます。この環境で打てるコマンドはすべて Mallet オブジェクトで変換され処理されるようになっているということです。裏側は意識しなくても、ganache-cli的にブロックチェーンとやり取りする際に使えるソフトウェアだと考えていいと思います。

アカウントの作成を行います。パスワードを設定してから作成したアカウントを使用するように selectAccount で指定します。 requestFunds() でコントラクトのデプロイに必要なトークンを入手できました。

HelloWorld.bin のバイトコードを使ってEKVMへコントラクトをデプロイします。ここら辺は面倒くさいですがTruffle Suiteが統合されると開発しやすくなるのではないでしょうか。トランザクションハッシュを詳細表示するとコントラクトのデプロイアドレスが確認できます。

最後にコントラクトアドレスの helloWorld 関数を呼ぶだけなのですが『Hellow, World!』がうまく表示されませんでした。ネットワークが悪いのか、コントラクトが正常にデプロイされていないのか、理由は分かりませんでしたがブロックエクスプローラーが欲しいところですね。

mallet> web3.toAscii(web3.eth.call({to: myContractAddress, data: '0xc605f76c'}))
''

ブロックエクスプローラーはあると書いてあるのですがうまく見つけられませんでした。どこにあるでしょう。分からなかったのでサポートリクエストを投げています。もしブロックエクスプローラーの場所が分かったらTwitterで投げておきます。[7]

※ KEVMのブロックエクスプローラーはここです。

Block Explorer

Ethereumのネットワークのガス代高騰やトランザクションの輻輳はEth1.0のスケーラビリティのなさを現実問題として露呈してしまったと思います。DeFiアプリもトランザクションコストが高いために、サービス利用が資金のある人に偏り特権的になっていると感じます。CardanoへのDappsの移植という動きも今後出てくるのではないでしょうか。

記事を作成するにあたり参考にしたYouTubeビデオです。

Introducing the KEVM — an Ethereum Virtual Machine for Cardano smart contract development

2020 October Cardano monthly update

EthereumのERC20トークンをCardanoブロックチェーンへマイグレーションする方法について解説されている箇所。

Cardano Architecture

まとめ

--

--

Yuya Sugano
Yuya Sugano

Written by Yuya Sugano

Cloud Architect and Blockchain Enthusiast, techflare.blog, Vinyl DJ, Backpacker. ブロックチェーン・クラウド(AWS/Azure)関連の記事をパブリッシュ。バックパッカーとしてユーラシア大陸を陸路横断するなど旅が趣味。

No responses yet