villagerHの日記

勉強したことや苦労した事などを書き綴ります

Truffleで生成したjsonからcontractへの接続

ちょっと時間が空きましたが前回の続きです。

villagerh.hatenablog.com

タイトルにある通りですがTruffleでブロックチェーン上にデプロイした際に生成されるjsonからcontractへの接続が無事にできました!のでまとめておきます。


とりあえず最初に接続までできたものをそのまま貼り付けます。

from web3 import Web3,HTTPProvider
import json

f = open("UnitFactory.json", 'r')
json_data = json.load(f)
abi = json_data["abi"]
address = json_data["networks"]["5777"]["address"]

web3 = Web3(HTTPProvider("http://127.0.0.1:7545"))
UnitFactory = web3.eth.contract(address=address, abi=abi)

unit_num = UnitFactory.functions.getUnitNum().call()
print("unit_num: " + str(unit_num))

pythonに慣れていないためおかしな部分があったら申し訳ありません;;;



簡単に解説です。

f = open("UnitFactory.json", 'r')
json_data = json.load(f)
abi = json_data["abi"]
address = json_data["networks"]["5777"]["address"]

truffleでmigrateしたときのjsonデータを読み込んでいます。
前回までは読み込んだjsonをcontractのインスタンス生成時にそのまま投げればいいものかと思っていましたがちゃんとabiとaddressに分けてやらないとだめみたいです。

address = json_data["networks"]["5777"]["address"]

アドレスはデプロイ時に発行されるので直接貼り付けてもよいのですが、ローカル環境だと毎回デプロイする度にアドレスが変わってしまうのでjsonの方から取得しています。
"5777"はネットワークIDです。
Ganacheを使用してローカルブロックチェーンを生成している場合はGanacheのGUIに表示されています。

web3 = Web3(HTTPProvider("http://127.0.0.1:7545"))
UnitFactory = web3.eth.contract(address=address, abi=abi)

unit_num = UnitFactory.functions.getUnitNum().call()

先ほど用意したaddressとabiを指定してコントラクトへ接続します。
ここまでできればあとはコントラクトのメソッドを呼び出してやればOKです!


というわけでweb3.pyを使用してコントラクトへの接続ができました。

あとはブラウザと違いMetaMaskがない状況なのでアカウントの管理をどうすればいいのかなーといったところですね。