Ontologyを用いたスマートコントラクト開発 vol1.5 : 2018/11時点のツールチェイン

こんにちは。エンジニアの@moonty_salです。普段はblockchain.tokyoで海外プロジェクトが来日した際に簡単な通訳をしたり、スマートコントラクト開発者を増やすためにスマートコントラクト開発ハンズオンを行ったり、各種Token Standardの調査やコントラクトの開発などを行っています。

本記事ではvol.1を投稿した後に正式にリリースされた便利なツール群やサンプル集を紹介します。開発者向けのツールチェインが出揃い、かなりスムースにスマートコントラクトの開発とデバッグが出来るようになりました(これまでの苦労は…)

スマートコントラクトに触れたことがない方には、簡単にPythonでコントラクトを書いてデプロイする方法を知ることができ、一回でもOntologyを触れたことがある方は、最近リリースされた各種ツールについて知ることが出来るように記載しています。

新しい開発ツールチェイン概略

Ethereumのツールチェインと比較すると下図のようになります。

  • Punica Suite (EthereumでいうTruffle + Sample Code集)
  • SmartX IDE (EthereumでいうRemix
  • Solochain (EthereumでいうGanache)
  • VS Code + Ontology Plugin (Online IDEと同等の機能を提供)
  • その他 dAPI.js (web3.js) etc …

Punicaはザクロ科の植物だそうです。

また、前回の記事でも紹介したOEP-4 / OEP-5というToken Standardがありますが、そちらの公式なサンプルコードが改めて整理され 、Python / TypeScriptで書かれたものがそれぞれ公開されています。

それでは、ここから各種ツールの説明をしていきたいと思います。

開発環境が手元にない方でも、下記を順になぞることでOntology上で独自トークンを発行できる環境をセットアップできます。

Solochain

solochainはローカルで動作する開発用のチェーンです。GUIから

  • 生成されたブロック
  • ブロックに含まれるトランザクション
  • 発行されたイベント
  • デプロイされているコントラクトの状態
  • デフォルトで用意された開発アカウント(5つ)の利用

が可能です。

solochainの動作

インストール方法

  1. solochainのGithubにアクセス
  2. Macの方はdmgをWindowsの方はexeをダウンロード(Linuxの方はソースコードをダウンロードしてbuildしてください)
  3. 2でダウンロードしたファイルを実行しインストール(windowの方は右クリックで「管理者として実行」を行ってください

3で結構強い権限を要求されるので驚く方もいるかもしれません…(権限を弱めてくれるように開発者に問い合わせ中です)

初期設定(ローカルのONT/ONGトークンのredeem)

  1. 右の歯車アイコンの下辺りに”start”ボタンがあるのでクリックしてノードを起動(何か問題がある場合はエラーになります
  2. Accountsタブに移動して上から1つ目のアドレスのRedeem ONGをクリック -> success と表示されるのを確認する
  3. 1つ目のアカウントのONT/ONGの残高が増えていることを確認する
start -> redeem ONGまで

これでsolochainの立ち上げは完了です。後々開発に利用してみましょう。

Cyano Wallet

vol.1でも解説を行ったBrowser Walletです。EthereumにおけるMetamaskに対応します。Chrome Web Storeからダウンロードが可能です。

インストール後はChrome上でアイコンを押すと起動します。立ち上げたcyano walletのアドレスに、後でコントラクトのデプロイや関数の実行に利用するONGトークンを送信しておきましょう。

手順

  1. New Identityをクリック -> passwordの設定を行って立ち上げる
  2. トップ画面から`Receive Funds`をクリックしcyano walletのアドレスを表示させる
  3. solochain上のONG/ONT残高を持っているアカウントからCyano walletへtransfer (トークンをONGを指定するのを忘れずに)
  4. 残高が増えていることをCyano Wallet上で確認

SmartX (Online IDE)

SmartXはOnline IDEです。smartx.ont.ioへアクセスしてログインすることで利用できます。ログイン方法は

  • Github Login (やたらと強い権限を要求してくるので困りモノ)
  • wallet.dat(手元のウォレットのファイル) + passwordでログイン

の2つがあり、Githubの権限については、Discordのチャンネルで問い合わせた所

wangdashuang
@moonty_sal Hi,we will have a community version smartx which does not require login. It will be released soon.

とのことなので、そのうちログイン無しで使えるようになります。

Github Loginしたくない方はCyano WalletからExport Walletを下記のように

行うことで`wallet.dat`ファイルがダウンロードされますのでSmartX側で次のように読み込んでログインします(walletファイルの内容をサーバ側に送信してはいなさそうだし…何のためのログインなのかは謎です笑)

以上がおわったら、Cyano WalletをPrivate networkに接続して(歯車マークをクリックすると設定可能です)Hello Worldをsolochainのネットワークにデプロイしてみましょう。接続する時ポートを指定する必要はないので、http://127.0.0.1 等を指定しましょう。Cyano Walletの右下の電源プラグのようなアイコンが電源プラグのような見た目になっていれば成功です。

手順

  1. SmartXでCreate Projectを実行
  2. Pythonを選択してテンプレートからhello worldを選択
  3. compileボタンをクリックしてバイトコードの生成を確認

3.で生成されるのはOntologyのブロックチェーンのVM上で動作するバイトコードです。C#やTypeScriptやPythonで記述されたOntology上のスマートコントラクトは、一度バイトコードに変換されてデプロイされます。

SmartXのサンプルコードは少し古いので、下記のようにLog関数をNotify関数に書き換えてください(イベントを発行する関数です)

def Hello(msg):
Notify(msg)
return True

deployのタブに遷移してdeployに必要な情報(適当な値で大丈夫)を入力してdeployボタンをクリックするとCyano walletが立ち上がります。トランザクションの実行をConfirmしてトランザクションを実行すると、コントラクトがデプロイされます。

compile -> deploy

deployのトランザクションはsolochain上で確認することができます。

hello関数をSmartX側から実行するとLogが吐き出されますが、こちらもsolochainで確認することができます。また、Ontologyのスマートコントラクトのアドレスはソースコードを与えると一意に生成される仕組みになっているので、同じソースコードのコントラクトのアドレスは同じになります(!!)SmartX上でCompileを実行すると contract hash なるものが生成されていると思いますが、そちらがコントラクトのアドレスです。さて、solochain上では、下記のようにEventを確認することができます。

solochain側に表示されているContract AddressがSmartX側に表示されているcontract hashと一致していることを確認できるかと思います。また、Statesというキーに、発行したイベントの中身が入っています。

今回はHello関数に sample という値を渡しており、solochain上での表示は `73616d706c65` となっています。これは16進エンコードされた値がOntologyのノードに格納されるためなので SmartXに内包されているConverter もしくは こちらのウェブサイトで変換します。

上記のような感じでSmartX+solochainで開発を進めていくことができます。

Punica (Sample Code + CLI)

最後にpunicaについて紹介します。PunicaはCLI + Punica Boxというサンプルコード集から成り立っています。またtext + videoのチュートリアルも公開されているようです。公式の紹介記事(英語)に詳しくは載っています。サンプルコード集は

後者のサンプルコードをコピーして利用することで、vol.1で紹介したような独自トークンの発行を行うことができます。

下記 CLIの使い方を簡単に紹介します。TypeScript用のCLIもありますが、本記事ではPython用のCLIを扱います。

punica initまで

> pip install punica # Python 3.6.x系
> mkdir punica_sample
> cd punica_sample
> punica init
> ls
LICENSE README.md contracts/ punica-config.json src/ test/ wallet/

compile

> punica compile # contracts下のコントラクトがコンパイルされる
> ls contracts
build/ default-config.json hello_ontology.py
> ls contracts/build # abiとavmが吐き出されているのを確認
hello_ontology.avm hello_ontology_abi.json

deploy

solochanが起動していればdeployまでそのまま行えます。

% punica deploy                                                                                                                                                                         
Using network 'privateNet'.
Running deployment: hello_ontology.avm
Deploying...
Deploy to: cb9f3b7c6fb1cf2c13a40637c189bdd066a272b4
Deploy successful to network...
Contract address is cb9f3b7c6fb1cf2c13a40637c189bdd066a272b4
Txhash is cfcf621124e8a878ab9dc85fbab037e103ab194ed28e3dcbed47c136724f8612

Ethreumのtruffle的な使い方ができそうですね。試しにチュートリアルに付属するサンプルコード集からサンプルコードを落としてきてOEP-4をdeployしてみましょう。

> wget https://raw.githubusercontent.com/ONT-Avocados/python-template/master/OEP4Sample/OEP4Sample.py
> mv OEP4Sample.py contracts/hello_ontology.py
> mv contracts/hello_ontology.py contracts/sample_token.py

例によってソースコードが同一だとアドレスが衝突してデプロイできないので、sample_token.pyを開いて、トークン名などをよしなに編集してください。

# 現バージョンだとcompile時にbuildを上書きしないようなので
> rm -rf contracts/build
> punica compile
Compile
Compile sample_token.py
Compiled, Thank you
> punica deploy
Using network 'privateNet'.
Running deployment: sample_token.avm
Deploying...
Deploy to: cb9f3b7c6fb1cf2c13a40637c189bdd066a272b4
Deploy successful to network...
Contract address is cb9f3b7c6fb1cf2c13a40637c189bdd066a272b4

invoke

(注)関数のinvokeも出来ると記載がありますが、現段階ではエラーになるかもしれません

> punica invoke list
> punica invoke --functions init

その他機能

scpm というパッケージマネージャやノードを立ち上げる機能ウォレットの管理をする機能など含まれているようです(未リリースのものもあります。今後リリース予定だそうです。

> punica                                                                          
Usage: punica [OPTIONS] COMMAND [ARGS]...
Options:
-p, --project PATH Specify a punica project directory.
-v, --version Show the version and exit.
-h, --help Show this message and exit.
Commands:
compile Compile the specified contracts to avm and...
deploy Deploys the specified contracts to specified...
init Initialize new and empty Ontology DApp...
invoke Invoke the function list in default-config or...
node Ontology Blockchain private net in test mode.
scpm Smart contract package manager,support...
smartx Ontology smart contract IDE,SmartX...
test Unit test with specified smart contract
tool Data format conversion tool
unbox Download a Punica Box, a pre-built Ontology...
wallet Manager your ontid, account, asset.

VSCodeとの連携

最後に簡単にVSCodeとのインテグレーションを紹介します。SmartXと同等の機能をVSCodeから使うことができます。punica init したディレクトリでVSCodeを立ち上げ、OntologyのVSCodeプラグインをインストールしてください。

contractsのhello_ontology.pyを開いてCtrl+ClickするとCompile SmartContractというメニューが立ち上がります。

build下にcompileの成果物が生成されます。

また、`build/hello_ontology.avm`上で Ctrl+Clickをするとデプロイのメニューが出ます。必要事項の入力 -> アドレスの選択 -> パスワードの要求をされるので(ローカルであれば)適当に入力します。

パスワードに関しては、punica initをする際に生成されるサンプルアカウントを利用することができ、デフォルトのパスワードは password になっています。この辺りの設定は contracts/default-config.json で確認することができ、編集も行えます。

また、ソースコードを選択した状態で「アウトライン」「Smart Contract Method」のタブを開くと、そこからコントラクトの関数を実行することもできます。トランザクションを発行しない(ノードに何かしらのデータを書き込まない)場合はpre-execにチェックをいれれば、ただ単純に実行結果を確認することができます。

他にも、各種ログがVScode上のコンソールに出力される機能などがあります。

終わりに

新しくOntologyが開発した各種ツールチェインを紹介しました。Ethereumの各種ツールに似せてきていることもあり、結構使いやすいのではないかというのがフラットな感想です(たまにバグがありますが笑)特にVSCodeとのインテグレーションの出来がいいなと感じます。

長くなるので本記事ではdAPI.jsの説明は割愛しました。こちらは次の記事でご紹介したいと思います。

Ontologyは12月に賞金総額100万円のハッカソンを開催します。ぜひお申込みください(定員が満員になっている場合もTwitterで僕の方にメッセージくれれば、なんとか出来るかも…しれないです笑)

また各種質問などあれば、OntologyのDiscordの日本語チャンネルや#tokyo-workshopチャンネルで聞いていただければ、答えられる範囲でお答えします。

LayerXではEthereumに限らず各種ブロックチェーンプラットフォームでも開発や調査を行っており、ブロックチェーンの全領域にチャレンジするエンジニアを募集しています。ご興味ある方はまずランチからでも。ぜひお声がけください(下記リンクから「話を聞きに行きたい」をポチっとしていただけると幸いですmm)