PythonでWeb3.0のDAppsを作る(開発環境編 – Ganache)

最近Web3.0という単語を知り、そこからDAOという単語を知り、DAOで組織を作ってそこにアプリを組み込み、なにかサービスが作れないかなぁと模索を始めました。

まずはWeb3.0で動くアプリを作りたくなりました。Web3.0という世界にはいろいろ国があって、「イーサリアム国」だとそこで動くアプリが作れるみたいです。これをDAppsと呼ぶみたい。

で、“Web3.0”や“DApps”とかでググってみても、Web3.0とは?DAppsとは?的な、一般的な話しか出てこなかったり、詳しいページがでてきても聞き慣れない単語がうじゃこら出てきて理解できず、かなり苦戦しました。

また、DAppsを動かすためのインターフェースはだいたいWebページになり、一般的にはJavaScript(Node.js)を使うのですが、私の場合はPythonで動かそうとしています。その情報が少なくて苦労しました。ちなみにNode.jsだと動かせるレンタルサーバが少ない(もしくは高い)というのもネックです。

そんなわけで、この記事はWeb3.0やブロックチェーンまわりのことを全然知らない人が、DAppsを作ってPyshonで触れるようになるという視点で書きました。

将来的にはDAOで組織を作ってWeb3上でサービス展開できればいいなぁと思っておりますが、この記事ではあくまでDAppsを作る点に絞って書いています。

用語の整理

イーサリアム

仮想通貨の一種と思われているかもしれません。それも当たりなのですが、もう一つ、「アプリケーションのプラットフォーム」という面もあります。このイーサリアム上にアプリを置いて、いろいろなサービスを展開することができます。

また、アプリを作ったりアプリに仕事をさせたりした際、「ガス代」という運営コストがかかるのですが、その支払いに通貨としてのイーサリアムが使われます。アプリを使う側はサービス代を支払いますが、その支払いもイーサリアムです。なので、イーサリアム世界でのお金という面もあります。そのような世界に価値を見出してリアルマネーで投資するのが、仮想通貨取引ですね。

ちなみに、このお金の単位はETHと表します。

ブロックチェーン

ブロックチェーンとは、「取引履歴をがっちり管理し、正確な取引履歴を維持しようとする技術」です。イーサリアム上にあるアプリに信号を送り、信号を受けたアプリが何かをするのですが、そのやり取りをブロックチェーンでがっちり記録します。ブロックチェーンを使うと、改ざんなどの不正がしづらくなるそうです。

例えば、「AさんからBさんに100イーサ送ってあげて」という信号をイーサリアム上のアプリに送ったら、そのアプリがAさんの口座からBさんの口座に100イーサを移動させますが、その一連のやり取りをブロックチェーンで記録します。

スマートコントラクト / Solidity

イーサリアム上で動くアプリそのもののことです。これを作ることがすなわち「DAppsを作る」ことになります。

そのアプリを作るための言語がSolidityで、スマートコントラクトを書くための一般的な言語です。機械学習でいうPython、WebアプリでいうJavaScript、スマコンでいうSolidity、みたいな感じです。

Webアプリ / フロントエンドのアプリ

作ったスマートコントラクトに指示を出したり結果を受け取ったりするアプリのことです。

AさんからBさんに100イーサを送る場合、Web画面上に「(誰から?)Aさん」「(誰に?)Bさん」「(いくら?)100」と入力したら、その情報をスマートコントラクトに送りますが、そのWebサイトのことです。

ちなみに私はこれをPythonで作ろうとしています。

開発環境(必要なツール)

いろんなツールがあふれていて、これまた調べるのがしんどかった。。Node.js・npm・Metamask・Remix・Truffle・・・・などなど、結局何がいるのかがピンとこず、迷いました。

で、「開発環境でPythonからスマコンを動かす」ことだけに特化すると、以下のツールとなります。

Remix: Ethereum IDE

スマートコントラクトを作る環境です。が!Web上で作業できるので、インストール不要です。ココ(Remix: Ethereum IDE)に行くだけでOK♪

Ganache(ガナッシュ)

