[Python] web3.py
最近Crypt(暗号資産)に触れることが多きなってきたので、凡ミスを減らす為にも少し学ぶことにした。
後からどんどん追加していこう。
[公式リファレンス]
ライブラリーのインストール
pip3 install web3
RPC接続
from web3 import Web3, HTTPProvider
from web3.middleware import geth_poa_middleware
# RPCに接続
web3 = Web3(Web3.HTTPProvider('https://rpc-mainnet.maticvigil.com/'))
# レイヤー2のブロックチェーンを使用する場合( BSCやPolygon )
web3.middleware_onion.inject(geth_poa_middleware, layer=0)
RPC接続確認
from web3 import Web3, HTTPProvider
from web3.middleware import geth_poa_middleware
# RPCに接続
web3 = Web3(Web3.HTTPProvider('https://rpc-mainnet.maticvigil.com/'))
# レイヤー2のブロックチェーンを使用する場合( BSCやPolygon )
web3.middleware_onion.inject(geth_poa_middleware, layer=0)
# 接続確認
connectResult = web3.isConnected()
print(connectResult)
True
補足
# RPCに接続
web3 = Web3(Web3.HTTPProvider('https://rpc-mainnet.maticvigil.com/'))
ここのエンドポイントは「有効な値」であればなんでもOKです。
ブロックを取得
from web3 import Web3, HTTPProvider
from web3.middleware import geth_poa_middleware
# RPCに接続
web3 = Web3(Web3.HTTPProvider('https://rpc-mainnet.maticvigil.com/'))
# レイヤー2のブロックチェーンを使用する場合( BSCやPolygon )
web3.middleware_onion.inject(geth_poa_middleware, layer=0)
# ブロックを取得
blockValue = web3.eth.get_block(web3.eth.block_number)
print(blockValue)
AttributeDict(
{
'baseFeePerGas': 271390,
'difficulty': 22,
'proofOfAuthorityData': HexBytes('0xd682021083626f7288676f312e31382e31856c696e757800000000000000000000856730088a5c3191bd26eb482e45229555ce57000000000000000000000000000000000000000100b69ba135b496b7f17fdfcd50d48b86bb397be6000000000000000000000000000000000000000102f70172f7f490653665c9bfac0666147c8af1f50000000000000000000000000000000000000001127685d6dd6683085da4b6a041efcef1681e5c9c000000000000000000000000000000000000000626c80cc193b27d73d2c40943acec77f4da2c5bd8000000000000000000000000000000000000000346a3a41bd932244dd08186e4c19f1a7e48cbcdf400000000000000000000000000000000000000025b106f49f30620a07b4fbdcebb1e08b70499c851000000000000000000000000000000000000000167b94473d81d0cd00849d563c94d0432ac988b49000000000000000000000000000000000000000a7c7379531b2aee82e4ca06d4175d13b9cbeafd49000000000000000000000000000000000000000490b11143a0cb64e067402307bc7f2276dcec82500000000000000000000000000000000000000001959c65b72147faf3450d8b50a0de57e72ffc5e0d00000000000000000000000000000000000000019ead03f7136fc6b4bdb0780b00a1c14ae5a8b6d00000000000000000000000000000000000000002b2dd091ea6e591d62f565d7a18ce2a7640add2270000000000000000000000000000000000000001bdbd4347b082d9d6bdf2da4555a37ce52a2e21200000000000000000000000000000000000000004c6869257205e20c2a43cb31345db534aecb49f6e0000000000000000000000000000000000000001d56fbe3294ea4d73cca99ff8751ce7bd9b688cd50000000000000000000000000000000000000002de8da1ee512529b6c61fe7c769affc160308dea20000000000000000000000000000000000000002e63727cb2b3a8d6e3a2d1df4990f441938b67a340000000000000000000000000000000000000001e7e2cb8c81c10ff191a73fe266788c9ce62ec7540000000000000000000000000000000000000001ec20607aa654d823dd01beb8780a44863c57ed070000000000000000000000000000000000000001ef46d5fe753c988606e6f703260d816af53b03eb0000000000000000000000000000000000000001f0245f6251bef9447a08766b9da2b07b28ad80b00000000000000000000000000000000000000003944dda079aaabbd432afd3945c7cb833e53d5354270c541e5584da76df63f80f70a48b7626da18c8e20aa42d66f885505fd8eb437902dd60ff9f7fe2ad0a98f900'),
'gasLimit': 28181624,
'gasUsed': 28177945,
'hash': HexBytes('0x1875e4ac4c411f574c2bd978d322fda61f8fe8fc38c3086be8adfdafd1a170d9'),
'logsBloom': HexBytes('0x0321840e0d840a0104802220e8319caa99ce5b11aa100f20be0b3a00f7193f229058128904a1962a8490d410336078410570c2840002e500300304900370b46b902a93ca9227643e83a64d29747d21e4881a12ee0116e0815953c4182905225311284a85a304afa132d92a10824039b4a4480cc91a4c1a35f04e7c32da9a3980c44381809c0810838d6842317a20042e0e0b359288a9040985499f4f80741058e3401052d284de220124003e098525d1d980187708900e86910a98e00882ebc6d1cb044a211b01960751b02aadae948458e502e00499a2183e3089028400200c085a88c00e8f00486803b0bc08220b36833cd8c9c5a88d41dca4ca4c061d2a6b'),
'miner': '0x0000000000000000000000000000000000000000',
'mixHash': HexBytes('0x0000000000000000000000000000000000000000000000000000000000000000'),
'nonce': HexBytes('0x0000000000000000'),
'number': 33120895,
'parentHash': HexBytes('0x6bcded47022aab58fef8c244baa3732e18d32049e625e4630d6b7bbb7700c5a3'),
'receiptsRoot': HexBytes('0x152c1299aba4561614efae47b3e46df736b3dd3ece28e24d69cf44c80e3480c1'),
'sha3Uncles': HexBytes('0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347'),
'size': 89672,
'stateRoot': HexBytes('0x5e23ead7387328a37bc3e1ffecb5e807ded753b7b9f4a540e833c0c0795ed4da'),
'timestamp': 1663212810,
'totalDifficulty': 498538611,
'transactions': [
HexBytes('0x11fe04834c9b0132c6097b5ea2c006494df3e3da0538a08d75bb1f8008d2a743'),
HexBytes('0x7d9be31c3fa6b8de4ed2ad5ef2d7bf981bf0920c5c580dc6132d2d4b4f8a378f'),
HexBytes('0x03b28d505671fb9ccd3cce71ee5f620bf6fc723bac97c26bca9f124b6bfeed2e'),
],
'uncles': []
}
)
トランザクションの中身を取得する
from web3 import Web3, HTTPProvider
from web3.middleware import geth_poa_middleware
# RPCに接続
web3 = Web3(Web3.HTTPProvider('https://rpc-mainnet.maticvigil.com/'))
# レイヤー2のブロックチェーンを使用する場合( BSCやPolygon )
web3.middleware_onion.inject(geth_poa_middleware, layer=0)
# トランザクションの中身を取得する
tx = web3.eth.get_transaction('0x11fe04834c9b0132c6097b5ea2c006494df3e3da0538a08d75bb1f8008d2a743')
print(tx)
AttributeDict(
{
'blockHash': HexBytes('0x1875e4ac4c411f574c2bd978d322fda61f8fe8fc38c3086be8adfdafd1a170d9'),
'blockNumber': 33120895,
'from': '0x8588b7ceCD39527Afb1447621Ad65c078e3f14De',
'gas': 350000,
'gasPrice': 500000000000,
'hash': HexBytes('0x11fe04834c9b0132c6097b5ea2c006494df3e3da0538a08d75bb1f8008d2a743'),
'input': '0xd8fb563d0000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000453972e3ece170780000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001600000000000000000000000008588b7cecd39527afb1447621ad65c078e3f14de0000000000000000000000000000000000000000000000000000000063229d3300000000000000000000000000000000000000000000000000000000000000010000000000000000000000004a35582a710e1f4b2030a3f826da20bfb6703c090000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000007ceb23fd6bc0add59e62ac25578270cff1b9f6190000000000000000000000008f3cf7ad23cd3cadbd9735aff958023239c6a063',
'nonce': 249418,
'to': '0x9a82b350a6a7E3342cc3095751ca98c8a903FB4F',
'transactionIndex': 0,
'value': 0,
'type': '0x0',
'v': 310,
'r': HexBytes('0x97aa44365c2a53485431bb6c8260a4d31e5b9bdd271ff97c1218408050ae3acf'),
's': HexBytes('0x3d5c5d02986b9a8ded003cd364293b8704d8e7595d8dce8ad8e0c67e37987d79')
}
)
Walletの残高を取得する
from web3 import Web3, HTTPProvider
from web3.middleware import geth_poa_middleware
# RPCに接続
web3 = Web3(Web3.HTTPProvider('https://rpc-mainnet.maticvigil.com/'))
# レイヤー2のブロックチェーンを使用する場合( BSCやPolygon )
web3.middleware_onion.inject(geth_poa_middleware, layer=0)
# ウォレット残高の取得
balance = web3.eth.getBalance(myWalletAddress)
# 単位をgweiからWeiに変換
result = web3.fromWei(balance, 'ether')
print(result)
これはネットワークトークンの場合のコードです。
コントラクトの呼び出し
ガバナンストークンの残高を取得する
ガバナンストークンの残高を取得する場合はコントラクトを呼び出す必要があります。
今回はQuickSwapで試してみる
準備する物
残高を取得したいトークンの「Contract ABI」下記をダウンロードでも可
残高を取得したいトークンのContractアドレス
Contractアドレス→0xB5C064F955D8e7F38fE0460C556a72987494eE17
from web3 import Web3, HTTPProvider
from web3.middleware import geth_poa_middleware
import json
# RPCに接続
web3 = Web3(Web3.HTTPProvider('https://rpc-mainnet.maticvigil.com/'))
# レイヤー2のブロックチェーンを使用する場合( BSCやPolygon )
web3.middleware_onion.inject(geth_poa_middleware, layer=0)
# QuickSwapTokenのコントラクトアドレス
contractAddress = '0xB5C064F955D8e7F38fE0460C556a72987494eE17'
# コントラクトを読み込む
with open('QuickSwap.json') as f:
abi = json.load(f)
contract = web3.eth.contract(address=contractAddress, abi=abi)
# コントラクトを呼び出す
balance = contract.functions.balanceOf(myWalletAddress).call()
# 単位をgweiからWeiに変換
result = web3.fromWei(balance, 'ether')
print(result)
これでコントラクトの呼び出し方が分かったので色々とできそうですね!