【Python】Web3.pyを使ってウォレットを操作する(Part1)
はじめに
この記事では、PythonのWeb3.pyライブラリを使って、ウォレットの作成や残高の確認など、ウォレット操作の基本を解説します。Ethereumを例にしていますが、BSCやPolygonなど他のEVM互換チェーンにも応用できます。
1.ウォレット
ウォレットは、プライベートキーとパブリックキーのペアを持ち、ブロックチェーン上の資産を管理するためのものです。この記事では、Pythonを使ってウォレットの生成や管理を行います。
EVM互換チェーンでのウォレットアドレスは共通
Ethereum、Polygon、Binance Smart Chain(BSC)などのEVM互換チェーンでは、ウォレットアドレスはすべて共通です。これは、これらのチェーンが同じアドレス生成アルゴリズムを採用しているためです。
EVM互換チェーン: Ethereum、Polygon、BSCなど、Ethereum Virtual Machineを使用するチェーン
共通アドレスのメリット: 一度作成したウォレットは、EVM互換のどのチェーンでも利用可能です。例えば、Ethereum上のアドレスがPolygonでも同じものとして使えます。
ただし、アドレスは共通でも、各チェーンごとに管理される資産は異なります。Ethereum上のETHやトークンと、Polygon上のMATICやトークンは独立して管理されるため、それぞれのチェーンで異なる資産を扱います。
2.Pythonでウォレットを作成する
PythonとWeb3.pyを使って新しいウォレットを作成する方法を紹介します。
from web3 import Web3
# Web3インスタンスの作成
client = Web3()
# 新しいウォレットを作成
account = client.eth.account.create()
# ウォレットのアドレスと秘密鍵を表示
print(f"Address: {account.address}")
print(f"Private Key: {account.privateKey.hex()}")
説明: このコードは、新しいウォレットを生成し、アドレスと秘密鍵を出力します。生成されたアドレスは、Ethereum、Polygon、BSCなど、EVM互換チェーンで使用可能です。秘密鍵は安全に保管してください。
MetaMaskなどにインポートして確認する方法
作成したウォレットアドレスは、MetaMaskなどのウォレットアプリにインポートして利用できます。MetaMaskのアカウントのインポートを選択し、生成した秘密鍵を入力することでウォレットをインポートすることができます。
3.通貨とトークンにおける最小単位とdecimalの扱いについて
EthereumやPolygon、BSCなどのEVM互換チェーンにおいて、基軸通貨やトークンの最小単位はdecimalという仕組みで扱われています。Ethereumの最小単位が「Wei」であるように、すべてのトークンや通貨には、どれくらいの小数点以下を扱えるかを決める「decimal」というフィールドが存在します。
基軸通貨の場合:EthereumやBSCの基軸通貨は、通常18桁のdecimalを持ち、1 ETHや1 BNBが10^18 Weiに相当します。
トークンの場合: ERC-20やBEP-20トークンも同様にdecimalを持ち、トークンごとにその桁数が異なります。例えば、USDCは6桁、DAIは18桁です。
Pythonでのdecimal変換
from web3 import Web3
# 1 ETH(またはMATIC, BNBなど)を最小単位に変換(decimal: 18)
amount_in_wei = Web3.toWei(1, 'ether') # 1 ETH -> 10^18 Weiに相当
print(f"1 ETH (or similar) is {amount_in_wei} in smallest units")
# 最小単位をETHなどの通貨に変換
amount_in_ether = Web3.fromWei(amount_in_wei, 'ether')
print(f"{amount_in_wei} in smallest units is {amount_in_ether} ETH (or similar)")
説明: このコードは、1 ETH(またはMATIC、BNBなどの基軸通貨)を最小単位に変換し、decimal(18桁)の精度で扱う方法を示しています。基軸通貨のdecimalは18で統一されており、他のEVM互換チェーンでも同じ変換が適用されます。
4.ウォレットの残高を確認する
次に、ウォレットのアドレスを使って、基軸通貨(ETHやMATICなど)の残高を確認する方法です。getBalanceメソッドで取得できます。
address = 'ウォレットアドレス'
# 残高の取得(ETHの単位はWeiなので、Etherに変換する)
balance_wei = client.eth.getBalance(address)
balance = client.fromWei(balance, 'ether')
print(f"Balance: {balance} ETH")
5.既存のウォレットを使用する
既存のウォレットを使用する方法です。秘密鍵を利用しますので取り扱いは注意してください。秘密鍵が漏洩すると第三者に資産を抜かれてしまいます。
# 既存のウォレットの秘密鍵を使ってアカウントをインポート
private_key = '既存ウォレットの秘密鍵'
account = client.eth.account.privateKeyToAccount(private_key)
# インポートしたアカウントのアドレスを表示
print(f"Imported Address: {account.address}")
まとめ
この記事では、Web3.pyを使ってPythonからウォレットを操作する基本的な方法を解説しました。EVM互換チェーンでは、同じアドレスを複数のチェーンで使用できるという特性を活用して、さまざまなチェーンで同じウォレットを管理できます。
また、Pythonで生成したウォレットは、MetaMaskなどのウォレットアプリにもインポートして使用できるため、さまざまな環境で同じアドレスを確認することが可能です。