Read and Write Contract

web3.py を使った Web3 開発基礎

web3.py とは?

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 (Application Binary Interface) の準備

  • スマートコントラクトのソースコードから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やアービトラージなどを予定しています。