Pythonでスマートコントラクト – Metamask編

前回の記事ではGanacheを使ってスマコンを操作しました。

http://fxscore.com/2022/09/12/376/

これだと、家の中でわちゃわちゃやってるだけですよね。ということで、次は、Metamaskを使って、テスト環境だけどインターネットワールドに出て行ってみましょう。

新たに使用するもの

  • Metamask
  • infura.io

の2つです。

Metamask

まずはMetamaskを準備しましょう。いろいろと記事が出ていると思いますが、私は以下の記事が一番わかりやすかったです。

https://dev.classmethod.jp/articles/aragon-dao-metamask/

このサイトではRinkebyのイーサリアム調達方法を教えてくれますが、Ropstenのイーサが欲しい場合は、 https://faucet.egorfine.com/ に行って、MetamaskのAccount番号を入力するだけです。しかも太っ腹に10ETHくれます♪

infura.io

イーサリアムネットワークに接続する際、標準はGethというツールを使うらしいのですが、パソコンへの負担がハンパないし、そもそもうまく接続できませんでした。このinfura.ioというサイトは、インターネット版Gethみたいなもので、イーサリアムネットワークにつなぐための関所みたいな役割をしてくれます。ホスティングサービスって言うみたいです。

単なる関所なので、プログラムを置いたり何かを動かしたりなんてすることはありません。プロジェクトを作り(=関所を立てる)、そこを経由してイーサリアムに入り込みます。

↓このサイトがインストール方法がわかりやすかったです。
https://24karamawariken.gitbook.io/ethereum-solidity/solidity-programming/ttakontorakutawotesutonettowkudesuru

アカウント登録してプロジェクトを新規作成して立ち上げたら、トップ画面に以下のようなところがあると思います。ここの「MAINNET」をクリックして、「Rinkeby」に変更しましょう。アドレス部分が「https://rinkeby.infura.io/v3/****」に変わると思うので、そのアドレスをコピーしておいてください。

いったんPythonで接続できるか試してみましょう。以下のコードをPythonで流してみて、「True」が返ってくれば成功です。

from web3 import Web3

# Rinkebyにつなぐ
w3 = Web3(Web3.HTTPProvider('***コピーしたRinkebyのアドレス***')) #Rinkeby

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

これで準備完了です!

スマコンの作成

いつものようにRemixでスマコンを作りますが、前回と違うのは、「Metamask経由でRinkebyテストネットワークにデプロイする」点です。デプロイ先が前回と違います。

まずは、いつものHello Worldをコンパイルしてください。(コンパイルの仕方などは、過去の記事をご参考に)

ABIも使いますので、こぴっておきましょう。

pragma solidity ^0.4.23;

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

さてポイントのデプロイです。デプロイ画面のEnvironmentから「Wallet Connect」を選択すると、画面の真ん中にいろいろなウォレットが出てくると思うので、そこからMetamaskをクリックしてください。

Metamaskを選択すると、以下のような画面に切り替わると思います。アドレスの部分には自動でMetamaskのアカウントIDが入ってるはずです。もし赤枠で囲っているところが「Rinkeby」になっていない場合は、Metamaskを開いて「Rinkebyテストネットワーク」に切り替えてください。Metamaskを切り替えたら、Remixのほうも自動で切り替わるはずです。

これで準備完了です。「Deploy」をクリック!すると、Metamaskの画面がポップアップして、「カス代払うけど、いい?」と聞いてきます。リアルマネーじゃないので気軽に「確認」ボタンを押しましょう。ちなみに、万が一MetamaskにETHなどのリアルマネーを入れていて、接続ネットワークをメインネットにしていたら、リアルマネーが差っ引かれます!ご注意ください。あくまでテストネットワークでテストしましょう。

これで、デプロイできてついでにデプロイ料としてガス代も差っ引かれました。10秒くらいすると、Metamaskから通知ボックスに「無事デプロイできました」という通知が入ります。

デプロイが完了したら、コントラクトIDもこぴっておきましょう。

PythonからHello Worldを呼び出し

あとは、以下のような感じでHelloWorldで自作した「get」関数を呼び出しましょう。前回Canacheで接続したときと全く一緒の内容です。

contractAddress = 'コントラクトID'
abi = abiをコピペ

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

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

Hello Worldという文字が返ってくれば成功です。

Metamask・infuraという超絶便利なサービスができてるおかげで、すごく簡単に実装できました。

次は、Metamask経由で値の書き込みもやってみたいと思います。

コメントを残す

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

CAPTCHA