たまに自身のアドレスの一部をSNSに載せてしまう人がいます。興味本位でその人が他にどのような取引をしているのか調べたくても、部分的にしか分からないアドレスは検索が難しかったりします。限られた情報のなかからそのアドレスを探し当てる方法などを記載します。
下準備
- GethやNethermindを使ってイーサリアムのノード(全取引データ)をダウンロードする。セットアップ方法はこの記事に書いてます。Infuraなどのサードパーティを使って取引データを取得してもいいですが、通信制限にかかる可能性があるので自前のノードを用意した方が無難です。
- Pythonを使ってノードから情報を取ってくるのでPythonをインストールする。
- Web3をインストールする。
pip install web3
- 接続先のローカルIPアドレスを確認して下記のコードを実行し、Connected to ethereum execution nodeと出力されれば無事ノードと通信できてます。
from web3 import Web3
# Connect to your local geth instance
w3 = Web3(Web3.HTTPProvider("http://192.168.0.123:8545"))
# Check if connected
if w3.is_connected():
print("Connected to ethereum execution node.")
# Fetch the latest block number as an additional verification step
latest_block = w3.eth.block_number
print(f"Latest block number: {latest_block}")
else:
print("Not connected to ethereum execution node.")
「送信先アドレスの前後数文字」と「取引をしたざっくりとした時間」が分かる場合
from web3 import Web3
# Connect to your local geth instance
w3 = Web3(Web3.HTTPProvider("http://192.168.0.123:8545"))
start_block = 18346472
def find_transaction_with_address_pattern(
address_type=None, start_pattern=None, end_pattern=None, start_block=None
):
if address_type not in ["to", "from"]:
print("Invalid address_type. Please choose 'to' or 'from'.")
return
if start_block is None:
start_block = w3.eth.block_number
current_block = start_block
while current_block > 0:
print(f"Searching block {current_block}...")
block = w3.eth.get_block(current_block, True)
for transaction in block.transactions:
address = transaction.to if address_type == "to" else transaction["from"]
if address_type == "to":
# Check for standard token transfer
if transaction.to and transaction.data.startswith("0xa9059cbb"):
# print(f"transfer: {transaction.hash.hex()}")
token_to_address = "0x" + transaction.data[34:74]
if address_type == "to":
address = token_to_address
# Check for transferFrom token transfer
elif transaction.to and transaction.data.startswith("0x23b872dd"):
# print(f"transferToken: {transaction.hash.hex()}")
token_to_address = "0x" + transaction.data[98:138]
if address_type == "to":
address = token_to_address
if address:
address = address.lower()
start_pattern = start_pattern.lower()
end_pattern = end_pattern.lower()
if start_pattern and not address.startswith(start_pattern):
continue
if end_pattern and not address.endswith(end_pattern):
continue
print(
f"Found transaction {transaction.hash.hex()} in block {current_block} with {address_type} address {address}"
)
return
current_block -= 1
print("Transaction with desired pattern not found.")