🐮

Web3.py をさわってみる

2022/02/17に公開約2,800字

きっかけ

スマートコントラクトが使えるようになりたいけど、SolidityやJavaScriptが難しい。インフラエンジニアの自分は本格的な開発をやったことがないし、ある程度触れるのはpythonぐらい。

しかしさすが python。Web3.py というイーサリアムが操作できるライブラリがあるようだ。これを使えるようになれば、本格的なスマートコントラクトは無理としても、簡単なものであれば操作できるようになるかもしれない。

ということで Web3.py をさわってみることにした。

参考サイト

公式ドキュメント

https://web3py.readthedocs.io/en/stable/index.html
ConsensysのBlog
https://consensys.net/blog/developers/how-to-send-money-using-python-a-web3-py-tutorial/
こつこつイーサリアム
https://k2k2-ethereum.com/programming/python/248/

まとめ

インストール

$ pip install web3

コマンド一覧

ライブラリのインポート

>>> from web3 import Web3

HTTPでローカルに接続

>>> w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))

接続確認

>>> w3.isConnected()
最新のブロックを取得
>>> w3.eth.getBlock('latest')

任意のブロックを取得

>>> w3.eth.getBlock('1450')

Coinbase アドレスの取得

>>> w3.eth.coinbase
'0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73'

ETH残高の取得

>>> w3.eth.getBalance('0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73')
35322435083000000000000

ローカル環境での検証

手元の環境で Hyperledger Besu を動かして、Web3.py を使って色々と基本的な操作を試してみる。

Besuの準備

Besuのインストールなどは別記事にまとめる予定。

Basuの起動

$ bin/besu --network=dev --miner-enabled --miner-coinbase=0xfe3b557e8fb62b89f4916b721be55ceb828dbd73 --rpc-http-cors-origins="all" --host-allowlist="*" --rpc-ws-enabled --rpc-http-enabled --data-path=/tmp/tmpDatdir

事前準備

pythonコマンドラインでの操作

送金ぐらいであればスクリプトを書くまでも無いので pythonの CLIでやってみる。

ライブラリのインポート
>>> from web3 import Web3
HTTPでBasuに接続
>>> w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))

w3という名前のWeb3オブジェクトを作る

接続確認
>>> w3.isConnected()
True

とりあえず送金

CoinbaseアドレスからMetamaskで作成したローカルアドレスへ送金テストを行う。

アドレス設定
>>> account_0 = w3.toChecksumAddress('0xfe3b557e8fb62b89f4916b721be55ceb828dbd73')
>>> account_1 = w3.toChecksumAddress('0xf44d441c1Cc703D45d91F409437efAbAbC38a164')

単にアドレスを代入するだけでは駄目で、w3.toChecksumAddress() を使わないとエラーが出た。

account_0 の秘密鍵をセット
>>> private_key = '0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63'

秘密鍵はそのまま入れればよいようだ。

nonce のセット
>>> nonce = w3.eth.getTransactionCount(account_0)

nonce はそのアカウントの実行済みトランザクション数ということか。

トランザクションの作成
>>> tx = {'nonce': nonce, 'to': account_1, 'value': web3.toWei(2000, 'ether'), 'gas': 2000000, 'gasPrice': web3.toWei('50', 'gwei')}

2000ETHをaccmount_0からaccount_1に送るためのトランザクションを作成する。送信先の指定だけで、送信元の指定は特にいらないようだ。

>>> signed_tx = w3.eth.account.signTransaction(tx, private_key)

account_0の秘密鍵でトランザクションを署名する。

トランザクションの送信
>>> tx_hash = w3.eth.sendRawTransaction(signed_tx.rawTransaction)

署名したトランザクションを送り、結果を得る。

トランザクションIDの取得
>>> w3.toHex(tx_hash)
'0xf0327eb8d40385bf614292c686e15c0709844c9ae981cefe6f4e9590a124bc6a'

Metamaskを見てみると 2000ETHが送金されていた!うらやましい!

コマンドラインでの送金の確認
>>> w3.fromWei(w3.eth.getBalance(account_1),"ether")

ということで、送金ができたので一旦ここまで。やはりPythonはいいですね!

Discussion

ログインするとコメントできます