前回の記事では、Metamask経由でHello Worldを呼び出しました。
これは「Hello World」という文字をスマコンから引っ張ってきてるだけです。次は、トランザクションを作ってスマコンに値を書き込みましょう。といっても、「Pythonでスマートコントラクト-送信編」でやったやり方とほぼ一緒です。違う点は、Remixでのデプロイ先をRinkebyにすることと、infura経由で接続するところです。
スマコンを作る
以下のプログラムを、Remixで作りましょう。「Pythonでスマートコントラクト-送信編」にあるものと全く一緒です。ABI・Bytecodeを使いますので、メモ帳に貼り付けておきましょう。
pragma solidity >=0.4.0 <0.8.0;
contract aisatsu {
string public message;
constructor() public {
message = 'Ohayou';
}
function set_aisatsu(string memory _message) public {
message = _message;
}
function get_aisatsu() view public returns (string memory) {
return message;
}
}
Rinkebyへデプロイ
コンパイルが終わったら、デプロイ画面でEnvironmentをWallet Connectにして、Metamaskの接続先をRinkebyテストネットワークにし、デプロイです。前回の記事と全く一緒の作業手順です。
Python部分
ここも、前回の記事と構成は一緒です。
まず接続部分。
from web3 import Web3
# Rinkebyにつなぐ
w3 = Web3(Web3.HTTPProvider('***infura.ioからRinkebyテストネットワークのアドレスをコピペ***')) #Rinkeby
# つながったかのチェック
print(w3.isConnected())
次に、接続情報のセット。トランザクションを作成するので、秘密鍵やBytecodeなども必要です。詳しくは「Pythonでスマートコントラクト-送信編」を。
# 各種情報
contractAddress = '***コントラクトID***'
abi = \
ABI情報を貼り付け(true/falseの書き換え忘れずに)
bc = \
Bytecode情報を貼り付け
private_key = '***MetamaskからPrivate Keyをコピペ***'
# MetamaskアカウントID
acc = w3.toChecksumAddress('***MetamaskからアカウントIDをコピペ***')
一旦デフォルト値を呼び出して確認。保有残高も減りません。
# コントラクトオブジェクト生成
oha = w3.eth.contract(address=contractAddress, abi=abi, bytecode=bc['object'])
# トランザクション発行前の保有残高
print(w3.fromWei(w3.eth.getBalance(acc),"ether"))
# デフォルト設定値を呼び出して確認
print(oha.functions.get_aisatsu().call())
# トランザクション発行後の保有残高→減ってません
print(w3.fromWei(w3.eth.getBalance(acc),"ether"))
値のセット。今回の肝。残高もしっかり減ります♪
# トランザクション作成
tx = oha.functions.set_aisatsu('Yahho-----').buildTransaction( {
"gasPrice": w3.eth.gas_price,
"from": acc,
"nonce": w3.eth.getTransactionCount(acc),
})
# サイン
signed_tx = w3.eth.account.signTransaction(tx, private_key)
# トランザクション発行前の保有残高
print(w3.fromWei(w3.eth.getBalance(acc),"ether"))
# トランザクションの送信
tx_hash = w3.eth.sendRawTransaction(signed_tx.rawTransaction)
tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash)
# トランザクション発行後の保有残高
print(w3.fromWei(w3.eth.getBalance(acc),"ether"))
ちゃんと書き換わったか確認。
# 書き込んだメッセージを取得
print(oha.functions.get_aisatsu().call())
というわけで、問題なく書き込み&読み込みができました。