トランザクションを発行するBot作成の道のり その⑤~プログラムからのコントラクト実行~
はじめに
前回からの続き。
前回はイーサリアムチェーンのローカル環境である「Ganache」を導入しローカル環境でGanacheをつかってコントラクト・コードをデプロイして実行しました。
今回はいよいよPythonのプログラムからデプロイしたコントラクト・コードを実行してみます。
事前準備
プログラミングをする前に、必要なものを整理します。
トランザクションを送信する際に必要なものがいくつかあります。
それぞれ準備していきます。
HTTPProviderにJSON-RPCを実行するためのノードのURL
GanacheのRPC SERVERがノードのURLとなります。
![](https://assets.st-note.com/img/1674470759219-K2y1B1s9rT.png?width=1200)
「Contract」アカウントのアドレス
RemixでDeployした後にDeployed Contractsから取得することができます。
![](https://assets.st-note.com/img/1674469336607-0TIJ4w2KZM.png)
ABI (Application Binary Interface)
こちらはRemixでコンパイルした際に取得できます。
![](https://assets.st-note.com/img/1674469297262-BdDfHqXb9n.png)
ウォレットアドレスと秘密鍵
今回実行するのはWrite系のコントラクトであるため、実行するウォレットと秘密鍵が必要です。
NFTをミントする場合にMetaMaskを利用するように、プログラミングから実行する際もどのアカウントから実行するかを示す情報が必要となります。
Ganacheではアカウントが作成されるのでこれを利用します。
鍵マークをクリックするとアカウントアドレスと秘密鍵が表示されるのでこれを利用します。
![](https://assets.st-note.com/img/1674470153486-H6sK93Vnmr.png?width=1200)
![](https://assets.st-note.com/img/1674470145092-jynU3BA8AF.png?width=1200)
プログラミングと実行
基本的な流れは、②のRead系のトランザクション実行と同様ですが、Write系の場合は異なる点があります。
まず、ウォレットアドレスと秘密鍵を使用しています。
そして、Write系の場合はトランザクション実行にガス代が必要となります。
contract.functions.store(123456789).buildTransaction
でガス代とnonceを設定してトランザクションの情報を作成しています。
その後
web3.eth.sendRawTransaction(signed_txn.rawTransaction)
でトランザクションを実行するという流れになります。
from web3 import Web3
# ABI
abi = '''
ABIは省略
'''
# コントラクトアドレス
contract = "0x66889816099e6756F4e45b4BAe7CB38d87cC9bEc"
# RPCのURL
web3 = Web3(Web3.HTTPProvider("http://127.0.0.1:7545")) # Ganache上のRPC-SERVER
isConnected = web3.isConnected()
# 確認したい対象のウォレットアドレス
accountAddress = "0xcF56Fef51340e28248e1aCd2E574cB47b31EABa4"
privateKey = "a63e75ab6085c987034bfa326614f9e30a57ab925719fca9e999f8a51d2bae13"
if isConnected:
contract = web3.eth.contract(address=contract, abi=abi)
# retrieveで現在の値を取得する
print("初期値:retrieve : {}".format(contract.functions.retrieve().call()))
# storeを呼び出す
txn = contract.functions.store(123456789).buildTransaction({
'gas': 70000,
'gasPrice': web3.toWei('1', 'gwei'),
'from': accountAddress,
'nonce' : web3.eth.getTransactionCount(accountAddress),
})
signed_txn = web3.eth.account.signTransaction(txn, private_key=privateKey)
web3.eth.sendRawTransaction(signed_txn.rawTransaction)
print("変更後:retrieve : {}".format(contract.functions.retrieve().call()))
実行すると以下の結果となります。
storeする前に100だった値が、store実行後に値が変化していることが分かります。
初期値:retrieve : 100
変更後:retrieve : 123456789
細かいところ省略しながらでしたが、ここまででPythonを利用してブロックチェーン上のスマートコントラクトにトランザクションのリクエストを送信するところまでが一通り実施できました。
次回はより実用的なトランザクションを実行するため、実在のコントラクトを利用して実行するまでを行っていきます。
今回も参考にさせていただいたサイトはこちらです。
https://qiita.com/abenben/items/e8b12b183de59b781283