Python プログラミング

web3ライブラリによるデータ取得

2023年7月21日

広告

この記事の内容

本記事では、Pythonのweb3ライブラリについて概要、その利用メリット、注意点、さらに取得可能な情報を種類別に分類して提供します。また、情報を実際に取得するためのPythonコードサンプルも示します。

ライブラリの説明

  1. Web3ライブラリは、Ethereum(イーサリアム)というブロックチェーンネットワークと対話するためのPythonライブラリです。
  2. このライブラリを使用すると、PythonからEthereumのネットワークにアクセスし、トランザクションを作成・送信したり、コントラクトを呼び出すことができます。
  3. Web3ライブラリはEthereumの普遍性と堅牢性を活用し、分散型アプリケーション(Dapps)を作成するための鍵となります。

使用するメリット

  1. ブロックチェーンと対話するための直感的なAPIを提供します。
  2. トランザクションの作成、署名、送信などの一連のプロセスをシンプルにします。
  3. Smart Contractの作成と使用を容易にします。
  4. Ethereumネットワークのブロックとトランザクションの詳細情報を取得できます。

使用する注意点

  1. Web3ライブラリを使用するにはEthereumノードへのアクセスが必要で、このためには専用のEthereumノードをセットアップするか、Infuraなどのサービスを使用します。
  2. Ethereumネットワークではガス料金(トランザクション手数料)が発生するので注意が必要です。
  3. Smart Contractの実行はブロックチェーン上で不可逆的なため、正確さとセキュリティを確保することが重要です。

web3ライブラリを利用して取得できる情報

web3ライブラリを使用することで、イーサリアムのブロックチェーンから以下の情報を取得することが可能です。

  1. ブロック情報:
    • ブロック番号: 現在のブロック番号を取得。
    • ブロック詳細: 特定のブロック番号を指定し、そのブロックに関する詳細情報(タイムスタンプ、取引数、マイナーなど)を取得。
  2. トランザクション情報:
    • トランザクション詳細: トランザクションのハッシュを指定し、そのトランザクションの詳細(送信者、受信者、金額、ガス代など)を取得。
    • トランザクションの受信/送信: 特定のアドレスから送られたまたは特定のアドレスに送られたトランザクションの一覧を取得。
  3. スマートコントラクト:
    • スマートコントラクトの情報: スマートコントラクトのアドレスを指定し、そのスマートコントラクトに関する詳細情報(コード、ABIなど)を取得。
    • スマートコントラクトの呼び出し: スマートコントラクトの関数を呼び出し、その結果を取得。例えば、ERC20トークンのスマートコントラクトの場合、特定のアドレスのトークンの残高を取得するための`balanceOf`関数を呼び出し。
  4. アカウント情報:
    • イーサリアム残高: 特定のアドレスのイーサリアム残高を取得。
    • トークン残高: 特定のERC20トークンの特定のアドレスの残高を取得。

Infuraとは

web3ライブラリを使うためにはノードに接続する必要があるのですが、自分で環境設定をするのは大変なようなので今回はInfuraというサービスを利用します。このサービスに関する概要は以下の通りです。

InfuraはEthereumやIPFSのノードとして機能するクラウドベースのサービスで、開発者がこれらのネットワークに簡単に接続できるようにします。具体的には、Web3ライブラリ(例えばPythonのweb3.py)を使用してInfuraのノードに接続することで、ブロックチェーンのデータにアクセスしたり、トランザクションを送信したりすることが可能になります。

Infuraを使用する目的

  • ブロックチェーンへの簡単なアクセス: 自分自身で全ノードを設定・維持することなく、EthereumやIPFSネットワークにアクセスすることが可能になります。
  • スケーラビリティ: 高トラフィックの状況でも、Infuraの強力なバックエンドが安定したサービスを提供します。

Infuraを使用するメリット

  • 簡単なセットアップ: Infuraに登録し、プロジェクトを作成するだけで、すぐにEthereumネットワークに接続できます。
  • メンテナンスフリー: 自分自身でノードを運用する場合、常に最新のブロックデータを保持するためのメンテナンスが必要ですが、Infuraを使用すればそのような作業は不要です。
  • 高速なデータ取得: Infuraは多数のノードを運用しており、高速にブロックチェーンのデータにアクセスできます。

Infuraを使用する際の注意点

  • 無料プランの制限: Infuraは無料プランでも利用可能ですが、リクエスト数には一定の制限があります。大量のデータを頻繁にリクエストする場合、有料プランにアップグレードする必要があります。
  • プライバシー: Infuraを通じて送信されるすべてのデータ(トランザクションデータ等)は、Infuraによって見られる可能性があります。機密情報を扱う場合は適切なセキュリティ対策が必要です。
  • 中央集権性: Infuraは一部のエンティティによって管理されており、その点でブロックチェーンの分散性とは異なる点を持っています。そのため、Infuraのサービスが停止した場合、アクセスが不可能になる可能性があります。

Pythonコードサンプル

実際にデータを取得するためのサンプルは下記のようになります。

※web3ライブラリはバージョンによって関数が変わります。
 この記事で使用しているコードはバージョン6.7.0に対応したコードとなるため注意してください。

  • ブロック情報:
    1. ブロック番号: 現在のブロック番号を取得することができます。
    2. ブロック詳細: 特定のブロック番号を指定して、そのブロックに関する詳細な情報(タイムスタンプ、取引数、マイナーなど)を取得することができます。
  • your_project_idはあなたがInfuraで作成したプロジェクトのIDに置き換えてください。
from web3 import Web3

# InfuraのプロジェクトIDを用いてEthereumネットワークに接続します
infura_url = 'https://mainnet.infura.io/v3/your_project_id'
web3 = Web3(Web3.HTTPProvider(infura_url))

# 現在のブロック番号を取得します
current_block_number = web3.eth.block_number
print(f'現在のブロック番号: {current_block_number}')

# 指定したブロック番号(ここでは現在のブロック番号)の詳細情報を取得します
block_detail = web3.eth.get_block(current_block_number)
print(f'ブロック詳細: {block_detail}')

このコードを使用する時はyour_project_idをあなたがInfuraで作成したプロジェクトのIDに置き換えてください。

  • トランザクション情報:
    1. トランザクション詳細: トランザクションのハッシュを指定して、そのトランザクションの詳細(送信者、受信者、金額、ガス代など)を取得することができます。
    2. トランザクションの受信/送信: 特定のアドレスから送られたまたは特定のアドレスに送られたトランザクションの一覧を取得することができます。
from web3 import Web3

# InfuraのプロジェクトIDを用いてEthereumネットワークに接続します
infura_url = 'https://mainnet.infura.io/v3/your_project_id'
web3 = Web3(Web3.HTTPProvider(infura_url))

# トランザクションハッシュを指定してトランザクションの詳細を取得します
transaction_hash = 'your_transaction_hash'
transaction_detail = web3.eth.get_transaction(transaction_hash)
print(f'トランザクション詳細: {transaction_detail}')

# 特定のアドレスから送られたトランザクションの数を取得します
address = 'your_ethereum_address'
transaction_count = web3.eth.get_transaction_count(address, 'pending')
print(f'トランザクション数(送信/受信): {transaction_count}')

このコードを使用するときは、'your_transaction_hash'を取得したいトランザクションのハッシュに、'your_ethereum_address'を確認したいEthereumのアドレスに置き換えてください。また、'your_project_id'はあなたがInfuraで作成したプロジェクトのIDに置き換えてください。

トランザクションの詳細情報には送信者のアドレス、受信者のアドレス、送信量、ガス価格、ガス使用量などが含まれます。トランザクションの詳細情報も辞書形式で返されるため、特定の情報を取得するには対応するキー(例えば'from'や'to'、'value'、'gas'、'gasPrice')を使用してアクセスします。