リアルな環境でスマートコントラクトを作ったり動かしたりすると、リアルなイーサリアムを支払うことになり、かなり痛いです。なので、自分のパソコン(ローカル環境)にイーサリアムの世界を再現してテスト環境を用意したいのですが、それをやってくれるのがガナッシュです。

公式サイト https://www.trufflesuite.com/ganacheよりダウンロードして、インストールしましょう。

インストールして立ち上げたら、以下のような画面が出るので、「QUICKSTART」をクリックしてください。

すると、以下のような画面が出てきます。

これでいったん準備OK。画面上部の「RPC Server」のアドレスは後々使います。(HTTP://127.0.0.1:7545 という箇所)

Python

フロントエンドとして使います。一般的にはNode.jsでWebアプリを作るんだと思いますが、それらは使いません。

ちなみに、以下のライブラリが必要になりますので、PIPで集めておきましょう。

pip3 install web3
pip3 install py-solc-x

<py-solc-x>はsolidityプログラムをコンパイルするために必要なのですが、Remixを使っているので、結局いらなかったです。

開発環境として必要なのは、これだけです!

開発環境での実装

いよいよプログラムです!まずは、PythonからGanache(Web3のローカルテスト環境)につないでみます。

Python -> Ganache接続

まず、Ganacheの上のほうに「RPC Serve」という欄があるので、そこのアドレスをコピーしてください。「http://127.0.0.1:7545」とかになっていると思います。

以下のプログラムの「HTTPProvider」の引数部分を、このアドレスに書き換えてください。

from web3 import Web3

# Ganache(Web3)につなぐ
w3 = Web3(Web3.HTTPProvider('HTTP://127.0.0.1:7545'))

# つながったかのチェック
w3.isConnected()

実行して「True」が帰ってきたら、成功です!
「False」が帰ってきたら失敗なので、ガナッシュのアドレスを再度チェックしてみてください。

残高確認

もうちょっと遊んでみましょう。以下のコードを追加してみてください。

# 1番目の人のアカウントIDを取得
id0 = w3.eth.accounts[0]
# その人の保有残高をチェック
w3.eth.getBalance(id0)

「100000000000000000000」って返ってきてますよね?「この人は100ETH持ってますよ」という意味です。0が多すぎて見づらい場合は、以下のように単位を指定することもできます。

w3.fromWei(w3.eth.getBalance(id0),"ether")

これで、“100”が帰ってくるようになりました。

送金

今度は、1人目から2人目にお金を移してあげましょう。そのコードを動かすためには、送信元(1人目)の秘密鍵が必要です。以下の画像のようにGanacheのカギマークを押して、PrivateKeyをコピーします。

秘密鍵をコピーしたら、Pythonに戻って以下のコードを実行しましょう。(まだ準備だけです)

# 送信元(1人目)のアカウント番号
account_from = w3.toChecksumAddress(w3.eth.accounts[0])
# 送信先(2人目)のアカウント番号
account_to   = w3.toChecksumAddress(w3.eth.accounts[1])

# 秘密鍵をセット
private_key = '***ここにコピーした秘密鍵をペースト***'

# そのアドレスから何回トランザクションが送られたか
nonce = w3.eth.getTransactionCount(account_from)
print(nonce)

# トランザクションを作成(「10ETH送ります」というトランザクション)
tran = {'nonce': nonce, 'to': account_to, 'value': w3.toWei(10, 'ether'), 'gas': 2000000, 'gasPrice': w3.toWei('50', 'gwei')}

# そのトランザクションに、自分のサインを入れる
signed_tran = w3.eth.account.signTransaction(tran, private_key)

あとは送信するだけ!まず、Ganacheに行って1人目と2人目のBALANCE(残高)を確認しておきましょう。確認したら、以下のコードを実行してみてください。

# トランザクションの実行
tran_hash = w3.eth.sendRawTransaction(signed_tran.rawTransaction)
w3.toHex(tran_hash)

実行した瞬間、Ganacheの残高がパッと変わったら、資金移動成功です!ちなみに10ETHって、円に換算すると200万円くらいです。なんかうらやましい。。

Solidityでスマートコントラクト作成

まだ残高確認とか資金移動とか、デフォルト機能を使っているだけで、自分で作ったスマコン(アプリ)を動かしていません。次は自分で作ったスマコンを動かします。

RemixというWebツールを使いますが、
プログラムを書く
 ↓
コンパイルする
 ↓
デプロイする
という流れです。

Solidityでスマコンを作る:プログラムを書く

まず、Remix開発環境に行き、File explorer→Create New Fileと押すと、その下に「ファイル名入れてね」的なスペースができるので、「Hello」と名前を入れましょう。(名前は何でもOKです)

右のほうに空ページが出てきていると思うので、そこに以下のHelloプログラムを貼り付けてください。

pragma solidity ^0.4.23;

contract HelloWorld {
  function get() public pure returns (string memory) {
    return "Hello World";
  }
}

<ちょっと脱線>
CriptoZombieって知ってますか?Solidityのプログラムをすごく丁寧に教えてくれるところで、めちゃくちゃおススメです。ぜひそこで勉強してみてください。

CriptoZombie

Solidityでスマコンを作る:コンパイルする

以下の画像のようにポチポチと押せば、コンパイル完了です。

Solidityでスマコンを作る:デプロイする

ここがちょっと厄介です。というのも、「どこにデプロイするか」を指定するのですが、そこが若干面倒です。

まず、ENVIRONMENTから、デプロイ先をGanache Providerにします。

ダイアログボックスが出てくるので、RPCアドレスを書き換えます。私の場合は、デフォルトだと「http://127.0.0.1:8545」になっていたので、7545に書き換えました。

接続先を選んだら、Deployというオレンジのボタンを押します。

これでGanache環境にデプロイできました。

またPythonに戻るのですが、「コントラクトのアドレス」と「ABI」の情報が必要になるので、以下の要領でコピペしておいてください。

コントラクトアドレス
Deploy画面の下のほうにあります。

ABI
コンパイル画面の下のほうに「Compilation Details」というボタンがあるので、それを押すとダイアログボックスが出てきて、ABI情報をコピーできます。

PythonからHelloに接続

以下のプログラムをPythonで書いてください。ポイントは「contractAddress」と「ABI」です。これら2つの変数に、Remixからコピペしておいた値を貼り付けます。

注意点はABIで、そのまま貼り付けて回すと「trueって変数は定義されてないよ」というエラーになります。なので、“true”を“True”と大文字に変えてあげてください。“false”も同様に変更しましょう。

Tabとかも入ってますが、そのままでOKです。

# ライブラリのインポート
from web3 import Web3

# 接続
w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:7545'))

contractAddress = '**********************'
abi = [
	{
		"constant": True, #手動でtrueからTrueに変更
		"inputs": [],
		"name": "get",
		"outputs": [
			{
				"name": "",
				"type": "string"
			}
		],
		"payable": False, #手動でfalseからFalseに変更
		"stateMutability": "view",
		"type": "function"
	}
]

# コントラクトオブジェクト生成
myhello = w3.eth.contract(address=contractAddress, abi=abi)

# 呼び出し
print(myhello.functions.get().call())

実行して、「Hello World」と帰ってきていれば、大成功です♪

この一連の作業で、

  • Solidityでスマートコントラクトを作成
  • Ganacheというテスト環境へスマコンをデプロイ
  • Pythonでそのスマコンを操作

ということができるようになりました。今回は「Hello World」という文字をスマコンからとってくるだけでしたが、今度はスマコンに値を書き込みます。

http://fxscore.com/2022/09/13/python%e3%81%a7%e3%82%b9%e3%83%9e%e3%83%bc%e3%83%88%e3%82%b3%e3%83%b3%e3%83%88%e3%83%a9%e3%82%af%e3%83%88-%e9%80%81%e4%bf%a1%e7%b7%a8/

今回のプログラムは、あくまでテスト環境なので、自分のパソコン内に閉じた話です。次は、世界に出ていこうと思います。まずはMetamaskを使ってテストネットワークで遊んでみて、それができたらいよいよリアルワールドに出ていこうと思います。

その際、リアルな仮想通貨(なんか変)を使うことになるので、まずは仮想通貨買っとかなきゃ。。。

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA