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

前回の記事では、Metamask経由でHello Worldを呼び出しました。

http://fxscore.com/2022/09/14/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-metamask%e7%b7%a8/

これは「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())

というわけで、問題なく書き込み&読み込みができました。

コメントを残す

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

CAPTCHA