web3.eth.get_transaction_count(address, 'pending')関数は指定したアドレスが送信したトランザクションの数を返します。この数値はNonceとも呼ばれ、アドレスが行ったトランザクションの数を示す一意の識別子です。'pending'を指定することで、まだブロックに取り込まれていないトランザクションもカウントに含まれます。

  • スマートコントラクト:
    1. スマートコントラクトの情報: スマートコントラクトのアドレスを指定して、そのスマートコントラクトに関する詳細な情報(コード、ABIなど)を取得することができます。
      ※ABIは標準的なものを使用しているので必要に応じて変更する必要があります。
    2. スマートコントラクトの呼び出し: スマートコントラクトの関数を呼び出すことで、その結果を取得することができます。例えば、ERC20トークンのスマートコントラクトの場合、特定のアドレスのトークンの残高を取得するためのbalanceOf関数を呼び出すことができます。
from web3 import Web3
from eth_utils import to_checksum_address

# 接続先
infura_url = 'https://mainnet.infura.io/v3/your_project_id'
web3 = Web3(Web3.HTTPProvider(infura_url))

# ERC20 ABI
erc20_abi = [
    {
        "constant": True,
        "inputs": [{"name": "_owner", "type": "address"}],
        "name": "balanceOf",
        "outputs": [{"name": "balance", "type": "uint256"}],
        "payable": False,
        "type": "function"
    },
    {
        "constant": True,
        "inputs": [],
        "name": "name",
        "outputs": [{"name": "", "type": "string"}],
        "payable": False,
        "type": "function"
    }
]

# チェックサムアドレスへの変換
contract_address = to_checksum_address('0xYourContractAddress')

# コントラクトオブジェクトの作成
contract = web3.eth.contract(address=contract_address, abi=erc20_abi)

# 特定のアドレスのトークン残高を取得
address = to_checksum_address('0xYourAddress')
balance = contract.functions.balanceOf(address).call()
print(f'The balance of address {address} is {balance}.')

注意: 上記のコードは例ですので、'0xYourContractAddress', 'your_project_id', your_erc20_abi, および '0xYourAddress' を適切な値に置き換えてから実行してください。

このコードを使用すれば、スマートコントラクトから必要な情報を取得することができます。ただし、ABI (Application Binary Interface) は各スマートコントラクトによって異なります。この例ではERC20トークンのABIを使用していますが、使用しているスマートコントラクトによっては適切なABIを用いる必要があります。

  • アカウント情報:
    1. イーサリアム残高: 特定のアドレスのイーサリアム残高を取得することができます。
    2. トークン残高: 特定のERC20トークンの特定のアドレスの残高を取得することができます。
from web3 import Web3
from eth_utils import to_checksum_address, from_wei

infura_url = 'https://mainnet.infura.io/v3/your_project_id'
web3 = Web3(Web3.HTTPProvider(infura_url))

# ERC20 ABI
erc20_abi = [
    {
        "constant": True,
        "inputs": [{"name": "_owner", "type": "address"}],
        "name": "balanceOf",
        "outputs": [{"name": "balance", "type": "uint256"}],
        "payable": False,
        "type": "function"
    },
    {
        "constant": True,
        "inputs": [],
        "name": "name",
        "outputs": [{"name": "", "type": "string"}],
        "payable": False,
        "type": "function"
    }
]

# チェックサムアドレスへの変換
address = to_checksum_address('0xYourAddress')

# イーサリアム残高の取得
balance_wei = web3.eth.get_balance(address)
balance_eth = from_wei(balance_wei, 'ether')
print(f'アドレス {address} のイーサリアム残高: {balance_eth} ETH')

# ERC20トークン残高の取得
contract_address = to_checksum_address('0xYourContractAddress')
contract = web3.eth.contract(address=contract_address, abi=erc20_abi)

balance = contract.functions.balanceOf(address).call()
print(f'アドレス {address} のトークン残高: {balance} トークン')

以上のように、web3ライブラリを用いると、イーサリアムのブロックチェーンに格納されている様々な情報にアクセスすることが可能です。

-Python, プログラミング