web3.py は、Python で Ethereum などのブロックチェーンとインタラクトするための、人気のあるライブラリです。スマートコントラクトの呼び出し、トランザクションの送信、ブロックの取得など、様々な操作をPythonコードから実行できます。
https://web3py.readthedocs.io/en/stable/index.html
基本的な使い方
from web3 import Web3
# Infura のエンドポイントを指定 (ご自身のInfuraプロジェクトのURLに置き換えてください)
w3 =Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/YOUR_PROJECT_ID'))
# ネットワークに接続されているか確認
print(w3.isConnected())
# 最新のブロック番号を取得
latest_block = w3.eth.blockNumber
print(latest_block)
スマートコントラクトのソースコードからABIを取得します。
通常、JSON形式で記述されています。
Etherscanのcontractタブの下の方にあります。
abi = [
{
"inputs": [],
"name": "getData",
"outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}],
"stateMutability": "view",
"type": "function"
},
# ... その他の関数定義
]
コントラクトインスタンスの作成
# コントラクトアドレスを指定
contract_address = '0x...'
# コントラクトインスタンスを作成
contract = w3.eth.contract(address=contract_address, abi=abi)
関数の呼び出し
# ビュー関数 (状態を変更しない関数) の呼び出し
result = contract.functions.getData().call()
print(result)
# トランザクションを送信する関数 (状態を変更する関数) の呼び出し
tx_hash = contract.functions.setData(42).transact({'from': '0x...'})
トランザクションの送信
# アカウントのアンロック (私キーが必要)
w3.eth.account.enable_unsecured_mode()
account = w3.eth.account.from_key('YOUR_PRIVATE_KEY')
# トランザクションを送信
tx_hash = contract.functions.setData(42).transact({'from': account.address})
# トランザクションのレシートを取得
tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
RPCを利用することでノードを立てたりせずに簡単にコントラクトから情報を読み取ったり、その結果を読み取ってトランザクションを送信し、取引を行なうことができます。今後は実際にUniswapなどでETH-USDCのスワップを行なったり、実質的な指値注文を実行する手順や、Coincheckやbitflyerなどで価格情報を読み取り、注文を出すことでmarketmaking botやアービトラージなどを予定しています。
