Web3.pyを使ってみた

仮想通貨のBotが儲かると聞いて、仮想通貨関連のプログラムも面白いかなーと興味が出てきてググっていましたが、何から手をつけていいやら・・・と途方に暮れていました。
一つWeb3.pyというのを見つけて僕でもできるかも!簡単そうだったので試してみました。公式サイト↓

以下の記事を参考にしました。


Web3.pyはPythonで実装されたイーサリアムにアクセスするクライアントサイドのツールです。Web3.jsというツールのPython版のようです。イーサリアム互換のBSC(バイナンススマートチェーン)とPolygonでも動作します。

参考サイトの①と②のソースコードをコピペして、自分のウォレットの残高確認と送金のプログラムを作ってみて、BSCとPolygonで一応動きました。

何か所か詰まったところがあったのでメモしておきます。

■環境設定

私はOSはWindows10でPyCharmを使っていますが、
pip install web3するときにVisualC++のライブライが必要と言われ、別途インストールしました。Microsoftのダウンロードサイト↓(の下の方のすべてのダウンロード)からBuild Tools for Visual Studio 2022というのをダウンロード、インストールしました。
https://visualstudio.microsoft.com/ja/downloads/

オプションでいろいろ選べましたが、Visual C++ 14.0 or graterなので特に古いのものを選ぶ必要はないと思います。

■チェックサムアドレス

web3.exceptions.InvalidAddress: ('Web3.py only accepts checksum addresses. The software that gave you this non-checksum address should be considered unsafe…

生のコントラクトアドレスだとエラーになって、toChecksumAddressというので変換しました。

BCOIN = "0x00e1656e45f18ec6747f5a8496fd39b50b38396d"
BCOIN = web3.toChecksumAddress(BCOIN)


■Polygonチェーンの場合

ポリゴンチェーンの場合はRPCに https://polygon-rpc.com/を使いました。

polygon_rpc = "https://polygon-rpc.com/"
web3 = Web3(Web3.HTTPProvider(polygon_rpc))

メタマスクにネットワークを追加するときに指定するRCPと同じやつです。参考↓

https://docs.polygon.technology/docs/develop/metamask/config-polygon-on-metamask/

■Polygon(2)  チェーンIDの指定 

あと、よくわからないエラーが出て、

ValueError: {'code': -32000, 'message': 'only replay-protected (EIP-155) transactions allowed over RPC'}

チェーンIDを指定したら動きました。

tx = {
        'nonce': nonce,
        'to': wallet_B,
        'value': web3.toWei(0.1, 'ether'),
        'gas': 25000, 
        'gasPrice': web3.toWei('500', 'gwei'), 
        'chainId': 137, #←チェーンIDを指定
    }

参考

https://zenn.dev/odan/scraps/05e73d3a2092a0

https://ethereum.stackexchange.com/questions/94412/valueerror-code-32000-message-only-replay-protected-eip-155-transac

■Polygon(3) ガス代高くて処理に失敗

あと、数日前からPolygonチェーンはSunflowerFarmersというゲームのせいで、ガス代が急騰しています。

https://polygonscan.com/gastracker?data=60 ↑ガス消費の半分をSFFが占め未だガス代が高止まり

参考サイトの①②までのシンプルな無料サンプルの場合、処理をチェーンに投げた後、結果を確認する処理がないので、その後のトランザクションが成功か失敗かを待たずにプログラムは正常終了します。

Pythonプログラムが正常終了した後、Polygonチェーン上で、トランザクションが完了しないと120秒ほど?でトランザクション失敗になります。それになる前にもう一度プログラムを実行すると

ValueError: {'code': -32000, 'message': 'already known'}

というエラーになります。まだPolygon側で処理をしているのに同じnounceで処理を依頼したというエラーのようです。参考↓

https://stackoverflow.com/questions/66059397/sendrawtransaction-return-hash-but-there-is-no-transaction

あと、ガス代の相場がよくわからなかったのですが、参考ページの解説にあったように、メタマスクで送金したときに表示されている値を参考に適当に入力しました。


ガス代通貨の送金はこんな感じでササっとかけましたが、別のトークンを送るやり方はもう少し複雑そう?です。
スマートコントラクトを書いてデプロイするみたいなのはSolidityを理解してHardhat、Truffleといったツールを使いこなす必要がある感じ?ですが、送金したりDEXでスワップといった処理をプログラム的に実行するのはWeb3.pyを少しいじるので出来そうな雰囲気です。もう少し使ってみまたいと思います。


この記事が気に入ったらサポートをしてみませんか?