🐮
Web3.py をさわってみる
きっかけ
スマートコントラクトが使えるようになりたいけど、SolidityやJavaScriptが難しい。インフラエンジニアの自分は本格的な開発をやったことがないし、ある程度触れるのはpythonぐらい。
しかしさすが python。Web3.py というイーサリアムが操作できるライブラリがあるようだ。これを使えるようになれば、本格的なスマートコントラクトは無理としても、簡単なものであれば操作できるようになるかもしれない。
ということで Web3.py をさわってみることにした。
参考サイト
公式ドキュメント
ConsensysのBlog こつこつイーサリアムまとめ
インストール
$ 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
丁寧な説明ありがとうございます!!