NEO(ネオ)上でスマートコントラクトを実装してHello Worldを表示させてみよう!

今回は、Hello Worldをコンソール上に表示させることをゴールに実装していきたいと思います。

neo-pythonの環境構築がまだの人は下記のページで設定を済ませることをお勧めします。

NEOのスマートコントラクト実行までの流れ

実際の作業に入る前に簡単にスマートコントラクト実行までの流れを確認します。

【2月23日追記】neo-pythonのバージョンが更新されたため、一部表記を現行バージョンに合わせて書き換えました。

pythonでコードを書き、python-smart-contract-workshopフォルダに保存

buildコマンド

.pyファイルからavmファイルにコンパイル

deployコマンド

コントラクトをネットワークにデプロイ

invokeコマンド

コントラクトのメソッドの呼び出し

Hello Worldスマートコントラクトの内容

python-smart-contract-workshopのフォルダにすでに入っている1-print.pyをエディタを使って開いてみましょう。

def Main():
print("Hello World")

Hello Worldを表示させるだけの簡単なプログラムになります。

buildからinvokeまでの流れ

それでは、実際にbuildからinvokeまでのプロセスを追って行きましょう。まずは、Terminalを開いてneo-pythonを起動させましょう。

スマートコントラクトのプロセスのログを表示する設定にします。その後、walletを開けておきます。

neo> config sc-events on
Smart contract event logging is now enabled
neo> wallet open neo-privnet.wallet
[password]> ***
Opened wallet at neo-privnet.wallet

以下のbuildコマンドを実行すると、python-smart-contract-workshopフォルダに1-print.avmファイルが生成されていることを確認します。

neo> sc build 1-print.py
Saved output to 1-print.avm

次にコントラクトをネットワークにデプロイします。Contract Nameは、コントラクトを検索するときに必要になるので、HelloWorldと書いておきましょう。

neo> sc deploy 1-print.avm True False False '07' 01 '05'
Please fill out the following contract details:
[Contract Name] > HelloWorld
[Contract Version] >
[Contract Author] >
[Contract Email] >
[Contract Description] >
Creating smart contract....
Name: HelloWorld
Version:
Author:
Email:
Description:
Needs Storage: True
Needs Dynamic Invoke: False
Is Payable: False

ここで、最初の数字の07は、inputがstring型であるということを示しており、数字の05は、outputがbyte型であることを表しています。他には、True/FalseのBoolean型や非負の整数を表すInteger型などがあります。

データの型によって、inputとoutputの数字部分が変化することに注意してbuildする必要があります。詳細は公式ドキュメントを参照してください。

次のTrueは、そのコントラクトがストレージを必要としているか否か(needs_storage)を示すものになります。

そして、その次のFalseは、そのコントラクトが他のコントラクトを参照しているかどうか(needs_dynamic_invoke)を示します。したがって、ほとんどの場合は、Falseになります。

最後のFalseは、コントラクト内でNEOやNEOGas、他のトークンとの換金が行われるかを示す(is_payable)部分で、ICOなどをしない場合、ほとんどFalseになると思います。

walletのpassword(coz)を入力して、デプロイを完了させます。

デプロイが完了したら、次のコマンドでコントラクト情報を確認します。

neo> search contract HelloWorld

このとき、Contract Nameで検索をかけることで、先ほどのコントラクトの情報が見つかると思います。

ここで、ブロックに格納されているコントラクトのハッシュ値を見つけて、invokeします。

neo> sc invoke コントラクトハッシュ

すると、ログ上にHello Worldが表示されていることが確認できます。

password(coz)を入力することで、コントラクトのメソッドが実行されます。

以上で、NEO上でのスマートコントラクトのbuildからinvokeまでの流れが簡単に掴めたと思います。次回は、もう少し複雑なスマートコントラクトを動かしてみたいと思います。

参考文献